51单片机按键扫描程序汇编程序(独立按键与矩阵按键)(使用定时器)(可移植的汇编程序)矩阵键盘控制两个led数码管(汇编语言)与UART通信总结(上)

本文详细介绍了51单片机上的按键控制和UART通信原理及应用。包括独立按键与矩阵键盘的控制程序,以及UART通信的基础知识、控制寄存器的功能介绍等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,按键控制数码管 

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 ,#0FFH
    MOV P0,#0FFH
    CLR RS1
    CLR RS0    //调用第0组寄存器
KLOOP:
    SETB K1    //先置高,再检测低
    SETB K2
    SETB K3
    SETB K4
    JB K1, KT1
    MOV  A, #11H
    ACALL DELAY200MS  //消除抖动
    AJMP TRS1
KT1:JB K2, KT2
    MOV  A, #22H
    ACALL DELAY200MS  //消除抖动
    AJMP TRS1
KT2:JB K3, KT3
    MOV  A, #44H
    ACALL DELAY200MS  //消除抖动
    AJMP TRS1
    
KT3:JB K1, KLOOP
    MOV  A, #88H
    ACALL DELAY200MS  //消除抖动    
    
TRS1:
    JB K1, KT1_T
    MOV  A, #11H
    ;CPL A
    ;MOV LED,A
    ;JNB K1,$     //无锁存
    AJMP CONVERS_T
KT1_T:JB K2, KT2_T
    MOV  A, #22H
    ;CPL A
    ;MOV LED,A
    ;JNB K2,$     //无锁存
    AJMP CONVERS_T
KT2_T:JB K3, KT3_T
    MOV  A, #44H
    ;CPL A
    ;MOV LED,A
    ;JNB K3,$       //无锁存
    AJMP CONVERS_T    
KT3_T:JB K4, KLOOP
    MOV  A, #88H
    
CONVERS_T:
    ;MOV A,#00H  //无锁存
    CPL A
    MOV LED,A
LJMP KLOOP
    
DELAY200MS:   ;误差 0us
    SETB RS1
    SETB RS0  //调用第3组寄存器
    MOV R7,#43H
DL1:
    MOV R6,#8EH
DL0:
    MOV R5,#09H
    DJNZ R5,$
    DJNZ R6,DL0
    DJNZ R7,DL1
    CLR RS1
    CLR 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 0000H
   AJMP MAIN
ORG 0030H
MOV 30H,#00H
MOV 31H,#00H
ORG 0035H
MAIN:
        CLR   RS0
	    CLR   RS1   //使用寄存器组0
START: 
      MOV   KEY,  #11110000B    //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化)
      MOV   A,  KEY      //读按键值, 
      XRL   A,    #11110000B
      JNZ   KEY_ENA
	  ;CJNE A, #00H,KEY_ENA  //两种处理办法
	  ;AJMP START
	  AJMP  START
KEY_ENA:
      ACALL DELAY200MS
	  MOV   KEY,#11110000B    //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化)
      MOV   A,KEY      //读按键值, 
      XRL   A, #11110000B
      JNZ   KEY_ENB
	  ;CJNE A, #00H,KEY_ENB  //两种处理办法
	  ;AJMP START
	  AJMP  START
KEY_ENB:
KEY111:     //扫描第一列
      MOV   KEY,#11101111B   //在第一列中如果按下那么低四位肯定有为0的
	  JB    KEY.0,KEY5
	  MOV   A, #1
	  AJMP  CONVER
KEY5: MOV   KEY,#11101111B   //在第一列中如果按下那么低四位肯定有为0的
	  JB    KEY.1,KEY9
	  MOV   A, #5
	  AJMP  CONVER
KEY9: MOV   KEY,#11101111B   //在第一列中如果按下那么低四位肯定有为0的
	  JB    KEY.2,KEY13
	  MOV   A, #9
	  AJMP  CONVER
KEY13: MOV  KEY,#11101111B   //在第一列中如果按下那么低四位肯定有为0的
	  JB    KEY.3,KEY22
	  MOV   A, #13
	  AJMP  CONVER
KEY22: MOV  KEY,#11011111B   //在第2列中如果按下那么低四位肯定有为0的
	  JB    KEY.0,KEY6
	  MOV   A, #2
	  AJMP  CONVER
KEY6: MOV   KEY,#11011111B   //在第2列中如果按下那么低四位肯定有为0的
	  JB    KEY.1,KEY10
	  MOV   A, #6
	  AJMP  CONVER
KEY10:MOV   KEY,#11011111B   //在第2列中如果按下那么低四位肯定有为0的
	  JB    KEY.2,KEY14
	  MOV   A, #10
	  AJMP  CONVER
