2.2 系统整体设计
3 作息时间控制钟软件设计
SHOW_NUMBER:;段码
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DB 40H
SHOW_NULL:;空码
DB 00H,38H,38H,3EH,37H,00H
SHOW_BIT_CODE:;位码
DB 0DFH,0EFH,0F7H,0FBH,0FDH,0FEH
;------------------
DISPLAY:;显示子程序
MOV R1,#6
SHOW_AGAIN:
MOV A,SHOW_MOUDE
XRL A,#4
JZ SHOW_CHAR
MOV A,R1
ACALL GETCODE ;调用得到位数据子程序
MOV DPTR,#SHOW_NUMBER
MOVC A,@A+DPTR
SJMP SHOW_TO_CODE
SHOW_CHAR: ;显示模式为4则显示字符NULL
MOV DPTR,#SHOW_NULL
MOV A,R1
DEC A
MOVC A,@A+DPTR
SHOW_TO_CODE:
MOV SHOW_BIT,#0FFH;-------显示数据屏蔽
MOV SHOW_CODE,A
MOV A,R1
MOV DPTR,#SHOW_BIT_CODE-1
MOVC A,@A+DPTR
MOV SHOW_BIT,A
MOV R7,#1
ACALL Delay1ms
DJNZ R1,SHOW_AGAIN
MOV SHOW_BIT,#0FFH;--------显示数据屏蔽
RET
Delay1ms: ;-----------延时1MS
MOV R5,#2
DELAY:MOV R6,#0
DJNZ R6,$
DJNZ R5,DELAY
DJNZ R7,Delay1ms
RET
GETCODE:;得到位数据子程序
MOV B,#10
DEC A
RL A
MOV DPTR,#FIND_BIT
JMP @A+DPTR
FIND_BIT:;位散转
SJMP SHOW_0
SJMP SHOW_1
SJMP SHOW_2
SJMP SHOW_3
SJMP SHOW_4
SJMP SHOW_5
SHOW_0:;得到位0数据
MOV R0,SHOW_MOUDE
CJNE R0,#1,SHOW_LED_0
JB S_Flash,SHOW_LED_0
MOV A,#10
RET
SHOW_LED_0:
MOV R0,SHOW_PC
MOV A,@R0
DIV AB
MOV A,B
RET
SHOW_1:;得到位1数据
MOV R0,SHOW_MOUDE
CJNE R0,#1,SHOW_LED_1
JB S_Flash,SHOW_LED_1
MOV A,#10
RET
SHOW_LED_1:
MOV R0,SHOW_PC
MOV A,@R0
DIV AB
RET
SHOW_2:;得到位2数据
MOV R0,SHOW_MOUDE
CJNE R0,#2,SHOW_LED_2
JB S_Flash,SHOW_LED_2
MOV A,#10
RET
SHOW_LED_2:
MOV R0,SHOW_PC
INC R0
MOV A,@R0
DIV AB
MOV A,B
RET
SHOW_3:;得到位3数据
MOV R0,SHOW_MOUDE
CJNE R0,#2,SHOW_LED_3
JB S_Flash,SHOW_LED_3
MOV A,#10
RET
SHOW_LED_3:
MOV R0,SHOW_PC
INC R0
MOV A,@R0
DIV AB
RET
SHOW_4:;得到位4数据
MOV R0,SHOW_MOUDE
CJNE R0,#3,SHOW_LED_4
JB S_Flash,SHOW_LED_4
MOV A,#10
RET
SHOW_LED_4:
MOV R0,SHOW_PC
INC R0
INC R0
MOV A,@R0
DIV AB
MOV A,B
RET
SHOW_5:;得到位5数据
MOV R0,SHOW_MOUDE
CJNE R0,#3,SHOW_LED_5
JB S_Flash,SHOW_LED_5
MOV A,#10
RET
SHOW_LED_5:
MOV R0,SHOW_PC
INC R0
INC R0
MOV A,@R0
DIV AB
RET
COMP_DATA:;报警扫描子程序
MOV A,RingCount
JZ COMP_EXIT
MOV A,CLOCK_DATA0
JNZ COMP_EXIT
MOV R2,RingCount
COMP_LOOP:
MOV A,RINGDATAH
CJNE A,CLOCK_DATA2,NEXT_COMP
MOV A,RINGDATAL
CJNE A,CLOCK_DATA1,NEXT_COMP
SETB P3.4
SJMP COMP_EXIT
NEXT_COMP:
INC R0
INC R1
DJNZ R2,COMP_LOOP
COMP_EXIT:
RET
3.2.5 键盘扫描子程序
系统利用独立式键盘,作为系统的输入设备,可以实现对时钟的调整,以及对响铃报警时间的设置,具有
GETKEY:;扫描键盘得到键值子程序
MOV A,P1
CJNE A,#0FEH,GOTO_KEY2
MOV A,#1
RET
GOTO_KEY2:
CJNE A,#0FDH,GOTO_KEY3
MOV A,#2
RET
GOTO_KEY3:
CJNE A,#0FBH,GOTO_KEY4
MOV A,#3
RET
GOTO_KEY4:
CJNE A,#0F7H,GOTO_KEY5
MOV A,#4
RET
GOTO_KEY5:
CJNE A,#0EFH,GOTO_KEY6
MOV A,#5
RET
GOTO_KEY6:
CJNE A,#0DFH,GOTO_KEY7
MOV A,#6
RET
GOTO_KEY7:
CJNE A,#0BFH,GOTO_KEY8
MOV A,#7
RET
GOTO_KEY8:
CJNE A,#07FH,KEY_EXIT
MOV A,#8
RET
KEY_EXIT:
MOV A,#0
RET
SetTimer:;时钟设置子程序
MOV LS_S,CLOCK_DATA0;时钟数据放临时变量
MOV LS_M,CLOCK_DATA1
MOV LS_H,CLOCK_DATA2
MOV SHOW_MOUDE,#1;显示模式1
MOV SHOW_PC,#LS_S;显示数据指针转临时变量
SetTimer_Again:
ACALL DISPLAY;调用显示扫描子程序
ACALL COMP_DATA;调用报警扫描子唾弃
MOV BeforKey,NowKey
ACALL GETKEY ;调用键值扫描子程序
MOV NowKey,A
CJNE A,BeforKey,SetTimer_Again
CJNE A,#0,SetTimer_KEY0
SETB KeyFlag
SJMP SetTimer_Again
SetTimer_KEY0:
JNB KeyFlag,SetTimer_Again
CLR KeyFlag;健值控制
CJNE A,#03,SetTimer_KEY4;模式左移
MOV A,SHOW_MOUDE
CJNE A,#3,SHOW_MOUDE_ADD
MOV SHOW_MOUDE,#1
AJMP SetTimer_Again
SHOW_MOUDE_ADD:
INC SHOW_MOUDE
AJMP SetTimer_Again
SetTimer_KEY4:
CJNE A,#04,SetTimer_KEY5
MOV A,SHOW_MOUDE
CJNE A,#1,ADD_M;秒加
MOV A,LS_S
CJNE A,#59,NOT_RESET_S
MOV LS_S,#0
AJMP SetTimer_Again
NOT_RESET_S:
INC LS_S
AJMP SetTimer_Again
ADD_M:;分加
CJNE A,#2,ADD_H
MOV A,LS_M
CJNE A,#59,NOT_RESET_M
MOV LS_M,#0
AJMP SetTimer_Again
NOT_RESET_M:
INC LS_M
AJMP SetTimer_Again
ADD_H:;时加
MOV A,LS_H
CJNE A,#23,NOT_RESET_H
MOV LS_H,#0
AJMP SetTimer_Again
NOT_RESET_H:
INC LS_H
AJMP SetTimer_Again
SetTimer_KEY5:
CJNE A,#05,SetTimer_KEY6
MOV A,SHOW_MOUDE
CJNE A,#1,SUB_M;秒减
MOV A,LS_S
CJNE A,#0,NOT_SET_S
MOV LS_S,#59
AJMP SetTimer_Again
NOT_SET_S:
DEC LS_S
AJMP SetTimer_Again
SUB_M:;分减
CJNE A,#2,SUB_H
MOV A,LS_M
CJNE A,#0,NOT_SET_M
MOV LS_M,#59
AJMP SetTimer_Again
NOT_SET_M:
DEC LS_M
AJMP SetTimer_Again
SUB_H:;时减
MOV A,LS_H
CJNE A,#0,NOT_SET_H
MOV LS_H,#23
AJMP SetTimer_Again
NOT_SET_H:
DEC LS_H
AJMP SetTimer_Again
SetTimer_KEY6:;模式右移
CJNE A,#06,SetTimer_KEY7
MOV A,SHOW_MOUDE
CJNE A,#1,SHOW_MOUDE_SUB
MOV SHOW_MOUDE,#3
AJMP SetTimer_Again
SHOW_MOUDE_SUB:;退出
DEC SHOW_MOUDE
AJMP SetTimer_Again
SetTimer_KEY7:
CJNE A,#07,SetTimer_KEY8
SJMP EXIT_SetTimer
SetTimer_KEY8:;保存退出
CJNE A,#08,RETURN_SetTimer
MOV CLOCK_DATA0,LS_S
MOV CLOCK_DATA1,LS_M
MOV CLOCK_DATA2,LS_H
SJMP EXIT_SetTimer
RETURN_SetTimer:
AJMP SetTimer_Again
EXIT_SetTimer:
RET
INT_T1:;T1中断子程序
PUSH PSW
PUSH ACC
CPL S_Flash
JB LED_FLAG,NOT_CONTROL0
SETB P3.1
SJMP NOT_CONTROL
NOT_CONTROL0:
MOV C,S_Flash
MOV P3.1,C
NOT_CONTROL:
JB S_Flash,INT_TI_EXIT
MOV A,CLOCK_DATA0
CJNE A,#59,INC_CLOCK_DATA0
MOV CLOCK_DATA0,#0
MOV A,CLOCK_DATA1
CJNE A,#59,INC_CLOCK_DATA1
MOV CLOCK_DATA1,#0
MOV A,CLOCK_DATA2
CJNE A,#23,INC_CLOCK_DATA2
MOV CLOCK_DATA2,#0
SJMP COMP_RING
INC_CLOCK_DATA2:
INC CLOCK_DATA2
SJMP COMP_RING
INC_CLOCK_DATA1:
INC CLOCK_DATA1
SJMP COMP_RING
INC_CLOCK_DATA0:
INC CLOCK_DATA0
COMP_RING:
MOV A,CLOCK_DATA0
CJNE A,#20,INT_TI_EXIT
CLR P3.4
INT_TI_EXIT:
POP ACC
POP PSW
RETI
END