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

📄 alarm.asm

📁 ateml89s51单片机
💻 ASM
字号:
;测试版
;***************************************************************
RS             	BIT     P3.4
R_W             BIT     P3.5
ENABLE          BIT     P3.3
ALARM		BIT	P3.2				;闹钟指示
TIME_GO_FLAG	BIT	00H				;标志位,1表示定时1秒钟到
ALARM_FLAG	BIT	01H				;闹铃标志,1设定状态,0设定结束
DB0_DB7         DATA    P1
;****************************************************************
;R6,R7:延时程序用于计数
;R3,R4,R5终端中使用
;R2:KEY_SCAN子程序:键扫描计数
;****************************************************************		
		ORG	0000H
		SJMP	MAIN
		ORG	000BH
		LJMP	INTERRUPT
		ORG	0040H
MAIN:		MOV	SP,#5FH
		
		LCALL	ALARM_INITIAL			;闹钟缓冲区初始化
		LCALL	DISBUF_INITIAL
		
		MOV	TIME_50MS,#20			;定时计数,一次50ms,20次1秒
		SETB	F0				;标志位,标志是否进入时间设定状态,
							;F0=1,进入时间设定状态
		MOV	TMOD,#01H			;定时初始化,定时50ms
		MOV	TL0,#0B0H
		MOV	TH0,#3CH
	
		SETB	EA
		
	
		LCALL	CLS
		LCALL	LCD_INITIAL			;LCD初始化
		

		MOV     A,#10000000B           		 ;set the address
                CALL    Write_instruction
                MOV     DPTR,#SET_TIME
                CALL    PR_STRING

MAIN_LOOP:   	LCALL	DISPLAY
		MOV	C,TIME_GO_FLAG
		JNC	NEXT
		LCALL	TIME_GO
		LCALL	CHECK_ALARM
NEXT:		LCALL	KEY_SCAN
		CJNE	A,#08H,DELAY_YES		;无键按下,不需要延时
		SJMP	JMP_DELAY
DELAY_YES:	LCALL	DELAY1
JMP_DELAY:	MOV	TEMP,A				;散转
		RL	A
		ADD	A,TEMP
		MOV	DPTR,#PMTB
		JMP	@A+DPTR
PMTB:		LJMP	PM0
		LJMP	PM1
		LJMP	PM2
		LJMP	PM3
		LJMP	PM4
		LJMP	PM5
		LJMP	PM6
		LJMP	PM7
		LJMP    MAIN_LOOP

;*****************************************************************
;PM0:定时设定开关,k0按下,开始时间设定,再次按下,结束设定
;*****************************************************************
PM0:		MOV	C,F0				;进入设定状态
		JC	SET_OVER
		CLR	ET0
		CLR	TR0
		SETB	F0
				
		LCALL	CLS
		MOV     A,#10000000B            ;set the address
                CALL    Write_instruction
                MOV     DPTR,#SET_TIME
                CALL    PR_STRING

		LJMP	MAIN_LOOP

SET_OVER:	MOV	TH0,#3CH
		MOV	TL0,#0B0H
		SETB	ET0
		SETB	TR0				;结束设定状态,返回
		CLR	F0
		LCALL	CLS
	
		MOV     A,#10000000B            	;set the address
                CALL    Write_instruction
                MOV     DPTR,#LINE1
                CALL    PR_STRING

		LJMP	MAIN_LOOP
;*****************************************************************
;PM1:k1按下,秒加1
;*****************************************************************
PM1:		MOV	C,F0
		JNC	RET_PM1

		MOV	A,SECOND
		CJNE	A,#59,SEC_UP
		MOV	SECOND,#0
		LJMP	MAIN_LOOP
SEC_UP:		INC	SECOND
RET_PM1:	LJMP	MAIN_LOOP
;*****************************************************************
;PM2:k2按下,分加1
;*****************************************************************
PM2:		MOV	C,ALARM_FLAG
		JC	ALARM_MIN_SET			;闹钟设定有效	
		MOV	C,F0
		JNC	RET_PM2
		MOV	A,MINUTE			;时间设定有效
		CJNE	A,#59,MIN_UP
		MOV	MINUTE,#0
		SJMP	RET_PM2

ALARM_MIN_SET:	MOV	A,ALARM_MIN		
		CJNE	A,#59,ALARM_MIN_UP
		MOV	ALARM_MIN,#0
		SJMP	RET_PM2
MIN_UP:		INC	MINUTE
		SJMP	RET_PM2