KEY14:MOV   KEY,#11011111B   //在第2列中如果按下那么低四位肯定有为0的
	  JB    KEY.3,KEY33
	  MOV   A, #14
	  AJMP  CONVER
KEY33: MOV  KEY,#10111111B   //在第3列中如果按下那么低四位肯定有为0的
	  JB    KEY.0,KEY7
	  MOV   A, #3
	  AJMP  CONVER
KEY7: MOV   KEY,#10111111B   //在第3列中如果按下那么低四位肯定有为0的
	  JB    KEY.1,KEY11
	  MOV   A, #7
	  AJMP  CONVER
KEY11:MOV  KEY,#10111111B   //在第3列中如果按下那么低四位肯定有为0的
	  JB    KEY.2,KEY15
	  MOV   A, #11
	  AJMP  CONVER
KEY15: MOV  KEY,#10111111B   //在第3列中如果按下那么低四位肯定有为0的
	  JB    KEY.3,KEY44
	  MOV   A, #15
	  AJMP  CONVER
KEY44:MOV   KEY,#01111111B   //在第4列中如果按下那么低四位肯定有为0的
	  JB    KEY.0,KEY8
	  MOV   A, #4
	  AJMP  CONVER
KEY8: MOV   KEY,#01111111B   //在第4列中如果按下那么低四位肯定有为0的
	  JB    KEY.1,KEY12
	  MOV   A, #8
	  AJMP  CONVER
KEY12:MOV   KEY,#01111111B   //在第4列中如果按下那么低四位肯定有为0的
	  JB    KEY.2,KEY16
	  MOV   A, #12
	  AJMP  CONVER
KEY16:MOV   KEY,#01111111B   //在第4列中如果按下那么低四位肯定有为0的
	  JB    KEY.3,KEY_BACK
	  MOV   A, #16
	  AJMP  CONVER
KEY_BACK:  AJMP START
CONVER:  //一般都会吧二进制转10进制  就是把得到数据A(1-16)看成 个数
      MOV  B,#10
	  DIV  AB
	  MOV  30H,A//存储高位
	  MOV  A,B
	  MOV  31H,A//存储低位
	  
	  MOV  DPTR,#TABLE_CC
	  MOV  A,31H
	  MOVC A, @A+DPTR
	  CLR   KEY1
	  MOV   LED, A  
	 AJMP START
TABLE_CC:DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f 

DELAY200MS:   ;误差 0us
    SETB RS0
	SETB RS1     //使用寄存器组3
    MOV R7,#43H
DL1:
    MOV R6,#8EH
DL0:
    MOV R5,#09H
    DJNZ R5,$
    DJNZ R6,DL0
    DJNZ R7,DL1
	CLR RS0
	CLR RS1     //使用寄存器组0
    RET

END

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 RS0
  CLR RS1     //使用寄存器组0
     MOV   TMOD,#01H
     MOV   TH0,#0F0H
	 MOV   TL0,#60H
	 SETB  EA
	 SETB  ET0
	 SETB  TR0//定时器初始化20MS扫描
//------------------------
DISPLAY:
      MOV   DPTR,#TABLE_CC
	  MOV   R1,#30H
	  MOV   A,@R1
	  MOVC  A, @A+DPTR
	  CLR   LED1
	  SETB  LED2
	  MOV   LED, A  
      ACALL DELAY1MS
	 //ACALL  DELAY50US  //个位ms级别扫描稳定
      MOV   R1,#31H
	  MOV   A,@R1
	  MOVC  A, @A+DPTR
	  CLR   LED2
	  SETB  LED1
	  MOV   LED, A  
      ACALL DELAY1MS
	 // ACALL DELAY50US
	  MOV   R1,#32H
	  MOV   A,@R1
	  CJNE  A,#01H,KEY_FIRST   //初次判断没有按键按下
      ACALL KEY_BOARD
KEY_FIRST:AJMP  DISPLAY


//---------------------------------
INI_T0:
           MOV   KEY,  #11110000B    //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化)
           MOV   A,  KEY            //读按键值, 
           XRL   A,    #11110000B
           JNZ   KEY_EN00
	       AJMP  initT0_END	  
KEY_EN00: 
           MOV   R1,#32H
		   MOV   @R1,#01H  //传递主函数标志
initT0_END:
           MOV   TH0,#0F0H
           MOV   TL0,#60H
           RETI

//--------------------------
KEY_BOARD:
         ACALL   DELAY200MS
	     MOV     KEY,#11110000B    //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化)
         MOV     A,KEY      //读按键值, 
         XRL     A, #11110000B
         JNZ     KEY_ENB
	     ;CJNE   A, #00H,KEY_ENB  //两种处理办法
	     ;AJMP   START
	     AJMP    BACK   //-------
