; 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,仿真和实物调试都不行,不知道哪里出现了问题. |