ALARM_MIN_UP:	INC	ALARM_MIN
RET_PM2:	LJMP	MAIN_LOOP
;*****************************************************************
;PM3:k3按下,时加1
;*****************************************************************
PM3:		MOV	C,ALARM_FLAG
		JC	ALARM_HOU_SET
		MOV	C,F0
		JNC	RET_PM3
		MOV	A,HOUR
		CJNE	A,#23,HOU_UP
		MOV	HOUR,#0
		SJMP	RET_PM3

ALARM_HOU_SET:	MOV	A,ALARM_HOU
		CJNE	A,#23,ALARM_HOU_UP
		MOV	ALARM_HOU,#0
		SJMP	RET_PM3
HOU_UP:		INC	HOUR
		SJMP	RET_PM3
ALARM_HOU_UP:	INC	ALARM_HOU
RET_PM3:	LJMP	MAIN_LOOP

PM4:		LJMP	MAIN_LOOP
PM5:		LJMP	MAIN_LOOP
PM6:		LJMP	MAIN_LOOP
;*****************************************************************
;PM7:k7按下,闹铃设定开启
;*****************************************************************
PM7:		MOV	C,F0
		JC	RET_ALARM
		MOV	C,ALARM_FLAG
		JC	ALARM_SET_OVER
		SETB	ALARM_FLAG

		LCALL	CLS
		MOV     A,#10000000B            ;set the address
                CALL    Write_instruction
                MOV     DPTR,#ALARM_SET
                CALL    PR_STRING

		SJMP	RET_ALARM
ALARM_SET_OVER:	CLR	ALARM_FLAG
		
		LCALL	CLS
		MOV     A,#10000000B            ;set the address
                CALL    Write_instruction
                MOV     DPTR,#LINE1
                CALL    PR_STRING

RET_ALARM:	LJMP	MAIN_LOOP
;*****************************************************************
;INTERRUPT:中断处理程序
;*****************************************************************
INTERRUPT:	PUSH	ACC
		PUSH	PSW
		PUSH	00H				;R0入栈保护
		MOV	TL0,#0B0H
		MOV	TH0,#3CH
		DJNZ	TIME_50MS,RET_INT
		SETB	TIME_GO_FLAG
		MOV	TIME_50MS,#20			;1秒钟	
RET_INT:	POP	00H
		POP	PSW
		POP	ACC
		RETI
;*****************************************************************
;CHECK_ALARM子程序:判闹钟时间到
;*****************************************************************
CHECK_ALARM:	MOV	A,HOUR
		MOV	TEMP,ALARM_HOU
		CJNE	A,TEMP,NO_ALARM
		MOV	A,MINUTE
		MOV	TEMP,ALARM_MIN
		CJNE	A,TEMP,NO_ALARM
		MOV	A,ALARM_SEC
		CJNE	A,#0,RET_CHECK
		CLR	ALARM
		SJMP	RET_CHECK
NO_ALARM:	SETB	ALARM
RET_CHECK:	RET
;*****************************************************************
;KEY_SCAN子程序:键扫描
;*****************************************************************
KEY_SCAN:
		MOV	A,P0
		CJNE	A,#0FFH,KEY_CONFIRM
		SJMP	NO_KEY_DOWN
KEY_CONFIRM:	LCALL	DELAY
		MOV	A,P0
		CJNE	A,#0FFH,KEY_DOWN
		SJMP	NO_KEY_DOWN
KEY_DOWN:	MOV	KEY,#0
		MOV	R2,#8
KEY_LOOP:	RRC	A
		JNC	FOUND
		INC	KEY
		DJNZ	R2,KEY_LOOP
FOUND:		MOV	A,KEY
		RET
NO_KEY_DOWN:	MOV	A,#08H
		RET
;*****************************************************************
;TIME_GO子程序:时钟增长
;*****************************************************************
TIME_GO:	
		MOV	A,SECOND
		CJNE	A,#59,SEC_ADD
		MOV	SECOND,#0
		MOV	A,MINUTE
		CJNE	A,#59,MIN_ADD
		MOV	MINUTE,#0
		MOV	A,HOUR
		CJNE	A,#23,HOU_ADD
		MOV	HOUR,#0
		SJMP	RET_GO
HOU_ADD:	INC	HOUR
		SJMP	RET_GO
MIN_ADD:	INC	MINUTE
		SJMP	RET_GO
SEC_ADD:	INC	SECOND
RET_GO:		CLR	TIME_GO_FLAG
		RET

;*****************************************************************
;BINARY_TO_BCD子程序
;入口R3,出口R4
;*****************************************************************
BINARY_TO_BCD:	
		MOV	R4,#0
		MOV	R5,#8
		
