貌似有几天没写了,最近忙呀,没有写的都不打算写了,谁叫自己当天没写,今天学的独立键盘,不打算过多的阐述,具体的代码解释可参见程序中的注释,其实注释不就是我的思维的体现了嘛。只说一点,就是汇编的按键检测,用的是对累加器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
读过代码的朋友,如果有不同意见,欢迎赐教,大家一起学习!