51单片机按键扫描程序汇编程序(独立按键与矩阵按键)(使用定时器)(可移植的汇编程序)矩阵键盘控制两个led数码管(汇编语言)与UART通信总结(上)
一,按键控制数码管
1四按键控制程序(汇编)
(您的关注点赞是作者创作的最大动力哦)
//******************************************************* //题目:独立四键控制事件(按键分为有锁存和无锁存) //语言:汇编语言(51MCU) //功能:任意独立按键控制(带扫描式的) //优点:中间有20ms延时函数消抖;可以扩展任意个按键;可移植 // 含扫描按键所有操作; //作者: 梦 //提醒: 记得点赞哦!!!!! //转载要著名出处,原创不易!!! //******************************************************* K1 BIT P3.1 K2 BIT P3.0 K3 BIT P3.2 K4 BIT P3.4 LED EQU P2 KEY EQU P3 ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV LED ,#0FFHMOV P0,#0FFHCLR RS1CLR RS0 //调用第0组寄存器 KLOOP:SETB K1 //先置高,再检测低SETB K2SETB K3SETB K4JB K1, KT1MOV A, #11HACALL DELAY200MS //消除抖动AJMP TRS1 KT1:JB K2, KT2MOV A, #22HACALL DELAY200MS //消除抖动AJMP TRS1 KT2:JB K3, KT3MOV A, #44HACALL DELAY200MS //消除抖动AJMP TRS1KT3:JB K1, KLOOPMOV A, #88HACALL DELAY200MS //消除抖动 TRS1:JB K1, KT1_TMOV A, #11H;CPL A;MOV LED,A;JNB K1,$ //无锁存AJMP CONVERS_T KT1_T:JB K2, KT2_TMOV A, #22H;CPL A;MOV LED,A;JNB K2,$ //无锁存AJMP CONVERS_T KT2_T:JB K3, KT3_TMOV A, #44H;CPL A;MOV LED,A;JNB K3,$ //无锁存AJMP CONVERS_T KT3_T:JB K4, KLOOPMOV A, #88HCONVERS_T:;MOV A,#00H //无锁存CPL AMOV LED,A LJMP KLOOPDELAY200MS: ;误差 0usSETB RS1SETB RS0 //调用第3组寄存器MOV R7,#43H DL1:MOV R6,#8EH DL0:MOV R5,#09HDJNZ R5,$DJNZ R6,DL0DJNZ R7,DL1CLR RS1CLR RS0 //调用第0组寄存器RET END
2矩阵键盘(4X4)按键控制程序(汇编)控制led数码管1个
//******************************************************* //题目:4X4矩阵键盘控制LED数码管(按键分为有锁存和(隔离的为)无锁存) //语言:汇编语言(51MCU) //功能:任意独立按键控制(带扫描式的) //优点:中间有20ms延时函数消抖;两种扫描方式其中定时器扫描很大程度优化CPU;可移植 // 含扫描按键所有操作; //矩阵键盘目前扫描方法:(1)程序扫描(本程序) (2)定时器扫描(本程序也有) (3)中断扫描(51中断固定不能实现) //作者: 梦 //提醒: 记得点赞哦!!!!! //转载要著名出处,原创不易!!! //******************************************************* KEY EQU P1 //程序扫描 但由于大部分CPU在扫描键盘,当要显示两个数码管值显然做不到 LED EQU P0 //按键控制一个数码管(数码管带锁存芯片) KEY1 EQU P2.0 KEY4 EQU P2.4 ORG 0000HAJMP MAIN ORG 0030H MOV 30H,#00H MOV 31H,#00H ORG 0035H MAIN:CLR RS0CLR RS1 //使用寄存器组0 START: MOV KEY, #11110000B //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化)MOV A, KEY //读按键值, XRL A, #11110000BJNZ KEY_ENA;CJNE A, #00H,KEY_ENA //两种处理办法;AJMP STARTAJMP START KEY_ENA:ACALL DELAY200MSMOV KEY,#11110000B //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化)MOV A,KEY //读按键值, XRL A, #11110000BJNZ KEY_ENB;CJNE A, #00H,KEY_ENB //两种处理办法;AJMP STARTAJMP START KEY_ENB: KEY111: //扫描第一列MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的JB KEY.0,KEY5MOV A, #1AJMP CONVER KEY5: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的JB KEY.1,KEY9MOV A, #5AJMP CONVER KEY9: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的JB KEY.2,KEY13MOV A, #9AJMP CONVER KEY13: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的JB KEY.3,KEY22MOV A, #13AJMP CONVER KEY22: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的JB KEY.0,KEY6MOV A, #2AJMP CONVER KEY6: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的JB KEY.1,KEY10MOV A, #6AJMP CONVER KEY10:MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的JB KEY.2,KEY14MOV A, #10AJMP CONVER KEY14:MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的JB KEY.3,KEY33MOV A, #14AJMP CONVER KEY33: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的JB KEY.0,KEY7MOV A, #3AJMP CONVER KEY7: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的JB KEY.1,KEY11MOV A, #7AJMP CONVER KEY11:MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的JB KEY.2,KEY15MOV A, #11AJMP CONVER KEY15: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的JB KEY.3,KEY44MOV A, #15AJMP CONVER KEY44:MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的JB KEY.0,KEY8MOV A, #4AJMP CONVER KEY8: MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的JB KEY.1,KEY12MOV A, #8AJMP CONVER KEY12:MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的JB KEY.2,KEY16MOV A, #12AJMP CONVER KEY16:MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的JB KEY.3,KEY_BACKMOV A, #16AJMP CONVER KEY_BACK: AJMP START CONVER: //一般都会吧二进制转10进制 就是把得到数据A(1-16)看成 个数MOV B,#10DIV ABMOV 30H,A//存储高位MOV A,BMOV 31H,A//存储低位MOV DPTR,#TABLE_CCMOV A,31HMOVC A, @A+DPTRCLR KEY1MOV LED, A AJMP START TABLE_CC:DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f DELAY200MS: ;误差 0usSETB RS0SETB RS1 //使用寄存器组3MOV R7,#43H DL1:MOV R6,#8EH DL0:MOV R5,#09HDJNZ R5,$DJNZ R6,DL0DJNZ R7,DL1CLR RS0CLR RS1 //使用寄存器组0RETEND
3矩阵键盘(4X4)汇编语言控制多个数码管,使用定时器扫描,数码管不带锁存芯片
//******************************************************* //题目:4X4矩阵键盘控制LED数码管(按键分为有锁存和(隔离的为)无锁存) //语言:汇编语言(51MCU) //功能:任意独立按键控制(带扫描式的) //优点:中间有20ms延时函数消抖;两种扫描方式其中定时器扫描很大程度优化CPU;可移植 // 含扫描按键所有操作; //矩阵键盘目前扫描方法:(1)程序扫描(本程序也有) (2)定时器扫描(本程序) (3)中断扫描(51中断固定不能实现) //作者: 梦 //提醒: 记得点赞哦!!!!! //转载要著名出处,原创不易!!! //******************************************************* KEY EQU P1 //定时器扫描 设置定时时常,中断读键盘是否按下,按下得到输出标志,得到提示,然后在主函数提示扫描键盘 LED EQU P0 //其他时间显示键盘控制两个数码管(数码管不带锁存芯片) LED1 EQU P2.0 LED2 EQU P2.4//KEY为矩阵键盘 LED1为数码管1公共端,LED2为数码管2公共端,LED为数码管(这里共阴) ORG 0000H AJMP MAIN ORG 000BH AJMP INI_T0 //定时器中断 ORG 0030H MOV 30H,#00H //存高位 MOV 31H,#00H //存低位 MOV 32H,#00H //00表示没有键盘按下,01表示有键盘按下 ORG 0035H MAIN:CLR RS0CLR RS1 //使用寄存器组0MOV TMOD,#01HMOV TH0,#0F0HMOV TL0,#60HSETB EASETB ET0SETB TR0//定时器初始化20MS扫描 //------------------------ DISPLAY:MOV DPTR,#TABLE_CCMOV R1,#30HMOV A,@R1MOVC A, @A+DPTRCLR LED1SETB LED2MOV LED, A ACALL DELAY1MS//ACALL DELAY50US //个位ms级别扫描稳定MOV R1,#31HMOV A,@R1MOVC A, @A+DPTRCLR LED2SETB LED1MOV LED, A ACALL DELAY1MS// ACALL DELAY50USMOV R1,#32HMOV A,@R1CJNE A,#01H,KEY_FIRST //初次判断没有按键按下ACALL KEY_BOARD KEY_FIRST:AJMP DISPLAY//--------------------------------- INI_T0:MOV KEY, #11110000B //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化)MOV A, KEY //读按键值, XRL A, #11110000BJNZ KEY_EN00AJMP initT0_END KEY_EN00: MOV R1,#32HMOV @R1,#01H //传递主函数标志 initT0_END:MOV TH0,#0F0HMOV TL0,#60HRETI//-------------------------- KEY_BOARD:ACALL DELAY200MSMOV KEY,#11110000B //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化)MOV A,KEY //读按键值, XRL A, #11110000BJNZ KEY_ENB;CJNE A, #00H,KEY_ENB //两种处理办法;AJMP STARTAJMP BACK //------- KEY_ENB: KEY111: //扫描第一列MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的JB KEY.0,KEY5MOV A, #1AJMP CONVER KEY5: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的JB KEY.1,KEY9MOV A, #5AJMP CONVER KEY9: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的JB KEY.2,KEY13MOV A, #9AJMP CONVER KEY13: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的JB KEY.3,KEY22MOV A, #13AJMP CONVER KEY22: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的JB KEY.0,KEY6MOV A, #2AJMP CONVER KEY6: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的JB KEY.1,KEY10MOV A, #6AJMP CONVER KEY10: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的JB KEY.2,KEY14MOV A, #10AJMP CONVER KEY14: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的JB KEY.3,KEY33MOV A, #14AJMP CONVER KEY33: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的JB KEY.0,KEY7MOV A, #3AJMP CONVER KEY7: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的JB KEY.1,KEY11MOV A, #7AJMP CONVER KEY11: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的JB KEY.2,KEY15MOV A, #11AJMP CONVER KEY15: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的JB KEY.3,KEY44MOV A, #15AJMP CONVER KEY44: MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的JB KEY.0,KEY8MOV A, #4AJMP CONVER KEY8: MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的JB KEY.1,KEY12MOV A, #8AJMP CONVER KEY12: MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的JB KEY.2,KEY16MOV A, #12AJMP CONVER KEY16: MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的JB KEY.3,BACKMOV A, #16AJMP CONVER KEY_BACK: //AJMP START CONVER: //一般都会吧二进制转10进制 就是把得到数据A(1-16)看成 个数MOV B,#10DIV ABMOV R1,#30HMOV @R1, A//存储高位MOV A,BMOV R1,#31HMOV @R1,A //存储低位 BACK: MOV R1,#32HMOV @R1,#00HRET TABLE_CC:DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //共阴(0-9)DELAY1MS: ;误差 0usSETB RS0SETB RS1 //使用寄存器组3MOV R7,#01H DL11:MOV R6,#8EH DL00:MOV R5,#02HDJNZ R5,$DJNZ R6,DL00DJNZ R7,DL11CLR RS0CLR RS1 //使用寄存器组0 RET DELAY200MS: ;误差 0usSETB RS0SETB RS1 //使用寄存器组3MOV R7,#43H DL1:MOV R6,#8EH DL0:MOV R5,#09HDJNZ R5,$DJNZ R6,DL0DJNZ R7,DL1CLR RS0CLR RS1 //使用寄存器组0RET DELAY50US: ;误差 0usMOV R6,#01H DL05:MOV R5,#16HDJNZ R5,$DJNZ R6,DL05RET END
4效果图 (您的关注点赞是作者创作的最大动力哦)
二,UART通信
基础知识:CPU与外界交换的信息称为通信。通信分为并行通信(速度快,连接复杂)和串行通信(速度相对慢)。
串行通信又分为异步通信(需要每发送一个字节要验证UART)和同步通信(无需校验位,只要时钟脉冲约定典型iic,spi)。
UART为全双工串口。
80C51串行口是一个可编程、全双工的串行口,它由两个独立的发送器和接收器构成,通过设置SCON、PCON这两个寄存器来控制串行口的工作方式和波特率。
发送器可以自动将CPU放入到发送缓冲器中的数据,完成并/串转换(以后的如果深学的化,有模拟iic通信,就有串并转换代码),从TXD(P3.1)引脚串行输出;接收器可以自动将数据从RXD(P3.0)引脚串行输入,完成串/并转换,送入接收缓冲器,由CPU取走。发送缓冲器与接收缓冲器,物理上是独立的,可由CPU直接访问。对于发送缓冲器来说,它只能写入而不能读出数据;对于接收缓冲器来说,它只能读出而不能写入数据,因此赋予两个缓冲器同一个名称(SBUF)和地址(99H)。CPU对SBUF执行写操作,就是将数据写入发送缓冲器;对SBUF执行读操作,就是读出接收缓冲器的内容。1.串行口控制寄存器SCON和PCON
STC89C52系列单片机的串行口设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON。
SCON :串行控制寄存器(可位寻址)
SMO/FE:当PCON寄存器中的SMODO/PCON.6位为1时,该位用于帧错误检测。当检测到一个无效停止位时,通过UART接收器设置该位。它必须由软件清零。
当PCON寄存器中的SMOD0/PCON.6位为0时,该位和SM1一起指定串行通信的工作方式,如下表所示。
其中SM0,SM1按下列组合确定串行口的工作方式:当单片机工作在12T模式时,定时器1的溢出率=SYSclk/12/( 256-T HI);当单片机工作在6T模式时,定时器1的溢出率=SYSclk / 6/ ( 256-T HI)(注意SMOD为1为小分频,加倍效果)
(方式0又叫同步移位串行方式)
多机通
目录
一,按键控制数码管
1四按键控制程序(汇编)
(您的关注点赞是作者创作的最大动力哦)
2矩阵键盘(4X4)按键控制程序(汇编)控制led数码管1个
3矩阵键盘(4X4)汇编语言控制多个数码管,使用定时器扫描,数码管不带锁存芯片
4效果图 (您的关注点赞是作者创作的最大动力哦)
二,UART通信
1.串行口控制寄存器SCON和PCON
STC89C52系列单片机的串行口设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON。 SCON :串行控制寄存器(可位寻址)
电源控制寄存器PCON(不可位寻址)
波特率
信SM2功能
- REN:接收允许位。由软件置位或复位。REN=0,则禁止串行口接收;若REN=1,则允许串行口接收。
- TB8:发送数据的第9位,用于在方式2和方式3时存放发送数据的第9位。TB8由软件置位或复位。在方式0和方式1中,该位未使用。
- RB8:接收数据的第9位。用于在方式2和方式3时存放接收数据的第9位。在方式1下,若SM2=0,则RB8用于存放接收到的停止位;对于方式0,该位未使用。
- TI:发送中断请求标志位。用于指示一帧数据是否发送完。在方式0下,发送器发送完第8位数据时,TI由内部硬件自动置1,向主机请求中断,响应后软件清零;在其他方式下,TI在发送器开始发送停止位时置1。当TI=1时,向CPU请求中断,CPU响应中断后,必须由软件清零。
- RI:接收中断请求标志位。用于指示一帧数据是否接收完。在方式0下,RI在接收器接收到第8位数据时由内部硬件自动置1向主机请求中断,响应后软件清零;在其他方式下,RI在接收器接收到停止位的中间时刻由内部硬件自动置1。当RI=1时,向CPU请求中断,CPU响应中断后,必须由软件清零。
电源控制寄存器PCON(不可位寻址)
(复位值为0,SMOD=1控制加倍 PCON.6前面已讲到)
波特率
在串行通信中,常用波特率表征数据传输的速度。波特率用每秒钟传送二进制数码的位数来表示,单位为位/秒(b/s)。例如:传送的速率为120字符/秒,而每个字符又包含10位(1位起始位,7位数据位,1位奇偶校验位,1位停止位),则波特率为:120字符/秒×10位/字符=1200位/秒在串行通信中,发送端与接收端必须按照约定的数据帧格式及比特率进行通信,这样才能成功地传输数据。异步通信的重要指标:字符帧格式和波特率
波特率因子
在波特率指定后,输入移位寄存器/输出移位寄存器在接收时钟/发送时钟控制下,按指定的波特率速度进行移位。一般几个时钟脉冲移位一次。要求:接收时钟/发送时钟是波特率的16、32或64倍。波特率因子就是发送/接收1个数据(1个数据位)所需要的时钟脉冲个数,其单位是个/位。如波特率因子为16,则16个时钟脉冲移位1次。 例:波特率=9600bps,波特率因子=32,则 接收时钟和发送时钟频率=9600×32=297200Hz。
51单片机按键扫描程序汇编程序(独立按键与矩阵按键)(使用定时器)(可移植的汇编程序)矩阵键盘控制两个led数码管(汇编语言)与UART通信总结(上)相关推荐
- 独立按键扫描程序的思考(整合两种算法)
摘自:http://blog.csdn.net/xuechaojie/article/details/6761772 网上看到Etual 2008年总结的<新型按键扫描>的博文,很有感触. ...
- STC单片机按键扫描程序
STC单片机按键扫描程序 最近在做一个电子秤相关项目,使用STC系列单片机作为主控芯片,项目第一阶段直接使用IAP15W4K58S4驱动两个矩阵键盘,一切调试顺利,在项目即将结束时老板要求使用另一块单 ...
- 新型的按键扫描程序,仅三行程序(amo)
新型的按键扫描程序 不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉.我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入 ...
- 【按键】短按,长按,按键释放,三种模式的按键扫描程序(软件消抖动)
先来说一下这三种模式的意思: 1. 短按模式:单击按键时,返回一次有效按键值:长按时也只返回一次有效按键值.这样可以有效地排除因不小心长按带来的返回多次有效按键,进而执行多次按键处理程序. 2. 长按 ...
- 原子哥的STM32视频,我发现他们都看不懂原子哥里面按键扫描程序
近身边的很多同学都在学习原子哥的STM32视频,我发现他们都看不懂原子哥里面按键扫描程序.由于问的人多,所以我也写了个心得,分享一下,老鸟别喷我哈.先贴上代码吧: //返回值: //0,没有任何按键按 ...
- 51单片机+L298驱动步进电机+L297测速+LCD1602显示+按键调试+Proteus仿真
51单片机+L298驱动步进电机+L297测速+LCD1602显示+按键调试+Proteus仿真 *Proteus仿真 L298N是双H桥式驱动器. L297是步进电机控制集成芯片(包括环形分配器), ...
- 【按键】短按,长按,按键释放,三种模式的按键扫描程序(软件消抖动)--- 矩阵键盘
请先阅读上篇: 短按,长按,按键释放,三种模式的按键扫描程序(软件消抖动) 上面的程序适用于单个按键,那是不是也可以适用于矩阵键盘呢? 答案是肯定的. 接下来在这里做一个简单的扩展,具体框架不用改变, ...
- 《ESP8266学习笔记》之 采用定时器内的按键扫描方法,摒弃传统的延时按键消抖
简介:传统的按键扫描程序,大部分都是采用 delay_ms(5); 这样的语句来进行按键消抖,但当你把它放在你高速运行的程序中时,这5ms可能会拖慢你的成语运行,导致体验感受下降,因此,我便找到了新的 ...
- 51单片机c语言程序执行顺序,51单片机程序执行流程详细分析
这里是一个循环,根据DJNZ指令的功能:每执行一次DJNZ RO, IDATALOOP就将R0的值减1,若R0的值不为0则就跳到IDATALOOP地址去.很显然这是一个循环,那么RO的值是多少呢,在以 ...
最新文章
- joyui版本和android版本,JOYUI 11内测版正式推送,黑鲨游戏手机体验大幅升级
- python抓取html中特定的数据库,Python抓取网页中内容,正则分析后存入mysql数据库...
- P1855 榨取kkksc03
- 不同文件实现登录功能的数据驱动测试
- 云计算正在“抹杀”开源?
- 微信生成专属海报(专属二维码)
- 2016/03/30
- 3.30华为笔试第三题
- Head First 设计模式
- adb刷入第三方recovery_PE Plus类原生系统刷入教程(小白基础篇)
- linux工具消失了,输入法工具栏为什么不见了?
- 切身体验的优秀时间管理法——番茄时间工作法!
- MS Office/Visio 2003 sp1 下载
- vbs代码未结束的字符串常量
- [工具推荐]截图工具 -- snipaste
- html在抽奖图片自动效果图,jQuery实现图片随机切换、抽奖功能(实例代码)
- confluence 空间复制
- F-One融资B轮,企业绩效管理与分析服务再升级!
- Java小白修炼手册--第二阶段Java SE--IO流
- 谷歌cloud_Google Cloud如何为您的应用程序安全提供帮助?