⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 闹铃3.txt

📁 采用单片机控制的自动打铃器
💻 TXT
📖 第 1 页 / 共 2 页
字号:
	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 + -