找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1465|回复: 0
打印 上一主题 下一主题
收起左侧

Proteus仿真单片机读4*6矩阵键盘子程序的仿真学习程序

[复制链接]
跳转到指定楼层
楼主
基于protus的读键子程序的仿真学习,已附代码。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. ;===============================================================================
  2. ;                   LED Digit Display & 4*6 KeyPad
  3. ;                   By:Wu,ChuiHong
  4. ;===============================================================================
  5. ;20181106 V1.0
  6. ;===============================================================================
  7. Dark                Equ    10H
  8. ;===============================================================================
  9. DisModePort         Equ    0000H                  ;0:Light up
  10. DisCSPort           Equ    2000H                  ;1:Light up
  11. ;-------------------------------------------------------------------------------
  12. KeyInPort           Equ    P1                     ;Use P1.0..P1.3
  13. KeyOutPort          Equ    DisCSPort
  14. ;===============================================================================
  15. DisBuf              Equ    30H;..35H
  16. ;===============================================================================
  17.                     Org    0000H
  18.                     AJmp   Main
  19. ;===============================================================================
  20. Display:            Mov    R0,#DisBuf
  21.                     Mov    R1,#00000001B
  22. DisplayLp:          Mov    A,R1
  23.                     Mov    Dptr,#DisCSPort
  24.                     Movx   @Dptr,A

  25.                     Mov    A,@R0
  26.                     Mov    Dptr,#DisTab
  27.                     Movc   A,@A+Dptr
  28.                     Mov    Dptr,#DisModePort
  29.                     Movx   @Dptr,A

  30.                     ACall  Delay

  31.                     Inc    R0
  32.                     Mov    A,R1
  33.                     RL     A
  34.                     Mov    R1,A

  35.                     Cjne   R0,#DisBuf+6,DisplayLp
  36.                     Ret
  37. ;-------------------------------------------------------------------------------
  38. ;                   Code   00h,  01h,  02h,  03h, 04h,  05h,  06h, 07h ,08h, 09h
  39. ;                   Char   "0",  "1",  "2",  "3", "4",  "5",  "6", "7" ,"8", "9"
  40. DisTab:             DB    0c0h, 0f9h, 0a4h, 0b0h, 99h,  92h,  82h, 0f8h,80h, 90h

  41. ;                   Code   0ah,  0bh,  0ch , 0dh , 0eh, 0fh, 10h
  42. ;                   Char   "a",  "b",  "c" , "d" , "e", "f", " "
  43.                     DB     88h,  83h,  0c6h, 0a1h, 86h, 8eh, 0FFH
  44. ;--------------------------------------------------------------------------
  45. Delay:              Mov    r6,#4                  ;8*256*2*T(1us)=8*512=4000us=2ms
  46. Delay1:             Mov    r7,#0
  47.                     Djnz   r7,[        DISCUZ_CODE_1        ]nbsp;                  ;2
  48.                     Djnz   r6,Delay1
  49.                     Ret
  50. ;-------------------------------------------------------------------------------
  51. InitDis:            Mov    DisBuf+0,#0
  52.                     Mov    DisBuf+1,#Dark
  53.                     Mov    DisBuf+2,#Dark
  54.                     Mov    DisBuf+3,#Dark
  55.                     Mov    DisBuf+4,#Dark
  56.                     Mov    DisBuf+5,#Dark
  57.                     Ret
  58. ;===============================================================================
  59. KeySCan:            Mov    Dptr,#KeyOutPort       ;Fast Judge if Key pressed
  60.                     Clr    A                      ;Output all 0
  61.                     Movx   @Dptr,A
  62.                     Mov    P1,#0FFH               ;Input to A
  63.                     Mov    A,P1
  64.                     Cpl    A
  65.                     Anl    A,#0FH
  66.                     Ret
  67. ;-------------------------------------------------------------------------------
  68. ReadKey:            ACall  KeyScan                ;If Any Key Pressed
  69.                     ACall  Display                ;?
  70.                     Jz     ReadKey                ;No Key, Wait

  71.                     ACall  Display                ;Delay
  72.                     ACall  Display
  73.                     ACall  KeyScan
  74.                     Jz     ReadKey                ;If Key Still Pressed

  75.                     Mov    R1,#0                  ;Key Column Code
  76.                     Mov    R2,#11111110B
  77.                     Mov    Dptr,#KeyOutPort
  78. ReadKeyLoop:        Mov    A,R2                   ;Key Output
  79.                     Movx   @Dptr,A
  80.                     Jb     KeyInPort.0,ReadKeyNxt0;If .0=1(No Key) to next
  81.                     Mov    A,#0                   ;Key Line Code
  82.                     AJmp   ReadKeyOk
  83. ReadKeyNxt0:        Jb     KeyInPort.1,ReadKeyNxt1;If .0=1(No Key) to next
  84.                     Mov    A,#6
  85.                     AJmp   ReadKeyOk
  86. ReadKeyNxt1:        Jb     KeyInPort.2,ReadKeyNxt2;If .0=1(No Key) to next
  87.                     Mov    A,#12
  88.                     AJmp   ReadKeyOk
  89. ReadKeyNxt2:        Jb     KeyInPort.3,ReadKeyNxt3;If .0=1(No Key) to next
  90.                     Mov    A,#18
  91.                     AJmp   ReadKeyOk
  92. ReadKeyNxt3:        Mov    A,R2
  93.                     RL     A
  94.                     Mov    R2,A
  95.                     Inc    R1
  96.                     AJmp   ReadKeyLoop

  97. ReadKeyOk:          Add    A,R1                   ;A=A+R1=Key Code
  98.                     Push   Acc
  99. ReadKey1:           ACall  Display
  100.                     ACall  KeySCan
  101.                     Jnz    ReadKey1
  102.                     Pop    Acc                    ;Return A=KeyCode
  103.                     Ret
  104. ;===============================================================================
  105. AToDisHex:          Mov    B,#16
  106.                     Div    AB
  107.                     Mov    DisBuf+0,B
  108.                     Mov    DisBuf+1,A
  109.                     Ret
  110. ;===============================================================================
  111. Main:               Mov    Sp,#07H
  112.                     ACall  InitDis
  113. ;-------------------------------------------------------------------------------
  114. MainLoop:           ACall  Display                ;Dynamic Display
  115.                     ACall  ReadKey                ;Read Key and get Key_Code
  116.                     ;ACall  AToDisHex              ;Show Key code,MUST after ReadKey
  117.                     Mov    DisBuf+5,DisBuf+4
  118.                     Mov    DisBuf+4,DisBuf+3
  119.                     Mov    DisBuf+3,DisBuf+2
  120.                     Mov    DisBuf+2,DisBuf+1
  121.                     Mov    DisBuf+1,DisBuf+0
  122.                     Mov    DisBuf+0,A
  123.                     AJmp   MainLoop
  124. ;===============================================================================
  125.                     End
复制代码

全部资料51hei下载地址:
Demo.zip (34.66 KB, 下载次数: 13)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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