找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机如何编程4*4矩阵按键呢?基于汇编语言的版本 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:827413 发表于 2020-10-10 18:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:73422 发表于 2020-11-7 21:30 | 只看该作者
org  0000h
                  ajmp main
                  org  0030h
                  main:
                       mov  dptr,#tab     ;将表头放入DPTR
                       lcall    key      ;调用键盘扫描程序
                       movc a,@a+dptr    ;查表后将键值送入ACC
                       mov  p0,a           ;将Acc值送入P0口
                       CLR P2.1            ;开显示
                       ljmp main         ;返回反复循环显示
                  KEY: LCALL KS        ;调用检测按键子程序
                       JNZ K1                 ;有键按下继续
                       LCALL DELAY2      ;无键按调用延时去抖
                       AJMP KEY          ;返回继续检测按键
                  K1:  LCALL DELAY2
                       LCALL DELAY2     ;有键按下延时去抖动
                       LCALL KS          ;再调用检测按键程序
                       JNZ K2          ;确认有按下进行下一步
                       AJMP KEY         ;无键按下返回继续检测
                  K2:  MOV R2,#0EFH      ;将扫描值送入 R2暂存
                  MOV R4,#00H   ;将第一列值送入R4暂存
                  K3: MOV P1,R2     ;将R2的值送入P1口
                  L6:  JB P1.0,L1        ;P1.0等于1跳转到L1
                       MOV A,#00H       ;将第一行值送入ACC
                       AJMP LK         ;跳转到键值处理程序
                  L1:  JB P1.1,L2       ;P1.1等于1跳转到L2
                       MOV A,#04H   ;将第二行的行值送入ACC
                       AJMP LK  ;跳转到键值理程序进行键值处理
                  L2: JB P1.2,L3      ;P1.2等于1跳转到L3
                       MOV A,#08H     ;将第三行的行值送入ACC
                       AJMP LK          ;跳转到键值处理程序 L3:  JB P1.3,NEXT   
                  ;P1.3等于1跳转到NEXT处
                       MOV A,#0cH       ;将第四行的行值送入ACC
                  LK:  ADD A,R4     ;行值与列值相加后的键值送入A
                       PUSH ACC         ;将A中的值送入堆栈暂存
                  K4:  LCALL DELAY2        ;调用延时去抖动程序
                       LCALL KS          ;调用按键检测程序
                       JNZ K4        ;按键没有松开继续返回检测
                       POP ACC      ;将堆栈的值送入ACC
                       RET
                  NEXT:
                      INC  R4           ;将列值加一
                      MOV A,R2          ;将R2的值送入A
                      JNB ACC.7,KEY  ;扫描完至KEY处进行下一扫描
                      RL A    ;扫描未完将A中的值右移一位进行下一列的扫描
                      MOV R2,A      ;将ACC的值送入R2暂存
                      AJMP K3       ;跳转到K3继续
                  KS:  MOV P1,#0FH   ;将P1口高四位置0低四位值1
                       MOV A,P1     ;读P1口
                       XRL A,#0FH    ;将A中的值与A中的值相异或
                       RET          ;子程序返回
                  DELAY2:         ;40ms延时去抖动子程序
                        MOV R5,#08H
                  L7:  MOV R6,#0FAH
                  L8:  DJNZ R6,L8
                       DJNZ R5,L7
                       RET
                  tab:
                  db 28h,34h,28h,34h,0a9h,60h,20h,7ah,
                  20h,21h,61h,74h,30h,62h,0a2h,7eh
                      ;0h0hc9878654a321 轮流显示键盘因为无法表达*# 就用H表示,B用8表示
                  end
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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