📄 闹铃3.txt
字号:
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_1,time0 ;时钟数据放临时变量
MOV LS_2,time1
MOV LS_3,time2
MOV SHOW_MOUDE,#1 ;显示模式1
MOV SHOW_PC,#LS_1 ;显示数据指针转临时变量
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_1
CJNE A,#59,NOT_RESET_S
MOV LS_1,#0
AJMP SetTimer_Again
NOT_RESET_S:
INC LS_1
AJMP SetTimer_Again
ADD_M: ;分加
CJNE A,#2,ADD_H
MOV A,LS_2
CJNE A,#59,NOT_RESET_M
MOV LS_2,#0
AJMP SetTimer_Again
NOT_RESET_M:
INC LS_2
AJMP SetTimer_Again
ADD_H: ;时加
MOV A,LS_3
CJNE A,#23,NOT_RESET_H
MOV LS_3,#0
AJMP SetTimer_Again
NOT_RESET_H:
INC LS_3
AJMP SetTimer_Again
SetTimer_KEY5:
CJNE A,#05,SetTimer_KEY6
MOV A,SHOW_MOUDE
CJNE A,#1,SUB_M ;秒减
MOV A,LS_1
CJNE A,#0,NOT_SET_S
MOV LS_1,#59
AJMP SetTimer_Again
NOT_SET_S:
DEC LS_1
AJMP SetTimer_Again
SUB_M: ;分减
CJNE A,#2,SUB_H
MOV A,LS_2
CJNE A,#0,NOT_SET_M
MOV LS_2,#59
AJMP SetTimer_Again
NOT_SET_M:
DEC LS_2
AJMP SetTimer_Again
SUB_H: ;时减
MOV A,LS_3
CJNE A,#0,NOT_SET_H
MOV LS_3,#23
AJMP SetTimer_Again
NOT_SET_H:
DEC LS_3
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 time0,LS_1
MOV time1,LS_2
MOV time2,LS_3
SJMP EXIT_SetTimer
RETURN_SetTimer:
AJMP SetTimer_Again
EXIT_SetTimer:
RET
SetRing: ;报警设置子程序
CLR LED_FLAG
MOV SHOW_MOUDE,#2 ;显示模式为2
MOV ShowRingData,#0 ;显示第一个报警时间
MOV SHOW_PC,#LS_1 ;临时变量地址送显示指针
ACALL RingDataChang ;更新显示
SetRing_Again:
MOV A,RingCount ;没有报警数据显示为空
CJNE A,#0,DSPLAY_0
MOV SHOW_MOUDE,#4
DSPLAY_0:
ACALL DISPLAY ;调用动态扫描子程序
ACALL COMP_DATA ;调用报警时间扫描子程序
MOV BeforKey,NowKey
ACALL GETKEY ;调用键盘扫描子程序
MOV NowKey,A
CJNE A,BeforKey,SetRing_Again
JNZ SetRing_KEY0
SETB KeyFlag
SJMP SetRing_Again
SetRing_KEY0:
JNB KeyFlag,SetRing_Again
CLR KeyFlag ;报警设置键值处理子程序
CJNE A,#2,SetRing_KEY2 ;增加一个报警
MOV A,RingCount
CJNE A,#40,ADD_ONE_RING ;若报警数据大于40
AJMP SetRing_Again
ADD_ONE_RING:
JNZ ADD_ONE_RING1 ;若报警数据等于0
MOV SHOW_MOUDE,#2
INC RingCount
MOV ShowRingData,#0
MOV RINGDATAL,#0
MOV RINGDATAH,#0
SJMP ADD_DATA_END
ADD_ONE_RING1:
MOV A,SHOW_MOUDE
CJNE A,#3,SetRing_Again ;判定显示模式是否为3
MOV SHOW_MOUDE,#2
MOV ShowRingData,RingCount
MOV A,#RINGDATAH
ADD A,ShowRingData
MOV R0,A
MOV @R0,#0
MOV A,#RINGDATAL
ADD A,ShowRingData
MOV R0,A
MOV @R0,#0
INC RingCount
ADD_DATA_END:
ACALL RingDataChang
AJMP SetRing_Again
SetRing_KEY2:
CJNE A,#1,SetRing_KEY3 ;删除一个报警
MOV A,RingCount
JNZ SUB_ONE_RING ;若报警数据等于0,终止这次操作
AJMP SetRing_Again
SUB_ONE_RING:
CJNE A,#1,SUB_ONE_RING1 ;若报警数据等于1
MOV ShowRingData,#0
DEC RingCount
RETURN_RING_SET:
AJMP SetRing_Again
SUB_ONE_RING1:
MOV A,SHOW_MOUDE
CJNE A,#3,RETURN_RING_SET ;判定显示模式是否为3
MOV SHOW_MOUDE,#2 ;显示模式为2
DEC RingCount
MOV A,ShowRingData
CJNE A,RingCount,TO_MOVE_LOOP
DEC ShowRingData
SJMP NOT_SUB_ShowRingData
TO_MOVE_LOOP:
MOV A,RingCount
ADD A,#RINGDATAH
MOV R2,A
MOV A,#RINGDATAL
ADD A,ShowRingData
MOV R0,A
MOV A,#RINGDATAH
ADD A,ShowRingData
MOV R1,A
MOVE_SUB_LOOP: ;报警数据前移
INC R0
MOV A,@R0
DEC R0
MOV @R0,A
INC R0
INC R1
MOV A,@R1
DEC R1
MOV @R1,A
INC R1
MOV A,R2
XRL A,R1
JNZ MOVE_SUB_LOOP
NOT_SUB_ShowRingData:
ACALL RingDataChang
AJMP SetRing_Again
SetRing_KEY3:
CJNE A,#3,SetRing_KEY4 ;设置位左移
MOV A,SHOW_MOUDE
CJNE A,#3,MOUDE_ADD
MOV SHOW_MOUDE,#1
AJMP SetRing_Again
MOUDE_ADD:
INC SHOW_MOUDE
AJMP SetRing_Again
SetRing_KEY4:
CJNE A,#4,SetRing_KEY5 ;设置数递增
MOV A,SHOW_MOUDE
CJNE A,#1,SetRing_ADD_H ;加分
MOV A,LS_1
CJNE A,#59,NOT_RESET_RING_M
MOV LS_1,#0
AJMP SetRing_Again
NOT_RESET_RING_M:
INC LS_1
AJMP SetRing_Again
SetRing_ADD_H: ;加时
CJNE A,#2,SetRing_ADD_RING
MOV A,LS_2
CJNE A,#23,NOT_RESET_RING_H
MOV LS_2,#0
AJMP SetRing_Again
NOT_RESET_RING_H:
INC LS_2
AJMP SetRing_Again
SetRing_ADD_RING: ;向上查看报警时间
MOV A,RingCount
CJNE A,#0,SetRing_ADD_RING1
AJMP SetRing_Again
SetRing_ADD_RING1:
CJNE A,#1,SetRing_ADD_RING2
AJMP SetRing_Again
SetRing_ADD_RING2:
ACALL ShowDataToMemory
MOV A,ShowRingData
INC A
CJNE A,RingCount,NOT_RESET_SHOW_RING
MOV ShowRingData,#0
SJMP ADDDataChang
NOT_RESET_SHOW_RING:
INC ShowRingData
ADDDataChang:
ACALL RingDataChang
AJMP SetRing_Again
SetRing_KEY5:
CJNE A,#5,SetRing_KEY6 ;设置数递减
MOV A,SHOW_MOUDE
CJNE A,#1,SetRing_SUB_H ;减分
MOV A,LS_1
CJNE A,#0,NOT_SET_RING_M
MOV LS_1,#59
AJMP SetRing_Again
NOT_SET_RING_M:
DEC LS_1
AJMP SetRing_Again
SetRing_SUB_H: ;减时
CJNE A,#2,SetRing_SUB_RING
MOV A,LS_2
CJNE A,#0,NOT_SET_RING_H
MOV LS_2,#23
AJMP SetRing_Again
NOT_SET_RING_H:
DEC LS_2
AJMP SetRing_Again
SetRing_SUB_RING: ;向下查看报警时间
MOV A,RingCount
CJNE A,#0,SetRing_SUB_RING1
AJMP SetRing_Again
SetRing_SUB_RING1:
CJNE A,#1,SetRing_SUB_RING2
AJMP SetRing_Again
SetRing_SUB_RING2:
ACALL ShowDataToMemory
MOV A,ShowRingData
CJNE A,#0,NOT_SET_SHOW_RING
MOV A,RingCount
DEC A
MOV ShowRingData,A
SJMP SUBDataChang
NOT_SET_SHOW_RING:
DEC ShowRingData
SUBDataChang:
ACALL RingDataChang
AJMP SetRing_Again
SetRing_KEY6:
CJNE A,#6,SetRing_KEY7 ;设置位右移
MOV A,SHOW_MOUDE
CJNE A,#1,MOUDE_SUB
MOV SHOW_MOUDE,#3
AJMP SetRing_Again
MOUDE_SUB:
DEC SHOW_MOUDE
AJMP SetRing_Again
SetRing_KEY7:
CJNE A,#7,SetRing_KEY8 ;退出
ACALL READ_DATA
SJMP SetRing_EXIT
SetRing_KEY8:
XRL A,#8 ;保存退出
JZ ROCESS_KEY8
AJMP SetRing_Again
ROCESS_KEY8:
ACALL ShowDataToMemory
ACALL CMP_DATA
ACALL WRITE_DATA
SetRing_EXIT:
SETB LED_FLAG
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,time0
CJNE A,#59,INC_time0 ; 秒的进制(60)
MOV time0,#0
MOV A,time1
CJNE A,#59,INC_time1 ; 分的进制(60)
MOV time1,#0
MOV A,time2
CJNE A,#23,INC_time2 ; 时的进制(24)
MOV time2,#0
SJMP COMP_RING
INC_time2:
INC time2
SJMP COMP_RING
INC_time1:
INC time1
SJMP COMP_RING
INC_time0:
INC time0
COMP_RING:
MOV A,time0
CJNE A,#10,INT_TI_EXIT ;打铃时间(10S)
CLR P3.4
INT_TI_EXIT:
POP ACC
POP PSW
RETI
CMP_DATA: ;数据排序子程序
MOV A,RingCount
CJNE A,#0,CMP_RINGDATA1
AJMP TEMP_EXIT
CMP_RINGDATA1:
XRL A,#1
JZ TEMP_EXIT
MOV R3,RingCount
DEC R3
CMP_DATA_LOOP_2:
MOV A,R3
MOV R2,A
MOV R0,#RINGDATAL
MOV R1,#RINGDATAH
CMP_DATA_LOOP_1:
MOV A,@R1
INC R1
CLR C
SUBB A,@R1
JZ NEXT_TEMP
JNC TEMP_DATA1 ;X(i)>X(i+1)
SJMP NOT_TEMP1
NEXT_TEMP:
MOV A,@R0
INC R0
CLR C
SUBB A,@R0
JNC TEMP_DATA2
SJMP NOT_TEMP2
TEMP_DATA1:
INC R0
TEMP_DATA2: ;数据交换子程序
MOV A,@R0
DEC R0
XCH A,@R0
INC R0
MOV @R0,A
MOV A,@R1
DEC R1
XCH A,@R1
INC R1
MOV @R1,A
SJMP NOT_TEMP2
NOT_TEMP1:
INC R0
NOT_TEMP2:
DJNZ R2,CMP_DATA_LOOP_1
DJNZ R3,CMP_DATA_LOOP_2
TEMP_EXIT:
RET
RingDataChang: ;更新显示数据
MOV A,#RINGDATAL
ADD A,ShowRingData
MOV R0,A
MOV A,@R0
MOV LS_1,A
MOV A,#RINGDATAH
ADD A,ShowRingData
MOV R0,A
MOV A,@R0
MOV LS_2,A
MOV LS_3,ShowRingData
INC LS_3
RET
ShowDataToMemory: ;保存显示数据
MOV A,#RINGDATAL
ADD A,ShowRingData
MOV R0,A
MOV @R0,LS_1
MOV A,#RINGDATAH
ADD A,ShowRingData
MOV R0,A
MOV @R0,LS_2
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -