想要一条条仔细分析下,但好像也没什么可说的了,基本上每一条代码都有注释了,还是看程序吧!还有,书上其实错误很多,不能尽信书。
**************************************************************************/ ORG0000H AJMPKEY2 ORG0100H KEY2:LCALLKS ;键盘检测 JNZK1 ;累加器不为0表可能有键按下,跳至K1再次检测 LCALLD10MS ;书上写了要去陡,但好像这里去不去陡没太大关系,不去也能行 AJMPKEY2 ;无键按下返回重新检测 K1:LCALLD10MS ;去陡,再次检测 LCALLKS JNZK2 AJMPKEY2 ;无键按下返回重新检测 K2:MOVR2, #0EFH ;每次只有一列电平置低,即每次只扫描一列 MOVR4, #00H ;列号,下同 K3:MOVP2, R2 ;开始扫描 L0:JBP2.0, L1 ;端口值为高则说明此列无键按下,跳到下一端口检测程序 MOVA, #00H ;行首键号送累加器 AJMPLK L1:JBP2.1, L2 MOVA, #04H AJMPLK L2:JBP2.2, L3 MOVA, #08H AJMPLK L3:JBP2.3, NEXT ;端口值为高则说明此列无键按下,准备扫描下一列 MOVA, #0CH LK:ADDA, R4 ;行的首键号+列号算出键值 PUSHACC ;因后面还要用到ACC,所以读出键值后需要把ACC入栈保存 NEXT:INCR4 MOVA, R2 JNBACC.7, K4 ;判是否扫描完,完则跳转到枪手检测 RLA ;左环移,扫描下一列应送的值 MOVR2, A AJMPK3 ;未扫描完跳至K3再次扫描 K4:LCALLKS ;键盘检测,判松手 JNZK4 ;未松开则原地等待 POPACC ;累加器出栈 ;RET LJMPSTART ;出栈后跳至显示程序 KS:MOVP2, #0FH ;键盘检测,有键按下非0 MOVA, P2 XRLA, #0FH ;异或指令,判有无键按下,聪明呀! RET START:MOVDPTR, #TABLE ;把管码表首地址给数据指针 CLRP1.3 ;数码管段位选初始化 CLRP1.4 CLRP1.5 DISPLAY:;LCALLKEY2 MOVCA, @A+DPTR SETBP1.5 ;开位选 MOVP0, #00H CLRP1.5 MOVP0, #00H ;消影 SETBP1.4 ;开段选 MOVP0, A CLRP1.4 ;锁存 LCALLD10MS LJMPKEY2 ;显示完后跳至检测程序继续检测 TABLE:DB3FH, 06H, 5BH, 4FH, 66H ;共阴数码管码表 DB6DH, 7DH, 07H, 7FH, 6FH DB77H, 7CH, 39H, 5EH, 79H DB71H D10MS:MOVR7, #25 ;延时10MS D1:MOVR6, #200 DJNZR6, $ ;美元符号表示原地跳转 DJNZR7, D1 RET END