;7279键盘电路 ;该程序是要做一个时钟,可以通过6个键分别加减时,分,秒.下面程序中时钟程序没问题,可以稳定运行(p1.4整分亮灯) ;为了检查是否有键按下,我到P1.5接了个灯,有键时就亮,也没问题,但在用特殊的键调节时钟时出了问题 ;六个按键键值如下:04秒加, 07秒减, 0C分加, 0F分减, 14时加,17时减 ;以下这个是没加入调节的程序,可以稳定运行 ORG 0000H LJMP MAIN ORG 000BH LJMP IT_0 ORG 0030H MAIN: MOV 30H, #00H ;时 MOV 31H, #00H ;分 MOV 32H, #00H ;秒 MOV 33H, #00H ;0.1秒 MOV 40H, #00H ;以下为6个数码管的显示缓冲区40-45 MOV 41H, #00H MOV 42H, #00H MOV 43H, #00H MOV 44H, #00H MOV 45H, #00H MOV SP , #67H MOV TMOD,#01H ;至100ms定时 MOV TH0, #3CH MOV TL0, #0B0H MOV IP, #02H MOV IE, #82H ;开t0中断 SETB TR0 LP: mov a,32h ;每到整分时亮灯 cjne a,#00h,MM clr p1.4 ;我用的是低电平点亮 MM: mov a,32h ;2秒后关闭(到这里都没有问题) cjne a,#02h,KK setb p1.4 KK: ACALL KEY1 ;按键点灯(只要有键按下就亮,这也没有问题) CJNE A,#0FFH,KI1 SETB P1.5 SJMP LP KI1: CLR P1.5 ;如我想用cjne语句加在这里(如cjne a,#0cH,LL)来判断返回值是否为0c,是的话,分钟加一) ;如下 ;cjne a,#0ch,LL ;判断返回是否是0c,是的话加一 ;MOV A,31H ;ADD A,#01H ;MOV 31H,A ;但在次处我不知如何处理,我试过用一标志位来控制长按住只加一下,但不行 ;我也试过放一个一秒的延时,7279只响应一下就再不能加,而且放开键本来会灭的P1.5也不会灭掉 LL: ;acall xs 如果放这则不行 SJMP LP IT_0: MOV TH0,#3CH MOV TL0,#0B0H INC 33H MOV A,33H CJNE A,#0ah,LP3 ;到达10个100ms转到秒(32H)处 LP3: JC LP4 MOV 33H,#00H ;0.1秒清0 MOV A, 32H ADD A, #01H ;秒加一 DA A MOV 32H, A CJNE A,#60H,LP5 ;到达60秒后分加一,(以下相同) LP5: JC LP4 MOV 32H,#00H MOV A,31H ADD A,#01H DA A MOV 31H,A CJNE A,#60H,LP6 LP6: JC LP4 MOV 31H,#00H MOV A, 30H ADD A, #01H DA A MOV 30H, A CJNE A,#24H,LP7 ;24小时 LP7: JC LP4 MOV 30H,#00H LP4: ACALL XS ;调用显示,在数码管上显示 (还有,如果我把这句放到主程序中则显示混乱) RETI KEY1: CLR P1.0 ;读键子程序 cs=0 (这个程序为判断是否有键按下) MOV R6,#0CH LO1: DJNZ R6,LO1 MOV A,#15H ;发送读键指令(15为读键盘指令,返回键号,若没键按下,则返回ff) ACALL STFS MOV R6,#06H LO2: DJNZ R6,LO2 ;延时25秒 ACALL STJS MOV B,A SETB P1.0 RET XS: MOV A,32h ;显示子程序(已调,没有问题) PUSH ACC SWAP A ANL A,#0FH MOV 44H,A ;44等为显示缓冲区 LCALL DTR ;调用7279的显示程序 POP ACC ANL A,#0FH MOV 45H,A LCALL DTR MOV A,31h PUSH ACC SWAP A ANL A,#0FH MOV 42H,A LCALL DTR POP ACC ANL A,#0FH ADD A,#10H MOV 43H,A LCALL DTR MOV A,30h PUSH ACC SWAP A ANL A,#0FH MOV 40H,A LCALL DTR POP ACC ANL A,#0FH ADD A,#10H MOV 41H,A LCALL DTR ret DTR: MOV R5,#06H ;六个数码管 MOV R0,#40H ;显示缓存的地址 MOV R1,#95H ;命令字送r1 Lk1: CLR P1.0 ;cs=0 MOV R6,#0CH Lk2: DJNZ R6,Lk2 ;延时50us MOV A,R1 ACALL STFS MOV R6,#06H Lk3: DJNZ R6,Lk3 ;延时25us MOV A,@R0 ;查表指令 ADD A,#0DH MOVC A,@A+PC ACALL STFS MOV R6,#02H ;延时8us Lk4: DJNZ R6,Lk4 SETB P1.0 ;p1.0接cs INC R0 DEC R1 DJNZ R5,Lk1 RET DB 7EH,30H,6DH,79H,33H,5BH,5FH,70H ;(1-8) DB 7FH,7BH,77H,1FH,4EH,3DH,4FH,47H ;(9-f) DB 0FEH,0B0H,0EDH,0F9H,0B3H,0DBH,0DFH,0F0H ;(因为在时分处加了小数点,所以在此处加了这些数) DB 0FFH,0FBH STFS: MOV R7,#08H ;发送一个字节程序 (一下以下这两个程序没问题,可以直接使用) LP11: RLC A MOV P1.2,C ;pi.2接TXD(CLK)(数据输出线) SETB P1.1 ;P1.1接RXD(数据输入线) MOV R6,#02H LP12: DJNZ R6,LP12 CLR P1.1 MOV R6,#02H LP13: DJNZ R6,LP13 DJNZ R7,LP11 RET STJS: MOV R7,#08H ;接收一个字节程序 LP21: SETB P1.1 SETB P1.2 MOV R6,#02H LP22: DJNZ R6,LP22 MOV C,P1.2 RLC A CLR P1.1 MOV R6,#02H LP23: DJNZ R6,LP23 DJNZ R7,LP21 RET END