P1.0~P1.3为行线,p1.4-1.7为列线,列线上接有上拉电阻和VCC,同时用与门接到INT0,求一个汇编程序,用外部中断法判断键值,如果有多个键被同时按下,不做处理,只有一个键被按下的时候才做处理,把判断处的键值送到60H。
我今天去逛图书馆,看了很多这些书,都明白那些算法了,怎样扫描也明了,只不过书本上的硬件图跟我的也一样,我用的程序也跟书上的一样,仿真出来还是不对,书上的方法,跟我自己写的也差不多一个思想,我自己写的也仿真不出来,书上的也仿真不出来,我看是我Proteus的问题了……不过谢谢你ismile2003 ,感谢分享,你做的那个汇编程序,正好我也是搞数码管研究一下~不过这只是我最终目标的一部分而已~我现在只是为了判键值,往后是为了按不同的键值来播放不同的歌,即音乐盒……,另外我还用了LCD来显示时间,网上找出来的,那个有很多错误,现在只能自己一块一块的研究出来,最终组合起来了……唉,蛋疼。对于laujc ,你的这个我有看到过,不过这个是C语言的,不是单片机的汇编语言。目前我们只学了一部分的C,还不会用这个~这个要看学校什么时候能教C先了……自学的话无激情……
这个是我以前做的扫描法,电路如图所示,程序附上。
ORG 00H
LJMP MAIN
ORG 30H
MAIN: LCALL LOOP1
LCALL DELAY
LCALL LOOP1
LCALL LOOP2
LCALL LOOP3
LJMP MAIN
LOOP1: MOV P2,#0F0H;判断有键按下?
MOV A,P2
MOV B,A
MOV P2,#0FH
MOV A,P2
ORL A,B
MOV 30H,A
CJNE A,#0FFH,LOOP11
LJMP MAIN
LOOP11: RET
LOOP2:MOV R3,#00H;比较计算得出键值
LOOP21:MOV A,R3
INC R3
MOV DPTR,#TAB
MOVC A,@A+DPTR
CJNE A,30H,LOOP21
RET
LOOP3:MOV A,R3 ;数码管显示
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV P1,A
;MOV P1,#0F1H
RET
DELAY: ;延时R5×10MS
MOV R6,#50
DELAY1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DELAY1
RET
TAB:
DB 0EEH,0EDH,0EBH,0E7H
DB 0DEH,0DDH,0DBH,0D7H
DB 0BEH,0BDH,0BBH,0B7H
DB 07EH,07DH,07BH,077H
TAB1: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH
END
这个是我以前做的扫描法,电路如图所示,程序附上。