?? 12864f.txt
字號:
;**************變量的定義*****************
RS BIT P0.0 ;LCD數據/命令選擇端(H/L)
RW BIT P0.1 ;LCD讀/寫選擇端(H/L)
EP BIT P0.2 ;LCD使能控制
PRE BIT P1.4 ;調整鍵(K1)
ADJ BIT P1.5 ;調整鍵(K2)
comdat equ p2
led equ p0.3
YEAR DATA 18H ;年,月,日變量
MONTH DATA 19H
DATE DATA 1AH
WEEK DATA 1BH
HOUR DATA 1CH ;時,分,秒,百分之一秒變量
MIN DATA 1DH
SEC DATA 1EH
SEC100 DATA 1FH
STATE DATA 23H
LEAP BIT STATE.1 ;是否閏年標志1--閏年,0--平年
KEY_S DATA 24H ;當前掃描鍵值
KEY_V DATA 25H ;上次掃描鍵值
DIS_BUF_U0 DATA 26H ;LCD第一排顯示緩沖區
DIS_BUF_U1 DATA 27H
DIS_BUF_U2 DATA 28H
DIS_BUF_U3 DATA 29H
DIS_BUF_U4 DATA 2AH
DIS_BUF_U5 DATA 2BH
DIS_BUF_U6 DATA 2CH
DIS_BUF_U7 DATA 2DH
DIS_BUF_U8 DATA 2EH
DIS_BUF_U9 DATA 2FH
DIS_BUF_U10 DATA 30H
DIS_BUF_U11 DATA 31H
DIS_BUF_U12 DATA 32H
DIS_BUF_U13 DATA 33H
DIS_BUF_U14 DATA 34H
DIS_BUF_U15 DATA 35H
DIS_BUF_L0 DATA 36H ;LCD第三排顯示緩沖區
DIS_BUF_L1 DATA 37H
DIS_BUF_L2 DATA 38H
DIS_BUF_L3 DATA 39H
DIS_BUF_L4 DATA 3AH
DIS_BUF_L5 DATA 3BH
DIS_BUF_L6 DATA 3CH
DIS_BUF_L7 DATA 3DH
DIS_BUF_L8 DATA 3EH
DIS_BUF_L9 DATA 3FH
DIS_BUF_L10 DATA 40H
DIS_BUF_L11 DATA 41H
DIS_BUF_L12 DATA 42H
DIS_BUF_L13 DATA 43H
DIS_BUF_L14 DATA 44H
DIS_BUF_L15 DATA 45H
FLAG DATA 46H ;標識調整狀態 0-鬧鐘功能,1-鬧鐘時,2-鬧鐘分,3-鬧鐘秒
;4-年,5-月,6-日,7-時,8-分,9-秒,10-退出調整。
DIS_H DATA 47H
DIS_M DATA 48H
DIS_S DATA 49H
DIS_S0 DATA 4AH
DIS_S1 DATA 4BH
DIS_S2 DATA 4CH
DIS_S3 DATA 4DH
DIS_S4 DATA 4EH
DIS_S5 DATA 4FH
;******************初始化***********************
ORG 0000H
LJMP START
ORG 000BH
LJMP TIMER0
ORG 0100H
START: MOV SP,#60H
MOV R0,#18H
MOV A,#00H
clr led
MEM_INI: MOV @R0,A
INC R0
CJNE R0,#5FH,MEM_INI
LCALL DELAY_5ms ;初始化LCD
MOV R0,#38H ;設置LCD為16X2顯示,5X7點陣,八位數據接口
LCALL LCD_WCMD
LCALL DELAY_5ms
MOV R0,#0CH ;設置LCD開顯示及光標形式(光標不閃爍,不顯?-")
LCALL LCD_WCMD
LCALL DELAY_5ms
MOV R0,#06H ;LCD顯示光標移動設置(光標地址指針加1,整屏顯示不移動)
LCALL LCD_WCMD
LCALL DELAY_5ms
MOV R0,#01H ;清除LCD的顯示內容
LCALL LCD_WCMD
LCALL DELAY_5ms
MOV YEAR,#5 ;置年初值
MOV MONTH,#1 ;置月初值
MOV DATE,#1 ;置日初值
MOV DIS_S0,#77H ;"w"
MOV DIS_S1,#69H ;"i"
MOV DIS_S2,#6CH ;"l"
MOV DIS_S3,#6CH ;"l"
MOV DIS_S4,#61H ;"a"
MOV DIS_S5,#72H ;"r"
LCALL WEEK_PRO
LCALL UPDATE_BUF
LCALL DISPLAY_PRO ;屏顯初始化
;*********************主程序*********************
MAIN: MOV IE,#8AH ;CPU開中斷,Timer0,Timer1開中斷
MOV TMOD,#01H ;Timer0,Timer1工作于模式1, 16位定時方式
MOV TH0,#0DCH ;Timer0置10ms定時初值
MOV TL0,#00H
SETB TR0 ;Timer0啟動
MOV KEY_V,#03H
MAIN_1: LCALL KEY_SCAN
MOV A,KEY_S
XRL A,KEY_V
JZ MAIN_1
LCALL DELAY_5ms
LCALL DELAY_5ms
LCALL KEY_SCAN
MOV A,KEY_S
XRL A,KEY_V
JZ MAIN_1
MOV KEY_V,KEY_S
MOV A,KEY_V
XRL A,#01H
JNZ MAIN_2
CLR TR0 ;進入調整狀態,禁止Timer0
MOV IE,#00H ;CPU禁止中斷
LCALL KEY_PRE_PRO ;PRE按鍵按下,調用PRE按鍵處理程序
SJMP MAIN_1
MAIN_2: MOV A,KEY_V
XRL A,#02H
JNZ MAIN_1
LCALL KEY_ADJ_PRO ;ADJ按鍵按下,調用PRE按鍵處理程序
SJMP MAIN_1
;*******************按鍵掃描程序******************
KEY_SCAN: CLR A
MOV P3,#0FFH
MOV C,PRE
MOV ACC.1,C
MOV C,ADJ
MOV ACC.0,C
MOV KEY_S,A ;本次掃描鍵值存入KEY_S
RET
;**************PRE按鍵處理程序*******************
KEY_PRE_PRO: INC FLAG
MOV R4,FLAG
MOV R0,#0EH
LCALL LCD_WCMD ;顯示光標"_",整個光標不閃爍
KEY_PRE_4: CJNE R4,#1,KEY_PRE_5
MOV DIS_S0,#74H ;"t"
MOV DIS_S1,#69H ;"i"
MOV DIS_S2,#6dH ;"m"
MOV DIS_S3,#65H ;"e"
MOV DIS_S4,#3aH ;":"
MOV DIS_S5,#20H ;" "
MOV R1,#50H ;"P"
MOV DIS_H,HOUR
MOV DIS_M,MIN
MOV DIS_S,SEC
LCALL UPDATE_BUF
LCALL DISPLAY_PRO ;更新屏顯內容
MOV R0,#02H
LCALL LCD_POS ;光標置年調整位置
JMP KEY_PRE_E
KEY_PRE_5: CJNE R4,#2, KEY_PRE_6
MOV R0,#04H
LCALL LCD_POS ;光標置月調整位置
JMP KEY_PRE_E
KEY_PRE_6: CJNE R4,#3,KEY_PRE_7
MOV R0,#06H
LCALL LCD_POS ;光標置日調整位置
JMP KEY_PRE_E
KEY_PRE_7: CJNE R4,#4,KEY_PRE_8
MOV R0,#14H
LCALL LCD_POS ;光標置時調整位置
JMP KEY_PRE_E
KEY_PRE_8: CJNE R4,#5,KEY_PRE_9
MOV R0,#16H
LCALL LCD_POS ;光標置分調整位置
JMP KEY_PRE_E
KEY_PRE_9: CJNE R4,#6,KEY_PRE_10
MOV R0,#17H
LCALL LCD_POS ;光標置秒調整位置
JMP KEY_PRE_E
KEY_PRE_10: MOV FLAG,#0 ;FLAG到11,就清零
MOV R0,#0CH
LCALL LCD_WCMD ;設置LCD開顯示及光標不閃爍,不顯示"-"
MOV R0,#01H
LCALL LCD_WCMD ;清除LCD的顯示內容
MOV IE,#8AH ;CPU開中斷,TIMER0,TIMER1開中斷
SETB TR0 ;啟動TIMER0
KEY_PRE_E:
RET
;**************ADJ按鍵處理程序*******************
KEY_ADJ_PRO: MOV R0,#0CH
LCALL LCD_WCMD ;設置LCD開顯示及光標不閃爍,不顯示"-"
MOV R5,FLAG
KEY_ADJ_4: CJNE R5,#1,KEY_ADJ_5 ;FLAG=5,調整年
INC YEAR
MOV A,YEAR
CJNE A,#100,KEY_ADJ_4_1
MOV YEAR,#0
KEY_ADJ_4_1: LCALL WEEK_PRO
LCALL UPDATE_BUF
LCALL DISPLAY_PRO
MOV R0,#05H
LCALL LCD_POS
JMP KEY_ADJ_E
KEY_ADJ_5: CJNE R5,#2,KEY_ADJ_6 ;FLAG=6,調整月
INC MONTH
MOV A,MONTH
CJNE A,#13,KEY_ADJ_5_1
MOV MONTH,#1
KEY_ADJ_5_1: LCALL WEEK_PRO
LCALL UPDATE_BUF
LCALL DISPLAY_PRO
MOV R0,#08H
LCALL LCD_POS
JMP KEY_ADJ_E
KEY_ADJ_6: CJNE R5,#3,KEY_ADJ_7 ;FLAG=7,調整日
INC DATE
MOV A,MONTH
XRL A,#2
JNZ KEY_ADJ_6_2 ;不是二月跳轉
MOV A,DATE ;
MOV C,LEAP ;判斷是否閏年
JC KEY_ADJ_6_1
XRL A,#29 ;平年二月日期28天
JNZ KEY_ADJ_6_5
JMP KEY_ADJ_6_4
KEY_ADJ_6_1: XRL A,#30 ;閏年二月日期29天
JNZ KEY_ADJ_6_5
JMP KEY_ADJ_6_4 ;跳轉到月處理
KEY_ADJ_6_2: MOV A,MONTH
XRL A,#4
JZ KEY_ADJ_6_3
MOV A,MONTH
XRL A,#6
JZ KEY_ADJ_6_3
MOV A,MONTH
XRL A,#9
JZ KEY_ADJ_6_3
MOV A,MONTH
XRL A,#11
JZ KEY_ADJ_6_3
MOV A,DATE
XRL A,#32 ;大月日期31天
JNZ KEY_ADJ_6_5
JMP KEY_ADJ_6_4
KEY_ADJ_6_3: MOV A,DATE
XRL A,#31 ;小月日期30天
JNZ KEY_ADJ_6_5
KEY_ADJ_6_4: MOV DATE,#1
KEY_ADJ_6_5: LCALL WEEK_PRO
LCALL UPDATE_BUF
LCALL DISPLAY_PRO
MOV R0,#0BH
LCALL LCD_POS
JMP KEY_ADJ_E
KEY_ADJ_7: CJNE R5,#4,KEY_ADJ_8 ;FLAG=8,調整時
INC HOUR
MOV A,HOUR
CJNE A,#24,KEY_ADJ_7_1
MOV HOUR,#0
KEY_ADJ_7_1: MOV DIS_H,HOUR
LCALL UPDATE_BUF
LCALL DISPLAY_PRO
MOV R0,#49H
LCALL LCD_POS
JMP KEY_ADJ_E
KEY_ADJ_8: CJNE R5,#5,KEY_ADJ_9 ;FLAG=9,調整分
INC MIN
MOV A,MIN
CJNE A,#60,KEY_ADJ_8_1
MOV MIN,#0
KEY_ADJ_8_1: MOV DIS_M,MIN
LCALL UPDATE_BUF
LCALL DISPLAY_PRO
MOV R0,#4CH
LCALL LCD_POS
JMP KEY_ADJ_E
KEY_ADJ_9: CJNE R5,#6,KEY_ADJ_E ;FLAG=10,調整秒
INC SEC
MOV A,SEC
CJNE A,#60,KEY_ADJ_9_1
MOV SEC,#0
KEY_ADJ_9_1: MOV DIS_S,SEC
LCALL UPDATE_BUF
LCALL DISPLAY_PRO
MOV R0,#4FH
LCALL LCD_POS
JMP KEY_ADJ_E
KEY_ADJ_E:
RET
;***************Timer0定時中斷程序*****************
TIMER0: MOV TH0,#0DCH
MOV TL0,#00H
INC SEC100
MOV A,SEC100
CJNE A,#100,TIMER0_E
MOV SEC100,#0
LCALL TIME_PRO
MOV A,SEC ;"willar顯示1秒鐘,消失一秒種,形成閃動
ANL A,#01
JZ TIMER0_1
MOV DIS_S0,#"G"
MOV DIS_S1,#"u"
MOV DIS_S2,#"i"
MOV DIS_S3,#"L"
MOV DIS_S4,#"i"
MOV DIS_S5,#"n"
SJMP TIMER0_2
TIMER0_1: MOV DIS_S0,#"b"
MOV DIS_S1,#"u"
MOV DIS_S2,#"s"
MOV DIS_S3,#"^"
MOV DIS_S4,#"-"
MOV DIS_S5,#"^"
TIMER0_2:
MOV DIS_H,HOUR
MOV DIS_M,MIN
MOV DIS_S,SEC
LCALL UPDATE_BUF
LCALL DISPLAY_PRO
TIMER0_E:
RETI
;**************時間日期處理函數******************
TIME_PRO: INC SEC ;秒處理
MOV A,SEC
CJNE A,#60,TIME_PRO_e
MOV SEC,#0
INC MIN ;分處理
MOV A,MIN
CJNE A,#60,TIME_PRO_e
MOV MIN,#0
INC HOUR ;時處理
MOV A,HOUR
CJNE A,#24,TIME_PRO_e
MOV HOUR,#0
INC DATE ;日處理(日處理要考慮是否閏年,大月,小月)
MOV A,MONTH
XRL A,#2
JNZ TIME_PRO_D2 ;不是二月,轉TIME_PRO_D2
MOV A,DATE ;
MOV C,LEAP ;判斷是否閏年
JC TIME_PRO_D1
XRL A,#29 ;平年二月日期28天
JNZ TIME_PRO_W
SJMP TIME_PRO_M ;跳轉到月處理
TIME_PRO_D1: XRL A,#30 ;閏年二月日期29天
JNZ TIME_PRO_W
SJMP TIME_PRO_M ;跳轉到月處理
TIME_PRO_D2: MOV A,MONTH
XRL A,#4
JZ TIME_PRO_D3
MOV A,MONTH
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -