最近写了个超省P口的键盘程序,因为在实际中只用到了27个键,其中一个是复位键,不算,这样如果P2八个口用满的话可以带4*16=64个键盘,论坛上有需要那么多键的可以找我,可以留言给我。
我先贴出我在用的27键仿真图.
DT EQU 21H KEYBK EQU 22H KV EQU 23H D11 EQU 24H D12 EQU 25H MYP2 EQU 26H ORG 0000H AJMP START ORG 000BH ;定时器T0的入口 AJMP DISP ;显示程序 ORG 30H START: MOV SP,#5FH ;设置堆栈 MOV MYP2,#0FCH;保存P2口初设值 MOV DPTR,#ASCII MOV DT ,#0AH ;可以调整延时时间 MOV KV,#0H ;保存当前所按键的值 MOV TMOD,#00000001B ;定时器T0工作于模式1(16位定时/计数模式) MOV TH0,#HIGH(65535-1000) MOV TL0,#LOW(65535-1000) ;赋定时器初值,这里为了验证秒数正确性,设一开机就进入定时中断 SETB EA SETB ET0 ;开T0中断 SETB TR0 ;启动定时器 LOOP: ;加入你要的工作 AJMP LOOP ;;;;;;;;;;;;;;; DISP: MOV TH0,#HIGH(65535-1000) MOV TL0,#LOW(65535-1000) ;赋定时器初值 DEC MYP2 ; FC减一就是FB了 ;从F0到FB共12个LED数码管, ;我这里管的接法是根据我在用的板子接的,不是abcdefgh顺序对的 MOV A,MYP2 CJNE A,#0EFH,NEXT;一个个数码管显示的,比较是否己是最后一个, ;因为我是从第十二个开始扫描的,也就是fb, MOV MYP2,#0FCH;保存P2口初设值 第一个是F0,再减一就成EF了。 MOV MYP2,#0FBH; 如果是第一个了就把初值重置成第十二个的值,不是跳到next NEXT: MOV A,MYP2 CJNE A,#0F1H,DISP12 ;我这里只用到了每一二两个数码管用于显示 MOV P2,MYP2 MOV P0,D12 LCALL SCANKEY ;显示后调用键盘扫描子程序 ;LCALL DELAY10MS RETI DISP12: CJNE A,#0F0H,OTHER MOV P2,MYP2 MOV P0,D11 LCALL SCANKEY LCALL DELAY10MS RETI OTHER: MOV P2,MYP2 ;不是第一和二的管不显示 MOV P0,#0FFH LCALL SCANKEY RETI ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SCANKEY: PUSH PSW PUSH ACC MOV A,P2 MOV KEYBK,A LCALL DELAY10MS MOV A,P2 CJNE A,KEYBK,RELOOP CJNE A,#0F9H,NOSAME;检测是不是真的有按键,没有就返回中断 NOSAME: JNC RELOOP CJNE A,#0B9H,KL3 KL3: JNC KL2 MOV A,KEYBK CLR C SUBB A,#09DH;这里的算法是按键值减去一个值,得到在要显示的键值, ;转化后去码表中得取得数码管能显示的相应值 MOV KV,A AJMP RELOOP KL2: CJNE A,#0D9H,KL2SET KL2SET: JNC KL1 MOV A,KEYBK CLR C SUBB A,#0C6H MOV KV,A AJMP RELOOP KL1: CJNE A,#0E9H,KL1SET KL1SET: JNC RELOOP MOV A,KEYBK CLR C SUBB A,#0DFH MOV KV,A AJMP RELOOP RELOOP: MOV A,KV CJNE A,#0H,CUTKEY MOV D11,#041H MOV D12,#041H POP ACC POP PSW RET CUTKEY: MOV B,#0AH DIV AB MOVC A,@A+DPTR MOV D11,A MOV A,B MOVC A,@A+DPTR MOV D12,A POP ACC POP PSW RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DELAY10MS: ;延时函数 PUSH PSW SETB RS0 MOV R7,DT D1: MOV R6,#032H DJNZ R6,$ DJNZ R7,D1 POP PSW RET ASCII: DB 041H,077H,0c2H,052H,074H ;数字码表 因为管脚接法不同,所以0-9值不同 DB 058H,048H,073H,040H,050H ; END
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |