打印
[国产单片机]

51单片机矩阵键盘程序bug

[复制链接]
924|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhaxiaoxi|  楼主 | 2015-11-7 23:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
; 0 1 2 3 p1.0 
; 4 5 6 7 p1.1
; 8 9 a b p1.2
; c d e f p1.3
;.4.5.6.7
org 0000h
ljmp main
org 0030h
main:  
       MOV R1,16;计数初值
           MOV P2,#03H;位选
       mov P1,#0F0H;给P1低四位低电平
       MOV A,P1
           CJNE A,#0F0H,wait;比较
           ljmp back
          
wait:   
       LCAll delay5ms;消抖
       mov A,P1;读P1口
           CJNE A,#0F0H,scankey
           LJMP back
scankey:
           ORL A,#0FH;将低四位置1
           MOV R2,A;暂时保存高四位的地址
           MOV P1,A;
           MOV A,P1;读取当前P1口
           ANL A,#0FH;屏蔽高四位
           MOV R3,A;低四位的地址
           MOV A,R2;把高四位的地址送到a中
           ANL A,#0F0H;A中存放高四位的地址了
           ADD A,R3;把地址相加得到对应按键的标码
           MOV 28H,A;把地址放在28H中
SWITCH:
           MOV DPTR,#TAB;把键码地址送到dptr中
           mov A,R1;计数放到A中
           MOVC A,@A+DPTR
           CJNE A,28H,SWM;将键码表与按键值相比较,不相同就R1-1,向前查
           mov DPTR,#table;能执行这一步说明查到键码了,把共阴数码表的表首地址放到DPTR中
           mov A,R1;把表示表中的第几个数的R1放到A中
           MOVC A,@A+DPTR;查出对用的数码表的值
           MOV P0,A;送到P0口显示
           LJMP back
SWM:
       djnz R1,SWITCH
back:
       mov R1,#00h
           ljmp main
      
TAB:     DB 0eeH,0deH,0beH,7eH;键码表
         DB 0edH,0ddH,0bdH,7dH
                 DB 0ebH,0dbH,0bbH,7bH
             DB 0e7H,0d7H,0b7H,77H
table:   DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h;共阴数码表
         DB 7fh,6fh,77h,7ch,39h,5eh,79h,71h

delay5ms:
         mov R6,#10     ;5ms延时
loop1:   mov R7,#0F8H
         nop
loop2:   djnz r7,loop2
         djnz r6,loop1
                 ret

end

我用的是线反转法,我下载到单片机发现"1""3""F"这三个键按下去没有反应,"6"这个键出现乱码
共阴数码管的值都是从自己学的c语言那边复制过来的,键码也是从c语言复制过来,但用C语言写
没有任何问题,我照着C的思路写下来的,就是出现bug,仿真和实物调试都不行,不知道哪里出现了问题.

相关帖子

沙发
zhaxiaoxi|  楼主 | 2015-11-8 10:39 | 只看该作者
第一句:mov R1,#16
少了一个#

使用特权

评论回复
板凳
前功尽弃| | 2015-11-8 20:40 | 只看该作者
为什么还在用汇编写?难道当初跟我一样,大学课程的?

使用特权

评论回复
地板
ywlzh| | 2015-11-9 09:47 | 只看该作者
硬仿下,在相应的地方打断电,看看对应值对不对,是不是查表出错了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