当前位置:   article > 正文

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

c51duli按键扫描程序

一,按键控制数码管 

1四按键控制程序(汇编)

(您的关注点赞是作者创作的最大动力哦) 

  1. //*******************************************************
  2. //题目:独立四键控制事件(按键分为有锁存和无锁存)
  3. //语言:汇编语言(51MCU)
  4. //功能:任意独立按键控制(带扫描式的)
  5. //优点:中间有20ms延时函数消抖;可以扩展任意个按键;可移植
  6. //      含扫描按键所有操作;
  7. //作者: 梦
  8. //提醒: 记得点赞哦!!!!!
  9. //转载要著名出处,原创不易!!!
  10. //*******************************************************
  11. K1 BIT P3.1
  12. K2 BIT P3.0
  13. K3 BIT P3.2
  14. K4 BIT P3.4
  15. LED EQU P2
  16. KEY EQU P3
  17. ORG 0000H
  18. AJMP  MAIN
  19. ORG 0030H
  20. MAIN: 
  21.     MOV LED ,#0FFH
  22.     MOV P0,#0FFH
  23.     CLR RS1
  24.     CLR RS0    //调用第0组寄存器
  25. KLOOP:
  26.     SETB K1    //先置高,再检测低
  27.     SETB K2
  28.     SETB K3
  29.     SETB K4
  30.     JB K1, KT1
  31.     MOV  A, #11H
  32.     ACALL DELAY200MS  //消除抖动
  33.     AJMP TRS1
  34. KT1:JB K2, KT2
  35.     MOV  A, #22H
  36.     ACALL DELAY200MS  //消除抖动
  37.     AJMP TRS1
  38. KT2:JB K3, KT3
  39.     MOV  A, #44H
  40.     ACALL DELAY200MS  //消除抖动
  41.     AJMP TRS1
  42.     
  43. KT3:JB K1, KLOOP
  44.     MOV  A, #88H
  45.     ACALL DELAY200MS  //消除抖动    
  46.     
  47. TRS1:
  48.     JB K1, KT1_T
  49.     MOV  A, #11H
  50.     ;CPL A
  51.     ;MOV LED,A
  52.     ;JNB K1,$     //无锁存
  53.     AJMP CONVERS_T
  54. KT1_T:JB K2, KT2_T
  55.     MOV  A, #22H
  56.     ;CPL A
  57.     ;MOV LED,A
  58.     ;JNB K2,$     //无锁存
  59.     AJMP CONVERS_T
  60. KT2_T:JB K3, KT3_T
  61.     MOV  A, #44H
  62.     ;CPL A
  63.     ;MOV LED,A
  64.     ;JNB K3,$       //无锁存
  65.     AJMP CONVERS_T    
  66. KT3_T:JB K4, KLOOP
  67.     MOV  A, #88H
  68.     
  69. CONVERS_T:
  70.     ;MOV A,#00H  //无锁存
  71.     CPL A
  72.     MOV LED,A
  73. LJMP KLOOP
  74.     
  75. DELAY200MS:   ;误差 0us
  76.     SETB RS1
  77.     SETB RS0  //调用第3组寄存器
  78.     MOV R7,#43H
  79. DL1:
  80.     MOV R6,#8EH
  81. DL0:
  82.     MOV R5,#09H
  83.     DJNZ R5,$
  84.     DJNZ R6,DL0
  85.     DJNZ R7,DL1
  86.     CLR RS1
  87.     CLR RS0    //调用第0组寄存器
  88.     RET
  89. END

 

 

