汇编语言学习(四)

貌似有几天没写了,最近忙呀,没有写的都不打算写了,谁叫自己当天没写,今天学的独立键盘,不打算过多的阐述,具体的代码解释可参见程序中的注释,其实注释不就是我的思维的体现了嘛。只说一点,就是汇编的按键检测,用的是对累加器A赋端口值,然后对累加器取反,哪个位为1即哪个键按下,全部为0即无键按下,重新返回程序进行按键检测(按键按下即端口为电平为0,取反即为1),这一点很有味道,是我之前没见过的。

ORG0000H
AJMPKEY1    ;绝对转移
ORG0100H
KEY1:MOVP2, #0FFH   ;读引脚输入时,必须先向锁存器写1
MOVA, P2
CPLA;对累加器取反,按下为0的键即为1
JZKEY1;为0即跳转,表明无键按下,返回检测
LCALLD10MS;延时,消陡,后面再判断一次
MOVA, P2
CPLA
JZKEY1
JBACC.0, PK0;判断哪个位为高电平,即哪个键按下
JBACC.1, PK1
JBACC.2, PK2
JBACC.3, PK3
LJMPKEY1
PK0:LCALLPKEY0
LJMPKEY1
PK1:LCALLPKEY1
LJMPKEY1
PK2:LCALLPKEY2
LJMPKEY1
PK3:LCALLPKEY3
LJMPKEY1
PKEY0:JNBP2.0, PKEY0 ;松手检测,为0说明键未松开,原地等待
LCALLD10MS ;延时,消陡,后面再判断一次
JNBP2.0, PKEY0
CLRP0.0 ;哪个键按下,松开后就有相应的灯点亮
LCALLDELAY
SETBP0.0 
RET
PKEY1:JNBP2.1, PKEY1
LCALLD10MS
JNBP2.1, PKEY1
CLRP0.1
LCALLDELAY
SETBP0.1
RET
PKEY2:JNBP2.2, PKEY2
LCALLD10MS
JNBP2.2, PKEY2
CLRP0.2
LCALLDELAY
SETBP0.2
RET
PKEY3:JNBP2.3, PKEY3
LCALLD10MS
JNBP2.3, PKEY3
CLRP0.3
LCALLDELAY
SETBP0.3
RET
D10MS:MOVR7, #25;延时10MS
D1:MOVR6, #200
DJNZR6, $;美元符号表示原地跳转
DJNZR7, D1
RET
DELAY:MOVR3, #100;延时0.2S
D2:MOVR4, #20
D3:MOVR5, #248
D4:DJNZR5, D4;美元符号表示原地跳转
DJNZR4, D3
DJNZR3, D2
RET
END

读过代码的朋友,如果有不同意见,欢迎赐教,大家一起学习!