?? 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設定狀態(tài),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 ;鬧鐘緩沖區(qū)初始化
LCALL DISBUF_INITIAL
MOV TIME_50MS,#20 ;定時計數,一次50ms,20次1秒
SETB F0 ;標志位,標志是否進入時間設定狀態(tài),
;F0=1,進入時間設定狀態(tài)
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 ;進入設定狀態(tài)
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 ;結束設定狀態(tài),返回
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子程序
;初始化時鐘顯示緩沖區(qū)
;*****************************************************************
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
;***************** 時間二進制緩沖區(qū)初始化 ***********************
MOV SECOND,#00H
MOV MINUTE,#00H
MOV HOUR,#00H
RET
;*****************************************************************
;ALARM_INITIAL子程序
;初始化鬧鐘顯示緩沖區(qū)
;*****************************************************************
ALARM_INITIAL:
MOV 5AH,#0 ;鬧鐘緩沖時清零
MOV 5BH,#0 ;鬧鐘緩沖分清零
MOV 5CH,#0 ;鬧鐘緩沖秒清零
SETB ALARM ;鬧鐘關閉
CLR ALARM_FLAG ;清除鬧鐘標志,初始不進入鬧鐘設定狀態(tài)
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 + -