学习了, 很不错的经验,值得分享 |
已经解决了,是因为 “ CJNE R1,#0FFH,D2 ” 中的比较出问题,我将p3状态给了r1,然后和0ff比较,实际上P3高四位是做别的用途,状态不定的。 所以改成如下,屏蔽掉高四位: D2: MOV A,P3 ;用r1和ff比较大小,从而判断是否释放 ANL A,#0FH CJNE A,#0FH,D2 再烧录就可以了。 ![]() |
本帖最后由 ahshmj 于 2013-8-28 08:37 编辑 第一次看见这样的按键程序。 KEYCHECK1: JNB P3.0, K1 JNB P3.1, K2 JNB P3.2, K3 JNB P3.3, K4 JMP KEYCHECK1 K1: CALL DELAY ;延时 JB P3.0, START ;再次确认不是误动作 CPL P2.0 ;执行按键功能 JNB P3.0, $ ;等待按键抬起 LJMP START 返回 K2: ...... K3: ...... K4 ...... |
ORG 0000H AJMP START ORG 0080H START: MOV P2,#0FFH KEY1: MOV A,P3 CJNE A,#0FFH,KEY2 AJMP KEY1 KEY2: ACALL DELAY MOV A,P3 CJNE A,#0FFH,KEY3 AJMP KEY1 KEY3: MOV R0,P3 KEY4: MOV A,P3 CJNE A,#0FFH,KEY4 MOV A,R0 CJNE A,#0FEH,KEY01 CPL P2.0 KEY01: CJNE A,#0FDH,KEY02 CPL P2.1 KEY02: CJNE A,#0FBH,KEY03 CPL P2.2 KEY03: CJNE A,#0F7H,KEY1 CPL P2.3 AJMP KEY1 DELAY: MOV R7,#100 ;延时程序,目的为消除机械抖动 D1: MOV R6,#100 DJNZ R6,$ DJNZ R7,D1 RET END 自己看看,这个仿真过。 |