我给你一种线转法吧,这种比较简单
JIANPAN:
KEY EQU 50H
KEY_NUMBER EQU 60H
MOV P1,#0FH ;读列线
MOV A,P1
ANL A,#0FH
CJNE A,#0FH,KEY_SCAN
LJMP EXIT
KEY_SCAN:
MOV P1,#0FH ;读列线
MOV A,P1
ANL A,#0FH
MOV B,A
MOV P1,#0F0H ;读行线
MOV A,P1
ANL A,#0F0H
ORL A,B
MOV KEY,A ;保存键值
CJNE A,#0FFH,JIANZHI
LJMP KEY_SCAN
JIANZHI:
MOV R4,#0FFH
MOV DPTR,#TABLE_JIANZHI
LOOP:
INC R4
INC 58H
MOV A,R4
MOVC A,@A+DPTR
CJNE A,KEY,BAOHU
MOV KEY_NUMBER,R4
BAOHU:
MOV A,58H
CJNE A,#17,LOOP
RET
TABLE_JIANZHI: ;键值表
DB 0E7H,0D7H,0B7H,77H
DB 0EBH,0DBH,0BBH,7BH
DB 0EDH,0DDH,0BDH,7DH
DB 0EEH,0DEH,0BEH,7EH
DB 0FFH
END
二楼提供的线转法,也是采用查表的方法,太麻烦了。
用行扫描法,至少可以节约一半的代码。
----------------
我用键盘扫描法,扫描P1口外接的4×4键盘,指令语句不过30行,编译后,仅仅用44个字节!
而线反转法,用58字节,次之。
最差的是查表法,一般都要80字节以上!
另外,查表时,常要循环10多次,执行速度也是最慢的。
关注下
应该是查表法最好的
键盘扫描法次之
还可以查表法,我觉得那种最简单!程序你百度一下,很多的!