2矩阵键盘(4X4)按键控制程序(汇编)控制led数码管1个 

  1. //*******************************************************
  2. //题目:4X4矩阵键盘控制LED数码管(按键分为有锁存和(隔离的为)无锁存)
  3. //语言:汇编语言(51MCU)
  4. //功能:任意独立按键控制(带扫描式的)
  5. //优点:中间有20ms延时函数消抖;两种扫描方式其中定时器扫描很大程度优化CPU;可移植
  6. // 含扫描按键所有操作;
  7. //矩阵键盘目前扫描方法:(1)程序扫描(本程序) (2)定时器扫描(本程序也有) (3)中断扫描(51中断固定不能实现)
  8. //作者: 梦
  9. //提醒: 记得点赞哦!!!!!
  10. //转载要著名出处,原创不易!!!
  11. //*******************************************************
  12. KEY EQU P1 //程序扫描 但由于大部分CPU在扫描键盘,当要显示两个数码管值显然做不到
  13. LED EQU P0 //按键控制一个数码管(数码管带锁存芯片)
  14. KEY1 EQU P2.0
  15. KEY4 EQU P2.4
  16. ORG 0000H
  17. AJMP MAIN
  18. ORG 0030H
  19. MOV 30H,#00H
  20. MOV 31H,#00H
  21. ORG 0035H
  22. MAIN:
  23. CLR RS0
  24. CLR RS1 //使用寄存器组0
  25. START:
  26. MOV KEY, #11110000B //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化)
  27. MOV A, KEY //读按键值,
  28. XRL A, #11110000B
  29. JNZ KEY_ENA
  30. ;CJNE A, #00H,KEY_ENA //两种处理办法
  31. ;AJMP START
  32. AJMP START
  33. KEY_ENA:
  34. ACALL DELAY200MS
  35. MOV KEY,#11110000B //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化)
  36. MOV A,KEY //读按键值,
  37. XRL A, #11110000B
  38. JNZ KEY_ENB
  39. ;CJNE A, #00H,KEY_ENB //两种处理办法
  40. ;AJMP START
  41. AJMP START
  42. KEY_ENB:
  43. KEY111: //扫描第一列
  44. MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的
  45. JB KEY.0,KEY5
  46. MOV A, #1
  47. AJMP CONVER
  48. KEY5: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的
  49. JB KEY.1,KEY9
  50. MOV A, #5
  51. AJMP CONVER
  52. KEY9: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的
  53. JB KEY.2,KEY13
  54. MOV A, #9
  55. AJMP CONVER
  56. KEY13: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的
  57. JB KEY.3,KEY22
  58. MOV A, #13
  59. AJMP CONVER
  60. KEY22: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的
  61. JB KEY.0,KEY6
  62. MOV A, #2
  63. AJMP CONVER
  64. KEY6: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的
  65. JB KEY.1,KEY10
  66. MOV A, #6
  67. AJMP CONVER
  68. KEY10:MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的
  69. JB KEY.2,KEY14
  70. MOV A, #10
  71. AJMP CONVER
  72. KEY14:MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的
  73. JB KEY.3,KEY33
  74. MOV A, #14
  75. AJMP CONVER
  76. KEY33: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的
  77. JB KEY.0,KEY7
  78. MOV A, #3
  79. AJMP CONVER
  80. KEY7: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的
  81. JB KEY.1,KEY11
  82. MOV A, #7
  83. AJMP CONVER
  84. KEY11:MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的
  85. JB KEY.2,KEY15
  86. MOV A, #11
  87. AJMP CONVER
  88. KEY15: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的
  89. JB KEY.3,KEY44
  90. MOV A, #15
  91. AJMP CONVER
  92. KEY44:MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的
  93. JB KEY.0,KEY8
  94. MOV A, #4
  95. AJMP CONVER
  96. KEY8: MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的
  97. JB KEY.1,KEY12
  98. MOV A, #8
  99. AJMP CONVER
  100. KEY12:MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的
  101. JB KEY.2,KEY16
  102. MOV A, #12
  103. AJMP CONVER
  104. KEY16:MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的
  105. JB KEY.3,KEY_BACK
  106. MOV A, #16
  107. AJMP CONVER
  108. KEY_BACK: AJMP START
  109. CONVER: //一般都会吧二进制转10进制 就是把得到数据A(1-16)看成 个数
  110. MOV B,#10
  111. DIV AB
  112. MOV 30H,A//存储高位
  113. MOV A,B
  114. MOV 31H,A//存储低位
  115. MOV DPTR,#TABLE_CC
  116. MOV A,31H
  117. MOVC A, @A+DPTR
  118. CLR KEY1
  119. MOV LED, A
  120. AJMP START
  121. TABLE_CC:DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
  122. DELAY200MS: ;误差 0us
  123. SETB RS0
  124. SETB RS1 //使用寄存器组3
  125. MOV R7,#43H
  126. DL1:
  127. MOV R6,#8EH
  128. DL0:
  129. MOV R5,#09H
  130. DJNZ R5,$
  131. DJNZ R6,DL0
  132. DJNZ R7,DL1
  133. CLR RS0
  134. CLR RS1 //使用寄存器组0
  135. RET
  136. END

