;功能: 按住key2 1.5S左右,时位闪烁, 作报警信号,要求1KHz信号响100ms,500Hz信号响200ms
; 按key1 时位减1
; 按key2 时位加1
; 按住key1 1.5S左右,退出调整状态。
; 按住key2 1.5S左右,分位闪烁,
; 按key1 分位减1
; 按key2 分位加1
; 按住key1 1.5S左右,退出调整状态。
; 按住key2 1.5S左右,秒位闪烁,
; 按key1 秒位减1
; 按key2 秒位加1
; 按住key1 1.5S左右,退出调整状态。
; 按住key2 1.5S左右,时位闪烁,如此循环
; 暂时没有添加设置闹钟的功能。
; 汇编语言好困难啊.......
; 在调整时位和分位时,开着中断,当调整秒的时候,就关闭中断。
A0 BIT P3.3
A1 BIT P3.7
A2 BIT P3.5
ADDDIS EQU R0 ;显示程序查表值首地址寄存器
BITCOUNT EQU R1 ;显示程序中的位计数器
SECDATA EQU R2 ;秒显示缓冲寄存器
MINDATA EQU R3 ;分显示缓冲寄存器
HOUDATA EQU R4 ;时显示缓冲寄存器
DISCOUNT EQU R5 ;调整状态时显示程序中的计数器,和DISBIT一起配合。
INTCOUNT EQU R6 ;中断计数器
SHC EQU 2CH ;时的缓冲寄存器
FHC EQU 2BH ;分的缓冲寄存器
MHC EQU 2AH ;秒的缓冲寄存器
SSW EQU 25H ;时十位显示值
SGW EQU 24H ;时个位显示值
FSW EQU 23H ;分十位显示值
FGW EQU 22H ;分个位显示值
MSW EQU 21H ;秒十位显示值
MGW EQU 20H ;秒个位显示值
REGA EQU 28H ;暂存A值,类似堆栈
TDIS EQU 26H
TSKEY BIT 26H.0 ;按键KEY1按下的标志位
TSBIT BIT 26H.1 ;和TSBIT的四种组合决定时钟所处的状态,
TFBIT BIT 26H.2 ;四种状态在显示程序里面里面也做相应状态闪烁的标志
;TFBIT,TSBIT=00 正常的工作状态
;TFBIT,TSBIT=01 调整时钟状态
;TFBIT,TSBIT=10 调整分钟状态
;TFBIT,TSBIT=11 调整秒钟状态
DISBIT BIT 26H.3 ;在调整时间时,DISBIT=0,相应的调整位灭;DISBIT=1时,就亮?
KEY1 BIT P3.0
KEY2 BIT P3.1
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP INTT ;43
ORG 0050H
MAIN: MOV SECDATA, #30H
MOV MINDATA, #30H
MOV HOUDATA, #09H
MOV DISCOUNT, #40 ;修改此值可以改变在调整状态时的闪烁频率
MOV INTCOUNT , #00H
MOV TMOD, #01H
MOV TH0, #3CH
MOV TL0, #0B0H
SETB EA
SETB ET0
SETB TR0
DIS1: MOV TDIS, #00H
ACALL DISPLAY
JNB KEY2, TS
AJMP DIS1
;***********************判断KEY2按下的情况*************************
TS: ACALL DISPLAY
ACALL DISPLAY
JB KEY2, DIS1
MOV 34H,#50
TS_1: ACALL DISPLAY
JB KEY2, DIS1
DJNZ 34H, TS_1
SETB TSBIT
CLR TFBIT
TS_2: ACALL DISPLAY
JNB KEY2, TS_2
AJMP TSH ;跳到调整小时程序
;************************************************************
;**********************调整时间等待按键按下******************
TSH: SETB TSBIT
CLR TFBIT
TSH_1: ACALL DISPLAY
JNB KEY1, PADA
JNB KEY2, PADA
AJMP TSH_1
;***********************调整分位的标志置位*******************
TSF: CLR TSBIT ;TSBIT=0且TFBIT=1时代表调分标志位
SETB TFBIT
AJMP TSH_1
;***********************调整秒位的标志置位*******************
TSM: CLR TR0
SETB TFBIT
SETB TSBIT
AJMP TSH_1
;************************************************************
;************************************************************
PADA: ACALL DISPLAY
ACALL DISPLAY
JNB KEY1, PADA_1 ;按下就跳
JNB KEY2, PADA_2 ;按下就跳
;******************************************************
PADA_3: CLR TSKEY
JB TSBIT, TSH_B
JB TFBIT, TSF_B
AJMP DIS1
TSH_B: JB TFBIT, TSM_B
AJMP TSH
TSF_B: AJMP TSF
TSM_B: AJMP TSM
;******************************************************
PADA_1: SETB TSKEY
PADA_2: MOV 35H, #50
PADA_6: ACALL DISPLAY
JNB KEY1, PADA_4 ;按下就跳
JNB KEY2, PADA_4 ;按下就跳
JNB TSKEY, PADA_5 ;是KEY1按下吗?是就跳,做减1操作,否则表示是按下的是KEY2,做加1操作。
JB TSBIT, DECS
JB TFBIT, DECF
SETB TR0
AJMP DIS1
;*******************************************
PADA_4: DJNZ 35H, PADA_6
PADA_7: ACALL DISPLAY ;程序走到这里表示按键已经按下了1.5S,
JNB KEY1, PADA_7
JNB KEY2, PADA_7 ;判断是放开没有,没有放开就等待
JNB TSKEY, PADA_8 ;判断是KEY1按下吗?不是就跳
SETB TR0
CLR TSKEY
AJMP DIS1
;*****************切换到下一个调整变量(时位调整,分位调整,秒位调整)********
PADA_8: CLR TSKEY
JB TSBIT, TSH_A
JB TFBIT, TSF_A
SETB TR0
AJMP DIS1
TSH_A: JB TFBIT, TSM_A
AJMP TSF
TSF_A: AJMP TSM
TSM_A: SETB TR0
AJMP TSH
;*************************时,分,秒 加1程序********************
PADA_5: JB TSBIT, INCS
JB TFBIT, INCF
SETB TR0
AJMP DIS1
INCS: JB TFBIT, INCM
INCS_1: CJNE HOUDATA, #23H, INCS_2
MOV HOUDATA, #99H
INCS_2: MOV A, HOUDATA
ADD A, #1
DA A
MOV HOUDATA, A
AJMP PADA_3
INCF: CJNE MINDATA, #59H, INCF_1
MOV MINDATA, #99H
INCF_1: MOV A, MINDATA
ADD A, #1
DA A
MOV MINDATA, A
AJMP PADA_3
INCM: CJNE SECDATA, #59H, INCM_1
MOV SECDATA, #99H
INCM_1: MOV A, SECDATA
ADD A, #1
DA A
MOV SECDATA, A
AJMP PADA_3
;***************************************时减1************************
DECS: JB TFBIT, DECM
CJNE HOUDATA, #00H, DECS_1
MOV HOUDATA, #24H
DECS_2: DEC HOUDATA
AJMP PADA_3
DECS_1: MOV A, HOUDATA
ANL A, #0FH
CJNE A, #00H, DECS_2
MOV A, HOUDATA
DEC A
DA A
ADD A , #04H
SWAP A
DEC A
SWAP A
MOV HOUDATA, A
AJMP PADA_3
;***************************************分减1************************
DECF: CJNE MINDATA, #00H, DECF_1
MOV MINDATA, #59H
AJMP PADA_3
DECF_2: DEC MINDATA
AJMP PADA_3
DECF_1: MOV A, MINDATA
ANL A, #0FH
CJNE A, #00H, DECF_2
MOV A, MINDATA
DEC A
DA A
ADD A , #04H
SWAP A
DEC A
SWAP A
MOV MINDATA, A
AJMP PADA_3
;***************************************秒减1************************
DECM: CJNE SECDATA, #00H, DECM_1
MOV SECDATA, #59H
AJMP PADA_3
DECM_2: DEC SECDATA
AJMP PADA_3
DECM_1: MOV A, SECDATA
ANL A, #0FH
CJNE A, #00H, DECM_2
MOV A, SECDATA
DEC A
DA A
ADD A , #04H
SWAP A
DEC A
SWAP A
MOV SECDATA, A
AJMP PADA_3
;*****************中断服务程序************************
INTT: CLR TR0 ;1
INC INTCOUNT ;40
CJNE INTCOUNT, #14H, YANS_5 ;41
MOV INTCOUNT, #00H ;42
PUSH PSW ;2
MOV REGA, A ;3
NOP ;4
CJNE SECDATA, #59H, YANS_1 ;5
;*********************************
MOV SECDATA, #99H ;6
CJNE MINDATA, #59H, YANS_2 ;7
;*********************************
MOV MINDATA,#99H ;8
CJNE HOUDATA, #23H, YANS_3 ;9
;*********************************
MOV HOUDATA, #99H ;10
ACALL YANS_4 ;11
HOUR: MOV A,HOUDATA ;12
ADD A,#01H ;13
DA A ;14
MOV HOUDATA, A ;15
MINUTE: MOV A,MINDATA ;16
ADD A,#01H ;17
DA A ;18
MOV MINDATA, A ;19
SECOND: MOV A, SECDATA ;20
ADD A, #01H ;21
DA A ;22
MOV SECDATA, A ;23
MOV A, REGA ;24
POP PSW ;25
JIESU: SETB TR0 ;26
RETI ;27
YANS_1: MOV TL0, #0C5H ;28 YANS_1......YANS_5 里面的TL0和THO的值重装的不同,是因为在进入中断程序时
MOV TH0, #3CH ;29 把1秒的时间也加到里面去了。就是说进入了中断程序后,虽然关闭了定时器中断,
AJMP SECOND ;30 就自己计算了中断程序的时间,在重装TL0和TH0时减去了这段时间而保持了1秒钟的
YANS_2: MOV TL0, #0CCH ;31 精度。
MOV TH0, #3CH ;32
AJMP MINUTE ;33
YANS_3: MOV TL0, #0D3H ;34
MOV TH0, #3CH ;35
AJMP HOUR ;36
YANS_4: MOV TL0, #0D6H ;37
MOV TH0, #3CH ;38
RET ;39
YANS_5: MOV TL0, #0BBH ;44
MOV TH0, #3CH ;45
AJMP JIESU ;46
;************************显示程序*********************************
DISPLAY:
MOV SGW, HOUDATA
ANL SGW, #0FH ;时个位送数
MOV A, HOUDATA
SWAP A
MOV SSW, A
ANL SSW, #0FH ;时十位送数
MOV FGW, MINDATA
ANL FGW, #0FH
MOV A, MINDATA
SWAP A
MOV FSW, A
ANL FSW, #0FH
MOV MGW, SECDATA
ANL MGW, #0FH
MOV A, SECDATA
SWAP A
MOV MSW, A
ANL MSW, #0FH
MOV DPTR, #TABLE
MOV ADDDIS, #20H
MOV BITCOUNT, #00H
ACALL PADADIS ; //A2 A1 A0=000, 送秒个位//
ACALL DIS
ACALL PADADIS ; //A2 A1 A0=001, 送秒十位//
ACALL DIS
ACALL PADADIS ;//A2 A1 A0=010, 送分个位//
ACALL DIS
ACALL PADADIS ;//A2 A1 A0=011, 送分十位//
ACALL DIS
ACALL PADADIS ;//A2 A1 A0=100, 送时个位//
ACALL DIS
ACALL PADADIS ;//A2 A1 A0=101, 送时十位//
ACALL DIS
RET
DIS: MOV A,@ADDDIS
MOVC A,@A+DPTR
MOV P1,A
ACALL DELAY_1MS
MOV P1, #00H
INC ADDDIS
RET
;************************判断显示状态子程序********************
PADADIS:JB TSBIT, TSDIS
JB TFBIT, TFDIS
DEC DISCOUNT
CJNE DISCOUNT, #00H, PADADIS_1
MOV DISCOUNT, #40
PADADIS_1: AJMP DIS_2
TSDIS: JB TFBIT, TMDIS
CJNE BITCOUNT, #04H, TSDIS_1
AJMP DIS_4
TFDIS: CJNE BITCOUNT, #02H, TFDIS_1
AJMP DIS_4
TMDIS: CJNE BITCOUNT, #00H, TMDIS_1
AJMP DIS_4
TSDIS_1:CJNE BITCOUNT, #05H, DIS_2
AJMP DIS_4
TFDIS_1:CJNE BITCOUNT, #03H, DIS_2
AJMP DIS_4
TMDIS_1:CJNE BITCOUNT, #01H, DIS_2
AJMP DIS_4
DIS_4: DEC DISCOUNT
CJNE DISCOUNT, #00H, DIS_1
MOV DISCOUNT, #40
CPL DISBIT
DIS_1: JB DISBIT, DIS_2
MOV A, #06H
AJMP DIS_3
DIS_2: MOV A, BITCOUNT
DIS_3: RRC A
MOV A0, C
RRC A
MOV A1, C
RRC A
MOV A2, C
MOV A, BITCOUNT
CJNE A, #05H, DIS_5
MOV A, SSW
JNZ DIS_5
SETB A1
DIS_5: INC BITCOUNT
RET
;*****************延时1ms********************
DELAY_1MS:
MOV 30H, #14H
DEL_1MS:
MOV 31H, #50H
DJNZ 31H, $
DJNZ 30H, DEL_1MS
RET
;*****************显示表*********************
TABLE: DB 03FH ;0
DB 006H ;1
DB 05BH ;2
DB 04FH ;3
DB 066H ;4
DB 06DH ;5
DB 07DH ;6
DB 007H ;7
DB 07FH ;8
DB 06FH ;9
END
;*************************************************************
文章评论(0条评论)
登录后参与讨论