找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1892|回复: 0
收起左侧

我的单片机接口实验:编码键盘的设计及按键检测程序

[复制链接]
ID:731675 发表于 2020-6-7 09:41 | 显示全部楼层 |阅读模式
1. 连接实验箱上的数码管,编程在上面显示数字2017
2. 连接实验箱上的键盘和数码管,编写程序,将键盘输入值写在数码管的最右端,原来的数值,向左端移动。
3. 消除按键一次,输入多次的情况

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
图片1.png

单片机源程序如下:

  1.                                    ORG 0000H
  2. MAIN:        CLR P1.0                                           ;因为是共阴极的二极管,故当P1.0电平为低电平时,二极管会亮
  3.                 MOV P0,#5BH                                           ;2
  4.                 LCALL D1MS                                           ;延时
  5.                 SETB P1.0                                           ;置位,不选中这一位

  6.                 CLR P1.1                                                ;和上述方法一样
  7.                 MOV P0,#3FH                                                ;0
  8.                 LCALL D1MS;
  9.                 SETB P1.1

  10.                 CLR P1.2                                                 ;和上述方法一样
  11.                 MOV P0,#06H                                                 ;1
  12.                 LCALL D1MS
  13.                 SETB P1.2

  14.                 CLR P1.3                                                  ;和上述方法一样
  15.                 MOV P0,#07H                                                 ;7
  16.                 LCALL D1MS
  17.                 SETB P1.3

  18.                 LJMP MAIN                                                  ;循环显示
  19. D1MS: MOV R7,#02H
  20. DL:   MOV R6,#0FFH
  21. DL1:  DJNZ R6,DL1
  22.       DJNZ R7,DL
  23.           RET
  24.           END
  25. 2和3:
  26. KBUF DATA 30H          ;显示缓冲区,存放要显示的数据
  27.                 ORG 0000H
  28.                 LJMP START1
  29.                 ORG 0100H
  30. START1:        LCALL KEY           ;调用KEY,有没有键按下
  31.                 JC START4           ;判断进位位,如果进位位为1,证明没键按下
  32.        
  33.                 PUSH ACC           ;A中存放的是键值的序号
  34.                 MOV R0,#KBUF   ;显示器的位置左移
  35.                 MOV R1,#KBUF+1
  36.                 MOV R7,#7
  37. START2:        MOV A,@R1
  38.                 MOV @R0,A
  39.                 INC R0
  40.                 INC R1
  41.                 DJNZ R7,START2

  42.                 POP ACC
  43.                 MOV @R0,A

  44. ;功能键的按钮
  45.                 CJNE A,#0FH,START4    ;判断累加器的值是否是0F,如果不是跳转到START4
  46. START:        MOV R0,#KBUF
  47.                 MOV R7,#8
  48.                 MOV A,#0
  49. START0:        MOV @R0,A
  50.                 INC R0
  51.                 DJNZ R7,START0

  52. START4:        LCALL DISP
  53.                 SJMP START1

  54. ;①判断有没有键按下
  55. KEY:        MOV P1,#0FFH  ;让显示器熄灭
  56.                 MOV P3,#0FFH  ;通过P3口读入信息,提前送入1
  57.                 MOV P0,#00H
  58.                 MOV A,P3
  59.                 ANL A,#0FH           ;只要低四位的数据
  60.                 CJNE A,#0FH,KEY1  ;判断是不是全1,若全1,证明没键按下,否则,证明有键按下,跳转到KTY1
  61.                 SJMP NOKEY
  62. ;②抖动问题
  63. KEY1:        CALL DELAY ;延时,先消除抖动
  64.                 MOV A,P3
  65.                 ANL A,#0FH
  66.                 CJNE A,#0FH,KEY2   ;判断是不是全1,若全1,证明是抖动,没键按下,否则,是真正的有键按下
  67.                 SJMP NOKEY
  68. ;③确实哪一列的键被按下
  69. KEY2:        MOV R6,#04H         ;循环4次
  70.                 MOV R5,#0FEH   ;存放的是每一列应该输入的值
  71. KEY3:        MOV P0,R5          ;P0.0为0
  72.                 MOV A,P3          ;读取P3口
  73.                 ANL A,#0FH          ;只要低四位
  74.                 CJNE A,#0FH,KEY4  ;判断是不是全1,若全1,证明此列没键按下,顺序执行,否则,在此列有键按下,转到KEY4
  75.                
  76.                 MOV A,R5
  77.                 RL A                 ;循环左移一位
  78.                 MOV R5,A
  79.                 DJNZ R6,KEY3   ;判断4次循环是否结束,没结束,继续执行上述过程
  80.                 SJMP NOKEY           ;四次都结束,且中间没有转到KEY4,证明没键按下
  81. ;④此列上有键按下,显示键值
  82. KEY4:        SWAP A                 ;半字节交换,高4位有效
  83.                 MOV B,A                   ;B存储
  84.                 MOV A,R5     ;R5是列值
  85.                 ANL A,#0FH         ;只要低四位
  86.                 ORL B,A                 ;组合值,去查表
  87.                 MOV DPTR,#TAB1
  88.                 MOV R7,#16          ;共16个键,循环16次
  89.                 MOV R5,#0          ;从第0个开始
  90. KEY5:        MOV A,R5          
  91.                 MOVC A,@A+DPTR          ;读取值
  92.                 CJNE A,B,KEY7         ;判断是否和获得的组合值是否相等。相等,顺序执行,否则,转到KEY7
  93. ;⑤键是否抬起的问题
  94. KEY6:        MOV A,P3                 ;等着键抬起
  95.                 ANL A,#0FH                 ;只要低四位
  96.                 CJNE A,#0FH,KEY6 ;不是0FH,证明没抬起来
  97.                 MOV A,R5                 ;A中存放的是键值的序号
  98.                 SJMP EXIT
  99. KEY7:        INC R5                        ;序号加1,继续循环
  100.                 DJNZ R7,KEY5       
  101. NOKEY:        SETB C               ;进位位为1,证明没键按下
  102. EXIT:        RET

  103. ;延时程序
  104. DELAY:         MOV R5,#02H
  105. DL:                   MOV R6,#0FFH
  106. DL1:         DJNZ R6,DL1
  107.               DJNZ R5,DL
  108.                   RET

  109. ;显示程序
  110. DISP:        MOV DPTR,#TAB
  111.                 MOV R0,#KBUF ;存放要显示的数据
  112.                 MOV R7,#8        ;共8个字节
  113.                 MOV R4,#1        ;存放字位
  114. DISP0:        MOV A,@R0        ;通过R0得到要显示的值
  115.                 MOVC A,@A+DPTR        ;查表得到字型码
  116.                 MOV P1,A          ;送到P1口显示
  117.                 MOV A,R4
  118.                 MOV P0,A          ;字位送到P0口
  119.                 RL A                  ;左移一位
  120.                 MOV R4,A          ;又送到R4
  121.                 LCALL DELAY          ;延时
  122.                 MOV P1,#0FFH  ;关显示
  123.                 INC R0                  ;R0加一
  124.                 DJNZ R7,DISP0 ;判断8位是否全部显示,若没有,则继续显示,否则返回
  125.                 RET
  126. TAB:        DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,82H,0C6H,0A1H,86H,8EH                                ;共阳极字型码
  127. TAB1:        DB 0EEH,0EDH,0EBH,0E7H,0DEH,0DDH,0DBH,0D7H,0BEH,0BDH,0BBH,0B7H,07EH,07DH,07BH,77H      ;键值表   
  128.                 END
复制代码
51hei.png
所有资料51hei提供下载:
实验连接图 源码.zip (18.43 KB, 下载次数: 12)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表