找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机汇编程序分享 矩阵键盘(线反转法)

[复制链接]
ID:1114132 发表于 2024-5-12 00:11 | 显示全部楼层 |阅读模式
分享一个自己写的汇编矩阵键盘子函数,会以A为出口,返回值为0至16的数字(0为无按键按下)。这个子函数不会等待用户松手,会直接返回,如果要使用,请根据自己的需求进行修改。
附上一个使用这个子函数的小项目。
如有错误欢迎批评指正。

单片机源程序如下:
  1. ;定义矩阵键盘所在端口,低位为行按键,高位为列按键
  2. ARRAY DATA P3

  3. ;按键检测函数,影响A,R0,R1寄存器
  4. ARRAY_TEST:
  5.         ;第一次按键检测,无按下直接结束
  6.         MOV ARRAY,#0FH
  7.         MOV A,ARRAY
  8.         CJNE A,#0FH,ARRAY_TEST1
  9.         CLR A
  10.         RET
  11. ARRAY_TEST1:
  12.         ;第二次按键检测,等待5ms进行再次检测,防止误入
  13.         ACALL DELAY5MS
  14.         MOV ARRAY,#0FH
  15.         MOV A,ARRAY
  16.         CPL A
  17.         ANL A,#0FH
  18.         JNZ SCAN                ;确认有按键按下,开始扫描
  19.         RET
  20. SCAN:
  21.         ;录入按下按键的行位置
  22.         MOV R1,A
  23.         MOV R0,#5H
  24. ;由于51单片机IO口为强下拉,当有按键按下时,特定的引脚会无法变为高位
  25.         MOV ARRAY,#0F0H
  26.         MOV A,ARRAY
  27. SCAN1:
  28.         RLC A
  29.         DEC R0
  30.         JC SCAN1
  31. SCAN2:
  32.         MOV A,R1                        ;取回行位置
  33.         ;计算行地址
  34.         CJNE A,#1000B,SCAN3
  35.         RR A
  36.         AJMP SCAN4
  37. SCAN3:
  38.         CJNE A,#100B,SCAN4
  39.         DEC A
  40. SCAN4:
  41.         ;计算按键位置
  42.         DEC A
  43.         RL A
  44.         RL A
  45.         ADD A,R0
  46.         RET
复制代码
小项目:
  1. ;定义矩阵键盘所在端口,低位为行按键,高位为列按键
  2. ARRAY DATA P3
  3.         
  4. ORG 00H
  5.         AJMP START
  6. ORG 100H
  7. START:
  8. ;初始化
  9.         MOV DPTR,#TAB                ;初始化要显示的内容
  10.         MOV P0,#0FFH                ;初始化显示端口
  11.         MOV SP,#30H                        ;初始化堆栈地址
  12. MAIN:
  13.         ACALL ARRAY_TEST        ;调用矩阵键盘检测
  14.         JZ MAIN                                ;当无键盘按下跳转到main
  15.         DEC A                                ;若需要第3个数据只需将指针位移2位,故自减一
  16.         ;输出
  17.         MOVC A,@A+DPTR
  18.         MOV P0,A
  19.         CLR A
  20.         AJMP MAIN
  21. ;按键检测函数,影响A,R0,R1寄存器,
  22. ;A为出口,返回值为0至16的数字(0为无按键按下)
  23. ARRAY_TEST:
  24.         ;第一次按键检测,无按下直接结束
  25.         MOV ARRAY,#0FH
  26.         MOV A,ARRAY
  27.         CJNE A,#0FH,ARRAY_TEST1
  28.         CLR A
  29.         RET
  30. ARRAY_TEST1:
  31.         ;第二次按键检测,等待5ms进行再次检测,防止误入
  32.         ACALL DELAY5MS
  33.         MOV ARRAY,#0FH
  34.         MOV A,ARRAY
  35.         CPL A
  36.         ANL A,#0FH
  37.         JNZ SCAN                ;确认有按键按下,开始扫描
  38.         RET
  39. SCAN:
  40.         ;录入按下按键的行位置
  41.         MOV R1,A
  42.         MOV R0,#5H
  43. ;由于51单片机IO口为强下拉,当有按键按下时,特定的引脚会无法变为高位
  44.         MOV ARRAY,#0F0H
  45.         MOV A,ARRAY
  46. SCAN1:
  47.         RLC A
  48.         DEC R0
  49.         JC SCAN1
  50. SCAN2:
  51.         MOV A,R1                        ;取回行位置
  52.         ;计算行地址
  53.         CJNE A,#1000B,SCAN3
  54.         RR A
  55.         AJMP SCAN4
  56. SCAN3:
  57.         CJNE A,#100B,SCAN4
  58.         DEC A
  59. SCAN4:
  60.         ;计算按键位置
  61.         DEC A
  62.         RL A
  63.         RL A
  64.         ADD A,R0
  65.         RET
  66. TAB:
  67. DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
  68.         
  69. DELAY5MS:                        ;@11.0592MHz
  70.         PUSH 30H
  71.         PUSH 31H
  72.         MOV 30H,#9
  73.         MOV 31H,#239
  74. NEXT:
  75.         DJNZ 31H,NEXT
  76.         DJNZ 30H,NEXT
  77.         POP 31H
  78.         POP 30H
  79.         RET
  80. END
复制代码
如果不想花积分,可以在csdn上下载(我设置的免费下载):【免费】51单片机汇编程序分享矩阵键盘子函数资源-CSDN文库

小项目

小项目

ARRAY.zip

43.21 KB, 下载次数: 2, 下载积分: 黑币 -5

Proteus仿真+程序

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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