KEY_ENB:
KEY111:     //扫描第一列
        MOV      KEY,#11101111B   //在第一列中如果按下那么低四位肯定有为0的
	    JB       KEY.0,KEY5
	    MOV      A, #1
	    AJMP     CONVER
KEY5:   MOV      KEY,#11101111B   //在第一列中如果按下那么低四位肯定有为0的
	    JB       KEY.1,KEY9
	    MOV      A, #5
	    AJMP     CONVER
KEY9:   MOV      KEY,#11101111B   //在第一列中如果按下那么低四位肯定有为0的
	    JB       KEY.2,KEY13
	    MOV      A, #9
	    AJMP     CONVER
KEY13:  MOV      KEY,#11101111B   //在第一列中如果按下那么低四位肯定有为0的
	    JB       KEY.3,KEY22
	    MOV      A, #13
	    AJMP     CONVER
KEY22:  MOV      KEY,#11011111B   //在第2列中如果按下那么低四位肯定有为0的
	    JB       KEY.0,KEY6
	    MOV      A, #2
	    AJMP     CONVER
KEY6:   MOV      KEY,#11011111B   //在第2列中如果按下那么低四位肯定有为0的
	    JB       KEY.1,KEY10
	    MOV      A, #6
	    AJMP     CONVER
KEY10:  MOV      KEY,#11011111B   //在第2列中如果按下那么低四位肯定有为0的
	    JB       KEY.2,KEY14
	    MOV      A, #10
	    AJMP      CONVER
KEY14:  MOV      KEY,#11011111B   //在第2列中如果按下那么低四位肯定有为0的
	    JB       KEY.3,KEY33
	    MOV      A, #14
	    AJMP     CONVER
KEY33:  MOV      KEY,#10111111B   //在第3列中如果按下那么低四位肯定有为0的
	    JB       KEY.0,KEY7
	    MOV      A, #3
	    AJMP     CONVER
KEY7:   MOV      KEY,#10111111B   //在第3列中如果按下那么低四位肯定有为0的
	    JB       KEY.1,KEY11
	    MOV      A, #7
	    AJMP     CONVER
KEY11:  MOV      KEY,#10111111B   //在第3列中如果按下那么低四位肯定有为0的
	    JB       KEY.2,KEY15
	    MOV      A, #11
	    AJMP     CONVER
KEY15:  MOV      KEY,#10111111B   //在第3列中如果按下那么低四位肯定有为0的
	    JB       KEY.3,KEY44
	    MOV      A, #15
	    AJMP     CONVER
KEY44:  MOV      KEY,#01111111B   //在第4列中如果按下那么低四位肯定有为0的
	    JB       KEY.0,KEY8
	    MOV      A, #4
	    AJMP     CONVER
KEY8:   MOV      KEY,#01111111B   //在第4列中如果按下那么低四位肯定有为0的
	    JB       KEY.1,KEY12
	    MOV      A, #8
	    AJMP     CONVER
KEY12:  MOV      KEY,#01111111B   //在第4列中如果按下那么低四位肯定有为0的
	    JB       KEY.2,KEY16
	    MOV      A, #12
	    AJMP     CONVER
KEY16:  MOV      KEY,#01111111B   //在第4列中如果按下那么低四位肯定有为0的
	    JB       KEY.3,BACK
	    MOV      A, #16
	    AJMP     CONVER
KEY_BACK:  //AJMP START
CONVER:  //一般都会吧二进制转10进制  就是把得到数据A(1-16)看成 个数
        MOV     B,#10
	    DIV     AB
	    MOV     R1,#30H
	    MOV     @R1, A//存储高位
	    MOV     A,B
	    MOV     R1,#31H
	    MOV     @R1,A  //存储低位  
BACK:	  
	    MOV    R1,#32H
	    MOV    @R1,#00H
        RET
TABLE_CC:DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //共阴(0-9)

DELAY1MS:   ;误差 0us
    SETB RS0
	SETB RS1     //使用寄存器组3
    MOV R7,#01H
DL11:
    MOV R6,#8EH
DL00:
    MOV R5,#02H
    DJNZ R5,$
    DJNZ R6,DL00
    DJNZ R7,DL11
	CLR RS0
	CLR RS1     //使用寄存器组0	
    RET
DELAY200MS:   ;误差 0us
    SETB RS0
	SETB RS1     //使用寄存器组3
    MOV R7,#43H
DL1:
    MOV R6,#8EH
DL0:
    MOV R5,#09H
    DJNZ R5,$
    DJNZ R6,DL0
    DJNZ R7,DL1
	CLR RS0
	CLR RS1     //使用寄存器组0
    RET
DELAY50US:   ;误差 0us
    MOV R6,#01H
DL05:
    MOV R5,#16H
    DJNZ R5,$
    DJNZ R6,DL05
    RET
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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦灵-影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值