标题: Keyboard_Array单片机汇编语言源码与仿真 [打印本页]

作者: Ri丶chard    时间: 2018-4-16 13:15
标题: Keyboard_Array单片机汇编语言源码与仿真
单片机Keyboard仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


键盘仿真汇编程序
  1.          WR273        EQU        8000H
  2.         RD244        EQU        8000H
  3.         DULA        EQU        P2.0
  4.         WELA        EQU        P2.1
  5.         ORG        0000H
  6.         AJMP        START
  7.         ORG        0030H
  8. START:        MOV        70H,#0BFH
  9.         MOV        71H,#0BFH
  10.         MOV        72H,#0BFH
  11.         MOV        73H,#0BFH
  12. LOOP1:        LCALL        DISP
  13.         LCALL        KEY        ;调用子程序KEY,得到所按下的按键编号值,存在RAM的7FH单元中      
  14.         MOV        A,7FH
  15.         MOV        DPTR,#TABLE
  16.         MOVC        A,@A+DPTR        ;将该键盘编号转换为共阳极段码   
  17.         MOV        73H,72H
  18.         MOV        72H,71H
  19.         MOV        71H,70H
  20.         MOV        70H,A                ;移位显示
  21.         LJMP        LOOP1

  22. ;--------键盘扫描子程序--------------  
  23. KEY:        MOV        R7,#00H                ;R7存放键盘的列号  
  24.         MOV        A,#00H
  25.         MOV        B,#0EH
  26. KEY1:        NOP
  27.         ORL        A,B
  28.         MOV        DPTR,#WR273
  29.         MOVX        @DPTR,A                ;送扫描信号,扫描第一列   
  30.         NOP
  31.         NOP
  32.         NOP
  33.         NOP
  34.         MOV        DPTR,#RD244
  35.         MOVX        A,@DPTR
  36.         ANL        A,#0FH                ;收到的数据只保留低4位   
  37.         CJNE        A,#0FH,KEY2        ;若读到的数据低4位不全为1,则表示有键按下,转往KEY2     
  38.         INC        R7
  39.         SETB        C
  40.         MOV        A,B
  41.         RLC        A
  42.         ANL        A,#0FH                ;此时A中低4位为1101,作为扫描下一列的输入   
  43.         CJNE        A,#0FH,KEY0
  44.         MOV        A,#0EH                ;若扫描完4列,均无键按下,则A的低4位装入1110,R7装入0,重新开始扫描      
  45.         MOV        R7,#00H
  46. KEY0:        MOV        B,A
  47.         SJMP        KEY1
  48. KEY2:   CPL        A
  49.         ANL        A,#0FH
  50.         JNB        ACC.0,KEY6
  51.         MOV        A,#00H
  52.         SJMP        KEY9
  53. KEY6:   JNB        ACC.1,KEY7
  54.         MOV        A,#01H
  55.         SJMP        KEY9
  56. KEY7:   JNB        ACC.2,KEY8
  57.         MOV        A,#02H
  58.         SJMP        KEY9
  59. KEY8:   MOV        A,#03H                ;KEY2-KEY8确定该列上哪一行的按键被按下,行号最终存放在A中      
  60. KEY9:   XCH        A,R7
  61.         MOV        B,#04H
  62.         MUL        AB
  63.         ADD        A,R7                ;列号*4+行号得到键值,键值布局与电路结构和扫描顺序有关      
  64.         MOV        DPTR,#KTAB1
  65.         MOVC        A,@A+DPTR        ;将键值转换为我为键盘编的号  
  66.         MOV        7FH,A                ;最终得到的键号存入RAM的7FH单元   
  67. KEYUP:  MOV        DPTR,#RD244
  68.         MOVX        A,@DPTR
  69.         ANL        A,#0FH
  70.         CJNE        A,#0FH,KEYUP
  71.         RET
  72. ;-----扫描结果与键盘编号的对应-------------
  73. KTAB1:        DB 03H,07H,0BH,0FH
  74.         DB 02H,06H,0AH,0EH
  75.         DB 01H,05H,09H,0DH
  76.         DB 00H,04H,08H,0CH
  77. ;-----数码管显示子程序---------------------
  78. DISP:        MOV A,70H                ;将RAM中70H-73H单元中的数据显示在对应的数码管上     
  79.         MOV DPTR,#0800H
  80.         MOVX @DPTR,A
  81.         MOV A,71H
  82.         MOV DPTR,#1000H
  83.         MOVX @DPTR,A
  84.         MOV A,72H
  85.         MOV DPTR,#2000H
  86.         MOVX @DPTR,A
  87.         MOV A,73H
  88.         MOV DPTR,#4000H
  89.         MOVX @DPTR,A
  90.         RET
  91. ;-----共阳极段代码-------------------------  
  92. TABLE:        DB 0C0H,0F9H,0A4H,0B0H, 99H,92H,82H,0F8H,80H;0-8
  93.         DB 90H, 88H, 83H,0C6H,0A1H,86H,8EH
  94.         END
复制代码



全部资料51hei下载地址:
Keyboard_Array.rar (64.82 KB, 下载次数: 6)








欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1