« 上一篇下一篇 »

汇编语言学习(五)

想要一条条仔细分析下,但好像也没什么可说的了,基本上每一条代码都有注释了,还是看程序吧!还有,书上其实错误很多,不能尽信书。


**************************************************************************/
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