SETB C ;进外部中断0,则把C置位 SETB TF0;立刻对按键做出反应,迅速切换模式 RETI
;**********数码管显示模块************************************* INT_T2:CLR TF2H;清除中断标志位 PUSH ACC;保护现场 PUSH PSW PUSH DPL PUSH DPH MOV DPTR,#TAB1
MOV A,FLAG;FLAG的值决定当前显示哪一位数码管 ANL A,#03H ;防止FLAG大于3,循环扫描四位数码管 MOV FLAG,A INC FLAG RL A JMP @A+DPTR
TAB1:AJMP NUM0 ;分别对应四个数码管显示分支程序 AJMP NUM1 AJMP NUM2
AJMP NUM3
NUM0:MOV P1,#00H;关闭显示,防治切换数码管位时显示错乱 CLR P0.7 ;选择显示数码管第0位 CLR P0.6
MOV A,BIT0;0位显示的数码送给A LCALL SHOW ;调用数码显示管子程序
MOV C,DOT0 ;DOT0为1则显示该位数码管的小数点 MOV P1.0,C
LJMP RETEN ;返回
NUM1:MOV P1,#00H
CLR P0.7 ;选择显示数码管第1位 SETB P0.6 MOV A,BIT1 LCALL SHOW MOV C,DOT1 MOV P1.0,C
LJMP RETEN
NUM2:MOV P1,#00H
16
SETB P0.7 ;选择显示数码管第2位
CLR P0.6 MOV A,BIT2 LCALL SHOW MOV C,DOT2 MOV P1.0,C
LJMP RETEN
NUM3:MOV P1,#00H SETB P0.7 ;选择显示数码管第3位
SETB P0.6 MOV A,BIT3 LCALL SHOW MOV C,DOT3 MOV P1.0,C
LJMP RETEN
RETEN:POP DPH POP DPL POP PSW POP ACC
RETI
;***数码管显示子程序********* SHOW:MOV DPTR,#TAB2 RL A JMP @A+DPTR
TAB2:AJMP CASE0 ;11个分支分别对应数字0~9和分隔符号“-”。 AJMP CASE1 AJMP CASE2 AJMP CASE3 AJMP CASE4 AJMP CASE5 AJMP CASE6 AJMP CASE7 AJMP CASE8 AJMP CASE9 AJMP CASE10
CASE0:MOV P1,#0FCH;显示“0” RET
17
CASE1:MOV P1,#60H ;显示“1” RET
CASE2:MOV P1,#0DAH;显示“2”
RET
CASE3:MOV P1,#0F2H;显示“3” RET
CASE4:MOV P1,#066H;显示“4” RET
CASE5:MOV P1,#0B6H;显示“5” RET
CASE6:MOV P1,#0BEH;显示“6” RET
CASE7:MOV P1,#0E0H;显示“7” RET
CASE8:MOV P1,#0FEH;显示“8” RET
CASE9:MOV P1,#0F6H;显示“9” RET
CASE10:MOV P1,#02H;显示“-” RET
;*****键盘扫描模块(子程序)*************************** FINDKEY: MOV P2,#0EFH
JNB P2.0,KEY0 ;用到键盘上K0,K1,K2,K3来选择模式 JNB P2.1,KEY1 JNB P2.2,KEY2 JNB P2.3,KEY3 RET
KEY0:ACALL DELAY10m ;延迟去抖 JB P2.0,RET_KEY MOV A,#00H
;K0对应模式0
CJNE A,KEYNUM,NEWKEY0
RET
;两次按键相等模式不变不需要切换模式
NEWKEY0:MOV KEYNUM,#00H;保存按键值 SETB OVER ;按下按键后不再按时间自动切换模式 SETB TF0 ;立刻对按键做出反应,迅速切换模式
RET
18
KEY1:ACALL DELAY10m JB P2.1,RET_KEY MOV A,#01H
;K1对应模式1
CJNE A,KEYNUM,NEWKEY1 RET
;两次按键相等模式不变不需要切换模式
NEWKEY1:MOV KEYNUM,#01H;保存按键值 SETB OVER
SETB TF0;立刻对按键做出反应,迅速切换模式
RET
KEY2:ACALL DELAY10m JB P2.2,RET_KEY MOV A,#02H
;K2对应模式2
CJNE A,KEYNUM,NEWKEY2 RET
;两次按键相等模式不变不需要切换模式
NEWKEY2:MOV KEYNUM,#02H;保存按键值 SETB OVER
SETB TF0;立刻对按键做出反应,迅速切换模式
RET
KEY3:ACALL DELAY10m JB P2.3,RET_KEY MOV A,#03H ;K3对应模式3,计时模式 CJNE A,KEYNUM,NEWKEY3 RET
;两次按键相等模式不变不需要切换模式
NEWKEY3:MOV KEYNUM,#03H;保存按键值 SETB OVER
SETB TF0;立刻对按键做出反应,迅速切换模式
RET
RET_KEY:RET
;*********延迟20us*********
DELAY20u:MOV R1,#1EH ;R2控制循环次数 DJNZ R1,$ RET
;*********延迟10ms********* DELAY10m:MOV R2,#50 LOOP1:MOV R3,#10 LOOP2:LCALL DELAY20u DJNZ R3,LOOP2
19
DJNZ R2,LOOP1
RET
;*********延迟约0.3s*********
DELAY0_5:MOV R2,#100 LOOPA:MOV R3,#100 LOOPB:LCALL DELAY20u DJNZ R3,LOOPB DJNZ R2,LOOPA
RET
;********************************************************* ; Peripheral specific initialization functions, ; Called from the Init_Device label PCA_Init:
anl PCA0MD, #0BFh mov PCA0MD, #000h ret
Timer_Init:
mov TMOD, #011h mov CKCON, #002h MOV TH0,#0E7H ;T0装入初值0.1S,CPL
MOV TL0,#014H
MOV TH1,#03H ;T1装入初值1SCPL,0.5HZ MOV TL1,#0BEH
mov TMR2RLL, #0C7h mov TMR2RLH, #0FCh mov TMR2L, #0C7h mov TMR2H, #0FCh
CLR TF2LEN
;NO LOW OVERINT
CLR T2SPLIT;16
ret
Port_IO_Init:
mov P0MDOUT, #001h mov P3MDOUT, #002h mov XBR1, #040h
20