📄 alarm.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 + -