BCD_LOOP:	CLR	C
		MOV	A,R3
		RLC	A
		MOV	R3,A
		MOV	A,R4			;低位在R4
		ADDC	A,R4
		DA	A
		MOV	R4,A
		DJNZ	R5,BCD_LOOP
		RET
;*****************************************************************
;DISBUF_INITIAL子程序
;初始化时钟显示缓冲区
;*****************************************************************
DISBUF_INITIAL:
		MOV	A,#00H
		MOV	R7,#8
		MOV	R0,#HOU_HIGH
CLR_BUF:	MOV	@R0,A				
		INC	R0
		DJNZ	R7,CLR_BUF
		MOV	42H,#0AH			;分秒中间的'-'
		MOV	45H,#0AH
;***************** 时间二进制缓冲区初始化 ***********************
		MOV	SECOND,#00H
		MOV	MINUTE,#00H
		MOV	HOUR,#00H
		RET

;*****************************************************************
;ALARM_INITIAL子程序
;初始化闹钟显示缓冲区
;*****************************************************************
ALARM_INITIAL:
		MOV	5AH,#0				;闹钟缓冲时清零
		MOV	5BH,#0				;闹钟缓冲分清零
		MOV	5CH,#0				;闹钟缓冲秒清零
		SETB	ALARM				;闹钟关闭
		CLR	ALARM_FLAG			;清除闹钟标志,初始不进入闹钟设定状态
		RET
;*****************************************************************
;DISPLAY子程序
;时钟显示
;*****************************************************************
DISPLAY:		
		MOV     A,#11000000B          		;设置显示初始位置,第二行开始显示
                CALL    Write_instruction

		MOV	C,ALARM_FLAG
		JC	ALARM_DISP
              	
		MOV	R3,SECOND
		LCALL	TO_SEC_BUF			;将时钟秒值转移到秒的显示缓冲
		MOV	R3,MINUTE
		LCALL	TO_MIN_BUF
		MOV	R3,HOUR
		LCALL	TO_HOU_BUF
		SJMP	DIS_START

ALARM_DISP:	MOV	R3,ALARM_SEC
		LCALL	TO_SEC_BUF
		MOV	R3,ALARM_MIN
		LCALL	TO_MIN_BUF
		MOV	R3,ALARM_HOU
		LCALL	TO_HOU_BUF

DIS_START:	MOV	R0,#HOU_HIGH
DIS_LOOP:	MOV	A,@R0
                MOV	DPTR,#TABLE
		MOVC	A,@A+DPTR
                CALL    WriteLCDData
		INC	R0
                CJNE	R0,#48H,DIS_LOOP
               
		RET
;*****************************************************************
;TO_SEC_BUF子程序
;将时钟秒值转移到秒的显示缓冲,入口参数R3
;*****************************************************************
TO_SEC_BUF:	LCALL	BINARY_TO_BCD
		MOV	A,R4
		ANL	A,#0FH
		MOV	SEC_LOW,A
		MOV	A,R4
		ANL	A,#0F0H
		SWAP	A
		MOV	SEC_HIGH,A
		RET
;*****************************************************************
;TO_MIN_BUF子程序
;将时钟分值转移到分的显示缓冲,入口参数R3
;*****************************************************************
TO_MIN_BUF:	LCALL	BINARY_TO_BCD
		MOV	A,R4
		ANL	A,#0FH
		MOV	MIN_LOW,A
		MOV	A,R4
		ANL	A,#0F0H
		SWAP	A
		MOV	MIN_HIGH,A
		RET
;*****************************************************************
;TO_HOU_BUF子程序
;将时钟时值转移到时的显示缓冲,入口参数R3
;*****************************************************************
TO_HOU_BUF:	LCALL	BINARY_TO_BCD
		MOV	A,R4
		ANL	A,#0FH
		MOV	HOU_LOW,A
		MOV	A,R4
		ANL	A,#0F0H
		SWAP	A
		MOV	HOU_HIGH,A
		RET
;*****************************************************************
;LCD_INITIAL子程序
;定LCM使用8bits汇流排、显示两行、使用5×7字型、显示器要显示、光标
;要显示但不闪烁
;*****************************************************************
LCD_INITIAL:
                MOV     A,#00111000B
                CALL    Write_instruction

                MOV     A,#00001100B
                CALL    Write_instruction

                MOV     A,#00000110B
                CALL    Write_instruction
                RET
;*****************************************************************
;CheckBusy

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -