久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7608|回復: 1
打印 上一主題 下一主題
收起左側

51單片機1602鬧鐘萬年歷(asm匯編程序)

[復制鏈接]
跳轉到指定樓層
樓主
ID:72705 發表于 2015-1-24 16:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
;/********************************************************************************
;按K1,依次進入鬧鐘功能,鬧鐘時間,年,月,日和時,分,秒模式,直致退出設置狀態 *
;按K2,調整是否起用鬧鐘和調節鬧鐘時,分,秒,年,月,日,時間的時,分,秒的數字 *
;鬧鐘響時,按K2 即可停止鬧鐘的聲響 *
;正常狀態,上排最前面顯示一自定義字符,下排最前面閃動"crasy" *
;設置狀態,LCD 上排最前面顯示"P",下排最前面設置鬧鐘時顯示"alarm:",其他顯示"time:" *
;鬧鐘啟用時,在LCD 下排中間顯示一小喇叭,鬧鐘禁用時,無此小喇叭 *
;年代變化2000--2099,星期自動轉換 *
;**************變量的定義*****************
RS BIT P2.0 ;LCD 數據/命令選擇端(H/L)
RW BIT P2.1 ;LCD讀/寫選擇端(H/L)
EP BIT P2.2 ;LCD 使能控制
PRE BIT P1.7 ;調整鍵(K1)
ADJ BIT P1.6 ;調整鍵(K2)
SPK BIT P3.7 ;鬧鐘聲音輸出口
YEAR DATA 18H ;年,月,日變量
MONTH DATA 19H
DATE DATA 1AH
WEEK DATA 1BH
HOUR DATA 1CH ;時,分,秒,百分之一秒變量
MIN DATA 1DH
SEC DATA 1EH
SEC100 DATA 1FH
HOUR_ARM DATA 20H ;鬧鐘時,分,秒,變量
MIN_ARM DATA 21H
SEC_ARM DATA 22H
STATE DATA 23H
ALARM BIT STATE.0 ;鬧鐘是否啟用標志1--啟用,0--禁止
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 001BH
LJMP TIMER1
ORG 0100H
START: MOV SP,#60H
MOV R0,#18H
MOV A,#00H
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 R0,#40H
LCALL lcd_wcmd ;"01 000 000"第1 行地址 (D7D6 為地址設定命令形式 D5D4D3 為字符存放位置
MOV R0,#1FH
LCALL lcd_wdat ;"XXX 11111"第1 行數據(D7D6D5 為XXX,表示為任意數(一般用000),
MOV R0,#41H
LCALL lcd_wcmd ;"01 000 001"第2 行地址
MOV R0,#11H
LCALL lcd_wdat ;"XXX 10001"第2 行數據
MOV R0,#42H
LCALL lcd_wcmd ;"01 000 010"第3 行地址
MOV R0,#15H
LCALL lcd_wdat ;"XXX 10101"第3 行數據
MOV R0,#43H
LCALL lcd_wcmd ;"01 000 011"第4 行地址
MOV R0,#11H
LCALL lcd_wdat ;"XXX 10001"第4 行數據
MOV R0,#44H
LCALL lcd_wcmd ;"01 000 100"第5 行地址
MOV R0,#1FH
LCALL lcd_wdat ;"XXX 11111"第5 行數據
MOV R0,#45H
LCALL lcd_wcmd ;"01 000 101"第6 行地址
MOV R0,#0AH
LCALL lcd_wdat ;"XXX 01010"第6 行數據
MOV R0,#46H
LCALL lcd_wcmd ;"01 000 110"第7 行地址
MOV R0,#1FH
LCALL lcd_wdat ;"XXX 11111"第7 行數據
MOV R0,#47H
LCALL lcd_wcmd ;"01 000 111"第8 行地址
MOV R0,#00H
LCALL lcd_wdat ;"XXX 00000"第8 行數據
;第二個自定義字符:
MOV R0,#48H
LCALL lcd_wcmd ;"01 001 000"第1 行地址
MOV R0,#01H
LCALL lcd_wdat ;"XXX 00001"第1 行數據
MOV R0,#49H
LCALL lcd_wcmd ;"01 001 001"第2 行地址
MOV R0,#1BH
LCALL lcd_wdat ;"XXX 11011"第2 行數據
MOV R0,#4AH
LCALL lcd_wcmd ;"01 001 010"第3 行地址
MOV R0,#1DH
LCALL lcd_wdat ;"XXX 11101"第3 行數據
MOV R0,#4BH
LCALL lcd_wcmd ;"01 001 011"第4 行地址
MOV R0,#19H
LCALL lcd_wdat ;"XXX 11001"第4 行數據
MOV R0,#4CH
LCALL lcd_wcmd ;"01 001 100"第5 行地址
MOV R0,#1DH
LCALL lcd_wdat ;"XXX 11101"第5 行數據
MOV R0,#4DH
LCALL lcd_wcmd ;"01 001 101"第6 行地址
MOV R0,#1BH
LCALL lcd_wdat ;"XXX 11011"第6 行數據
MOV R0,#4EH
LCALL lcd_wcmd ;"01 001 110"第7 行地址
MOV R0,#01H
LCALL lcd_wdat ;"XXX 00001"第7 行數據
MOV R0,#4FH
LCALL lcd_wcmd ;"01 001 111"第8 行地址
MOV R0,#00H
LCALL lcd_wdat ;"XXX 00000"第8 行數據
MOV YEAR,#5 ;置年初值
MOV MONTH,#1 ;置月初值
MOV DATE,#1 ;置日初值
MOV DIS_S0,#43H ;"C"
MOV DIS_S1,#72H ;"r"
MOV DIS_S2,#61H ;"a"
MOV DIS_S3,#73H ;"s"
MOV DIS_S4,#79H ;"y"
MOV DIS_S5,#20H ;" "
MOV R1,#00H ;顯示一自定義字符
LCALL WEEK_PRO
LCALL UPDATE_BUF
LCALL DISPLAY_PRO ;屏顯初始化
;*********************主程序*********************
MAIN: MOV IE,#8AH ;CPU 開中斷,Timer0,Timer1 開中斷
MOV TMOD,#11H ;Timer0,Timer1 工作于模式1, 16 位定時方式
MOV TH0,#0DCH ;Timer0 置10ms 定時初值
MOV TL0,#00H
MOV TH1,#0FFH ;Timer1 置鬧鐘聲音初值
MOV TL1,#00H
SETB ALARM ;初始啟動鬧鐘功能
CLR TR1 ;Timer1 禁止
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 P1,#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
CJNE R4,#1,KEY_PRE_1 ;注意,該指令不改變操作
MOV R0,#0EH
LCALL LCD_WCMD ;顯示光標"_",整個光標不閃爍
MOV DIS_S0,#61H ;"a"
MOV DIS_S1,#6cH ;"l"
MOV DIS_S2,#61H ;"a"
MOV DIS_S3,#72H ;"r"
MOV DIS_S4,#6dH ;"m"
MOV DIS_S5,#3aH ;":"
MOV R1,#50H ;"P"
MOV DIS_H,HOUR_ARM
MOV DIS_M,MIN_ARM
MOV DIS_S,SEC_ARM
LCALL UPDATE_BUF
LCALL DISPLAY_PRO ;更新屏顯內容
MOV R0,#47H
LCALL LCD_POS ;使光標位于第一個調整項下
JMP KEY_PRE_E
KEY_PRE_1: CJNE R4,#2,KEY_PRE_2
MOV R0,#49H
LCALL LCD_POS ;光標置小時報警設置位置
JMP KEY_PRE_E
KEY_PRE_2: CJNE R4,#3,KEY_PRE_3
MOV R0,#4CH
LCALL LCD_POS ;光標置分鐘報警設置位置
JMP KEY_PRE_E
KEY_PRE_3: CJNE R4,#4,KEY_PRE_4
MOV R0,#4FH
LCALL LCD_POS ;光標置秒時報警設置位置
JMP KEY_PRE_E
KEY_PRE_4: CJNE R4,#5,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,#05H
LCALL LCD_POS ;光標置年調整位置
JMP KEY_PRE_E
KEY_PRE_5: CJNE R4,#6, KEY_PRE_6
MOV R0,#08H
LCALL LCD_POS ;光標置月調整位置
JMP KEY_PRE_E
KEY_PRE_6: CJNE R4,#7,KEY_PRE_7
MOV R0,#0bH
LCALL LCD_POS ;光標置日調整位置
JMP KEY_PRE_E
KEY_PRE_7: CJNE R4,#8,KEY_PRE_8
MOV R0,#49H
LCALL LCD_POS ;光標置時調整位置
JMP KEY_PRE_E
KEY_PRE_8: CJNE R4,#9,KEY_PRE_9
MOV R0,#4cH
LCALL LCD_POS ;光標置分調整位置
JMP KEY_PRE_E
KEY_PRE_9: CJNE R4,#10,KEY_PRE_10
MOV R0,#4fH
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 R5,FLAG
CJNE R5,#0,KEY_ADJ_0 ;FLAG=0,如果有鬧鐘聲音,就停止鬧鐘聲音
MOV C,TR1
JNC KEY_ADJ_A
CLR TR1
KEY_ADJ_A: JMP KEY_ADJ_E
KEY_ADJ_0: CJNE R5,#1,KEY_ADJ_1 ;FLAG=1,調整是否啟用鬧鐘
CPL ALARM
LCALL UPDATE_BUF
LCALL DISPLAY_PRO
MOV R0,#47H
LCALL LCD_POS
JMP KEY_ADJ_E
KEY_ADJ_1: CJNE R5,#2,KEY_ADJ_2 ;FLAG=2,調整鬧鐘時
INC HOUR_ARM
MOV A,HOUR_ARM
CJNE A,#24,KEY_ADJ_1_1
MOV HOUR_ARM,#0
KEY_ADJ_1_1: MOV DIS_H,HOUR_ARM
LCALL UPDATE_BUF
LCALL DISPLAY_PRO
MOV R0,#49H
LCALL LCD_POS
JMP KEY_ADJ_E
KEY_ADJ_2: CJNE R5,#3,KEY_ADJ_3 ;FLAG=3,調整鬧鐘分
INC MIN_ARM
MOV A,MIN_ARM
CJNE A,#60,KEY_ADJ_2_1
MOV MIN_ARM,#0
KEY_ADJ_2_1: MOV DIS_M,MIN_ARM
LCALL UPDATE_BUF
LCALL DISPLAY_PRO
MOV R0,#4CH
LCALL LCD_POS
JMP KEY_ADJ_E
KEY_ADJ_3: CJNE R5,#4,KEY_ADJ_4 ;FLAG=4,調整鬧鐘秒
INC SEC_ARM
MOV A,SEC_ARM
CJNE A,#60,KEY_ADJ_3_1
MOV SEC_ARM,#0
KEY_ADJ_3_1: MOV DIS_S,SEC_ARM
LCALL UPDATE_BUF
LCALL DISPLAY_PRO
MOV R0,#4FH
LCALL LCD_POS
JMP KEY_ADJ_E
KEY_ADJ_4: CJNE R5,#5,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,#6,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,#7,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,#8,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,#9,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,#10,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 ;"51C51 顯示1 秒鐘,消失一秒種,形成閃動
ANL A,#01
JZ TIMER0_1
MOV DIS_S0,#20H ;" "
MOV DIS_S1,#20H ;" "
MOV DIS_S2,#20H ;" "
MOV DIS_S3,#20H ;" "
MOV DIS_S4,#20H ;" "
MOV DIS_S5,#20H ;" "
SJMP TIMER0_2
TIMER0_1:
MOV DIS_S0,#43H ;"C"
MOV DIS_S1,#72H ;"r"
MOV DIS_S2,#61H ;"a"
MOV DIS_S3,#73H ;"s"
MOV DIS_S4,#79H ;"y"
MOV DIS_S5,#20H ;" "
TIMER0_2: MOV R1,#00H
MOV DIS_H,HOUR
MOV DIS_M,MIN
MOV DIS_S,SEC
LCALL UPDATE_BUF
LCALL DISPLAY_PRO
TIMER0_E:
RETI
;***********Timer1 定時中斷程序******************
TIMER1: MOV TH1,#0FFH
MOV TL1,#00H
CPL SPK
RETI
;**************時間日期處理函數******************
TIME_PRO: INC SEC ;秒處理
MOV A,SEC
CJNE A,#60,TIME_PRO_A
MOV SEC,#0
INC MIN ;分處理
MOV A,MIN
CJNE A,#60,TIME_PRO_A
MOV MIN,#0
INC HOUR ;時處理
MOV A,HOUR
CJNE A,#24,TIME_PRO_A
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
XRL A,#6
JZ TIME_PRO_D3
MOV A,MONTH
XRL A,#9
JZ TIME_PRO_D3
MOV A,MONTH
XRL A,#11
JZ TIME_PRO_D3
MOV A,DATE
XRL A,#32 ;大月日期31 天
JNZ TIME_PRO_W
SJMP TIME_PRO_M ;跳轉到月處理
TIME_PRO_D3: MOV A,DATE
XRL A,#31 ;小月日期30 天
JNZ TIME_PRO_W
TIME_PRO_M: MOV DATE,#1
INC MONTH ;月處理
MOV A,MONTH
CJNE A,#13,TIME_PRO_W
MOV MONTH,#1
INC YEAR ;年處理
MOV A,YEAR
CJNE A,#100,TIME_PRO_W
MOV YEAR,#0
TIME_PRO_W: LCALL WEEK_PRO ;星期處理
TIME_PRO_A: JNB ALARM,TIME_PRO_E ;alarm=0,鬧鐘功能禁用,不判斷鬧鐘時間是否到
MOV A,SEC
CJNE A,SEC_ARM,TIME_PRO_E ;alarm=1,鬧鐘功能啟用,判斷秒
MOV A,MIN
CJNE A,MIN_ARM,TIME_PRO_E ;alarm=1,鬧鐘功能啟用,判斷分
MOV A,HOUR
CJNE A,HOUR_ARM,TIME_PRO_E ;alarm=1,鬧鐘功能啟用,判斷時
SETB TR1 ;鬧鐘時間到,啟動Timer1(TR1=1)
TIME_PRO_E:
RET
;**********星期自動運算函數*********************
;星期運算常數W(5 或6)
;閏年的數目L(0--99 年:L=YEAR/4 整除)
;年數YEAR
;月參變數MONTH_TAB(0,3,3,6,1,4,6,2,5,0,3,5)
;日期DATE
;星期數=(W+L+YEAR+MONTH_TAB+DATE)%7 (求余)
WEEK_PRO: MOV A,MONTH ;確定星期運算常數W
XRL A,#1
JZ WEEK_PRO_1
MOV A,MONTH
XRL A,#2
JZ WEEK_PRO_1
SJMP WEEK_PRO_2
WEEK_PRO_1: LCALL LEAP_PRO
MOV C,LEAP
JNC WEEK_PRO_2
MOV R3,#5
SJMP WEEK_PRO_3
WEEK_PRO_2: MOV R3,#6
WEEK_PRO_3: MOV A,YEAR ;計算閏年的數目L
MOV B,#4
DIV AB
ADD A,R3 ;W+L
MOV R3,A
MOV A,YEAR
ADD A,R3 ;(W+L)+YEAR
MOV R3,A
MOV DPTR,#MONTH_TAB
MOV A,MONTH
MOVC A,@A+DPTR
ADD A,R3 ;(W+L+YEAR)+MONTH_TAB
MOV R3,A
MOV A,DATE
ADD A,R3 ;(W+L+YEAR+MONTH_TAB+DATE)
MOV B,#7
DIV AB ;余數即為星期數
MOV WEEK,B
RET
;**********閏年的判斷函數*********************
;閏年的條件:年(YEAR)能被4 整除、但不能被100 整除;或者被400 整除。
;如果我們只考慮(00--99),則只需考慮年(YEAR)能被4 整除即可。
LEAP_PRO: MOV A,YEAR
MOV B,#4
DIV AB
MOV A,B
JZ LEAP_PRO_1 ;能被4整除
CLR LEAP ;平年,清零LEAP
LJMP LEAP_PRO_E
LEAP_PRO_1: SETB LEAP ;閏年,置位LEAP
LEAP_PRO_E:
RET
;**********更新顯示緩沖區********************
;入口R1,
UPDATE_BUF: MOV DIS_BUF_U0,R1 ;調整時,"P",正常工作,顯示一自定義字符
MOV DIS_BUF_U1,#20H ;空格
MOV DIS_BUF_U2,#32H ;"2"
MOV DIS_BUF_U3,#30H ;"0"
MOV A,YEAR ;更新年數據
MOV B,#10
DIV AB
ADD A,#48 ;二進制轉換為ASCMA 碼
MOV DIS_BUF_U4,A
MOV A,B
ADD A,#48
MOV DIS_BUF_U5,A
MOV DIS_BUF_U6,#2DH ;"-"
MOV A,MONTH ;更新月數據
MOV B,#10
DIV AB
ADD A,#48
MOV DIS_BUF_U7,A
MOV A,B
ADD A,#48
MOV DIS_BUF_U8,A
MOV DIS_BUF_U9,#2DH ;"-"
MOV A,DATE ;更新日數據
MOV B,#10
DIV AB
ADD A,#48
MOV DIS_BUF_U10,A
MOV A,B
ADD A,#48
MOV DIS_BUF_U11,A
MOV DIS_BUF_U12,#20H;空格
MOV B,WEEK ;更新星期數據
MOV A,#3
MUL AB
MOV B,A
MOV DPTR,#WEEK_TAB
MOVC A,@A+DPTR
MOV DIS_BUF_U13,A
MOV A,B
INC A
MOVC A,@A+DPTR
MOV DIS_BUF_U14,A
MOV A,B
INC A
INC A
MOVC A,@A+DPTR
MOV DIS_BUF_U15,A
MOV A,DIS_S0
MOV DIS_BUF_L0,A
MOV A,DIS_S1
MOV DIS_BUF_L1,A
MOV A,DIS_S2
MOV DIS_BUF_L2,A
MOV A,DIS_S3
MOV DIS_BUF_L3,A
MOV A,DIS_S4
MOV DIS_BUF_L4,A
MOV A,DIS_S5
MOV DIS_BUF_L5,A
MOV DIS_BUF_L6,#20H ;空格
MOV C,ALARM
JC UPDATE_BUF_1
MOV DIS_BUF_L7,#20H ;鬧鐘禁用時,顯示空格
SJMP UPDATE_BUF_2
UPDATE_BUF_1: MOV DIS_BUF_L7,#01H ;鬧鐘啟用時,顯示小喇叭
UPDATE_BUF_2: MOV A,DIS_H
MOV B,#10
DIV AB
ADD A,#48
MOV DIS_BUF_L8,A
MOV A,B
ADD A,#48
MOV DIS_BUF_L9,A
MOV DIS_BUF_L10,#3AH;":"
MOV A,DIS_M
MOV B,#10
DIV AB
ADD A,#48
MOV DIS_BUF_L11,A
MOV A,B
ADD A,#48
MOV DIS_BUF_L12,A
MOV DIS_BUF_L13,#3AH;":"
MOV A,DIS_S
MOV B,#10
DIV AB
ADD A,#48
MOV DIS_BUF_L14,A
MOV A,B
ADD A,#48
MOV DIS_BUF_L15,A
RET
;************顯示處理程序*********************
DISPLAY_PRO: MOV R0,#00H
LCALL LCD_POS
MOV R0,DIS_BUF_U0
LCALL LCD_WDAT
MOV R0,DIS_BUF_U1
LCALL LCD_WDAT
MOV R0,DIS_BUF_U2
LCALL LCD_WDAT
MOV R0,DIS_BUF_U3
LCALL LCD_WDAT
MOV R0,DIS_BUF_U4
LCALL LCD_WDAT
MOV R0,DIS_BUF_U5
LCALL LCD_WDAT
MOV R0,DIS_BUF_U6
LCALL LCD_WDAT
MOV R0,DIS_BUF_U7
LCALL LCD_WDAT
MOV R0,DIS_BUF_U8
LCALL LCD_WDAT
MOV R0,DIS_BUF_U9
LCALL LCD_WDAT
MOV R0,DIS_BUF_U10
LCALL LCD_WDAT
MOV R0,DIS_BUF_U11
LCALL LCD_WDAT
MOV R0,DIS_BUF_U12
LCALL LCD_WDAT
MOV R0,DIS_BUF_U13
LCALL LCD_WDAT
MOV R0,DIS_BUF_U14
LCALL LCD_WDAT
MOV R0,DIS_BUF_U15
LCALL LCD_WDAT
MOV R0,#40H
LCALL LCD_POS
MOV R0,DIS_BUF_L0
LCALL LCD_WDAT
MOV R0,DIS_BUF_L1
LCALL LCD_WDAT
MOV R0,DIS_BUF_L2
LCALL LCD_WDAT
MOV R0,DIS_BUF_L3
LCALL LCD_WDAT
MOV R0,DIS_BUF_L4
LCALL LCD_WDAT
MOV R0,DIS_BUF_L5
LCALL LCD_WDAT
MOV R0,DIS_BUF_L6
LCALL LCD_WDAT
MOV R0,DIS_BUF_L7
LCALL LCD_WDAT
MOV R0,DIS_BUF_L8
LCALL LCD_WDAT
MOV R0,DIS_BUF_L9
LCALL LCD_WDAT
MOV R0,DIS_BUF_L10
LCALL LCD_WDAT
MOV R0,DIS_BUF_L11
LCALL LCD_WDAT
MOV R0,DIS_BUF_L12
LCALL LCD_WDAT
MOV R0,DIS_BUF_L13
LCALL LCD_WDAT
MOV R0,DIS_BUF_L14
LCALL LCD_WDAT
MOV R0,DIS_BUF_L15
LCALL LCD_WDAT
RET
;**********LCD忙標志BF 測試程序**************
BF_TEST: PUSH ACC ;保護ACC 數據
CLR RS ;RS=0
SETB RW ;RW=1
SETB EP ;E=高電平
NOP
NOP
NOP
NOP
MOV P0,#0FFH ;將p0 口置1,保證后面數據正確讀入(由 P0 口結構決定)
WT_BF: NOP ;
JB P0.7,WT_BF ;DB7=0 LCD 控制器空閑,DB7=1 LCD 控制器忙
CLR EP
POP ACC ;釋放ACC 數據
RET
;**********LCD指令寫入程序******************
;程序入口:R0
LCD_WCMD: LCALL BF_TEST ;檢測忙標志
CLR RS
CLR RW
CLR EP
NOP
NOP
MOV P0,R0
NOP
NOP
NOP
NOP
SETB EP
NOP
NOP
NOP
NOP
CLR EP
RET
;**********LCD數據寫入程序****************
;程序入口:R0
LCD_WDAT: LCALL BF_TEST ;檢測忙標志
SETB RS
CLR RW
CLR EP
NOP
NOP
MOV P0,R0
NOP
NOP
NOP
NOP
SETB EP
NOP
NOP
NOP
NOP
CLR EP
RET
;**********LCD數據指針位置子程序**************
;程序入口:R0
LCD_POS: MOV A,R0
ORL A,#80H
MOV R0,A
LCALL LCD_WCMD
RET
;**********延時約5ms 子程序********************
;晶振f=11.0592Mhz
;延時時間=(1+(1+2*100+2)*25)*12/11.0592=5507us(約5ms)
DELAY_5ms: MOV R7,#25
DELAY1: MOV R6,#100
DELAY2: DJNZ R6,DELAY2
DJNZ R7,DELAY1
RET
;***********星期自動運算月參變數**************
MONTH_TAB: DB 0
DB 0
DB 3
DB 3
DB 6
DB 1
DB 4
DB 6
DB 2
DB 5
DB 0
DB 3
DB 5
WEEK_TAB: DB 'S','U','N'
DB 'M','O','N'
DB 'T','U','E'
DB 'W','E','D'
DB 'T','H','U'
DB 'F','R','I'
DB 'S','A','T'
END


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:154212 發表于 2016-12-14 18:26 | 只看該作者
厲害呀  樓主
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本在线视频一区二区 | 亚洲视频免费 | 99re国产 | 91国内产香蕉 | 色吧色综合 | 国产精品成人国产乱一区 | 亚洲综合在线网 | 色精品视频 | av一二三四| 夜操| 精品中文字幕久久 | 亚洲a在线视频 | 欧洲一级毛片 | 91精品国产综合久久小仙女图片 | 亚洲一区二区久久久 | 久久精品国产99国产精品 | 午夜免费网站 | 最新中文字幕在线播放 | 国产精品1区2区 | 91精品国产91久久久久游泳池 | 黑人精品 | 亚洲精品成人在线 | 99视频在线看 | 国产在线一区二区三区 | 有码在线 | 免费在线一区二区 | 91精品国产高清一区二区三区 | 成人黄色av网址 | 97精品超碰一区二区三区 | www.色53色.com| 亚洲视频在线观看 | 青青草网站在线观看 | 成人免费区一区二区三区 | 日韩激情视频一区 | 精品一区二区三区在线视频 | 91精品国产91久久久久久 | 午夜免费福利电影 | 国产资源视频 | 久久久久久99 | 亚洲精品一 | 色久伊人|