3矩阵键盘(4X4)汇编语言控制多个数码管,使用定时器扫描,数码管不带锁存芯片 

  1. //*******************************************************
  2. //题目:4X4矩阵键盘控制LED数码管(按键分为有锁存和(隔离的为)无锁存)
  3. //语言:汇编语言(51MCU)
  4. //功能:任意独立按键控制(带扫描式的)
  5. //优点:中间有20ms延时函数消抖;两种扫描方式其中定时器扫描很大程度优化CPU;可移植
  6. // 含扫描按键所有操作;
  7. //矩阵键盘目前扫描方法:(1)程序扫描(本程序也有) (2)定时器扫描(本程序) (3)中断扫描(51中断固定不能实现)
  8. //作者: 梦
  9. //提醒: 记得点赞哦!!!!!
  10. //转载要著名出处,原创不易!!!
  11. //*******************************************************
  12. KEY EQU P1 //定时器扫描 设置定时时常,中断读键盘是否按下,按下得到输出标志,得到提示,然后在主函数提示扫描键盘
  13. LED EQU P0 //其他时间显示键盘控制两个数码管(数码管不带锁存芯片)
  14. LED1 EQU P2.0
  15. LED2 EQU P2.4//KEY为矩阵键盘 LED1为数码管1公共端,LED2为数码管2公共端,LED为数码管(这里共阴)
  16. ORG 0000H
  17. AJMP MAIN
  18. ORG 000BH
  19. AJMP INI_T0 //定时器中断
  20. ORG 0030H
  21. MOV 30H,#00H //存高位
  22. MOV 31H,#00H //存低位
  23. MOV 32H,#00H //00表示没有键盘按下,01表示有键盘按下
  24. ORG 0035H
  25. MAIN:
  26. CLR RS0
  27. CLR RS1 //使用寄存器组0
  28. MOV TMOD,#01H
  29. MOV TH0,#0F0H
  30. MOV TL0,#60H
  31. SETB EA
  32. SETB ET0
  33. SETB TR0//定时器初始化20MS扫描
  34. //------------------------
  35. DISPLAY:
  36. MOV DPTR,#TABLE_CC
  37. MOV R1,#30H
  38. MOV A,@R1
  39. MOVC A, @A+DPTR
  40. CLR LED1
  41. SETB LED2
  42. MOV LED, A
  43. ACALL DELAY1MS
  44. //ACALL DELAY50US //个位ms级别扫描稳定
  45. MOV R1,#31H
  46. MOV A,@R1
  47. MOVC A, @A+DPTR
  48. CLR LED2
  49. SETB LED1
  50. MOV LED, A
  51. ACALL DELAY1MS
  52. // ACALL DELAY50US
  53. MOV R1,#32H
  54. MOV A,@R1
  55. CJNE A,#01H,KEY_FIRST //初次判断没有按键按下
  56. ACALL KEY_BOARD
  57. KEY_FIRST:AJMP DISPLAY
  58. //---------------------------------
  59. INI_T0:
  60. MOV KEY, #11110000B //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化)
  61. MOV A, KEY //读按键值,
  62. XRL A, #11110000B
  63. JNZ KEY_EN00
  64. AJMP initT0_END
  65. KEY_EN00:
  66. MOV R1,#32H
  67. MOV @R1,#01H //传递主函数标志
  68. initT0_END:
  69. MOV TH0,#0F0H
  70. MOV TL0,#60H
  71. RETI
  72. //--------------------------
  73. KEY_BOARD:
  74. ACALL DELAY200MS
  75. MOV KEY,#11110000B //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化)
  76. MOV A,KEY //读按键值,
  77. XRL A, #11110000B
  78. JNZ KEY_ENB
  79. ;CJNE A, #00H,KEY_ENB //两种处理办法
  80. ;AJMP START
  81. AJMP BACK //-------
  82. KEY_ENB:
  83. KEY111: //扫描第一列
  84. MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的
  85. JB KEY.0,KEY5
  86. MOV A, #1
  87. AJMP CONVER
  88. KEY5: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的
  89. JB KEY.1,KEY9
  90. MOV A, #5
  91. AJMP CONVER
  92. KEY9: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的
  93. JB KEY.2,KEY13
  94. MOV A, #9
  95. AJMP CONVER
  96. KEY13: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的
  97. JB KEY.3,KEY22
  98. MOV A, #13
  99. AJMP CONVER
  100. KEY22: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的
  101. JB KEY.0,KEY6
  102. MOV A, #2
  103. AJMP CONVER
  104. KEY6: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的
  105. JB KEY.1,KEY10
  106. MOV A, #6
  107. AJMP CONVER
  108. KEY10: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的
  109. JB KEY.2,KEY14
  110. MOV A, #10
  111. AJMP CONVER
  112. KEY14: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的
  113. JB KEY.3,KEY33
  114. MOV A, #14
  115. AJMP CONVER
  116. KEY33: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的
  117. JB KEY.0,KEY7
  118. MOV A, #3
  119. AJMP CONVER
  120. KEY7: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的
  121. JB KEY.1,KEY11
  122. MOV A, #7
  123. AJMP CONVER
  124. KEY11: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的
  125. JB KEY.2,KEY15
  126. MOV A, #11
  127. AJMP CONVER
  128. KEY15: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的
  129. JB KEY.3,KEY44
  130. MOV A, #15
  131. AJMP CONVER
  132. KEY44: MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的
  133. JB KEY.0,KEY8
  134. MOV A, #4
  135. AJMP CONVER
  136. KEY8: MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的
  137. JB KEY.1,KEY12
  138. MOV A, #8
  139. AJMP CONVER
  140. KEY12: MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的
  141. JB KEY.2,KEY16
  142. MOV A, #12
  143. AJMP CONVER
  144. KEY16: MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的
  145. JB KEY.3,BACK
  146. MOV A, #16
  147. AJMP CONVER
  148. KEY_BACK: //AJMP START
  149. CONVER: //一般都会吧二进制转10进制 就是把得到数据A(1-16)看成 个数
  150. MOV B,#10
  151. DIV AB
  152. MOV R1,#30H
  153. MOV @R1, A//存储高位
  154. MOV A,B
  155. MOV R1,#31H
  156. MOV @R1,A //存储低位
  157. BACK:
  158. MOV R1,#32H
  159. MOV @R1,#00H
  160. RET
  161. TABLE_CC:DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //共阴(0-9)
  162. DELAY1MS: ;误差 0us
  163. SETB RS0
  164. SETB RS1 //使用寄存器组3
  165. MOV R7,#01H
  166. DL11:
  167. MOV R6,#8EH
  168. DL00:
  169. MOV R5,#02H
  170. DJNZ R5,$
  171. DJNZ R6,DL00
  172. DJNZ R7,DL11
  173. CLR RS0
  174. CLR RS1 //使用寄存器组0
  175. RET
  176. DELAY200MS: ;误差 0us
  177. SETB RS0
  178. SETB RS1 //使用寄存器组3
  179. MOV R7,#43H
  180. DL1:
  181. MOV R6,#8EH
  182. DL0:
  183. MOV R5,#09H
  184. DJNZ R5,$
  185. DJNZ R6,DL0
  186. DJNZ R7,DL1
  187. CLR RS0
  188. CLR RS1 //使用寄存器组0
  189. RET
  190. DELAY50US: ;误差 0us
  191. MOV R6,#01H
  192. DL05:
  193. MOV R5,#16H
  194. DJNZ R5,$
  195. DJNZ R6,DL05
  196. RET
  197. 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。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/408829
推荐阅读
相关标签
  

闽ICP备14008679号