實(shí)時(shí)時(shí)鐘課題要求:
實(shí)時(shí)時(shí)鐘系統(tǒng)設(shè)計(jì)
1、用 1 個(gè)撥動(dòng)開關(guān)設(shè)定“工作狀態(tài)”和“設(shè)置狀態(tài)”;
2、“設(shè)置狀態(tài)”下,用 4 個(gè)獨(dú)立按鍵實(shí)現(xiàn)時(shí)間設(shè)置:“+”“-”、“移位”、“確認(rèn)”,
對年(2 位)、月、日、時(shí)、分、秒進(jìn)行每 1 位的數(shù)值設(shè)置;
3、采用 DS1302 時(shí)鐘芯片,采用 LCD 進(jìn)行時(shí)鐘顯示
Proteus7.8仿真效果如下:
protesu仿真效果.png (70.54 KB, 下載次數(shù): 106)
下載附件
Proteus仿真效果
2019-1-21 18:46 上傳
(注:Proteus仿真源文件見附件)
匯編代碼如下:
- /*******************************實(shí)時(shí)時(shí)鐘實(shí)驗(yàn)(Zidone)*************************************************/
- /***********LCD12864相關(guān)定義******************/
- //指定管腳
- LCD_E BIT P2.0 /*12864使能口*/
- LCD_DI BIT P3.0 /*12864數(shù)據(jù)命令選擇*/
- LCD_RW BIT P3.1 /*12864讀寫選擇*/
- LCD_RST BIT P3.3 /*12864復(fù)位*/
- LCD_CS1 BIT P3.2 /*12864選屏*/
- LCD_CS2 BIT P2.1 /*12864選屏*/
- //指定存放地址
- LCD_CMD EQU 30H /*12864命令存放地址*/
- LCD_DATA EQU 31H /*12864數(shù)據(jù)存放地址*/
- LCD_PAGE EQU 32H /*起始B8H 存放頁數(shù)(用于字符或漢字)*/
- LCD_COLUMN EQU 33H /*起始40H 存放列數(shù)*/
- /***********DS1302相關(guān)定義******************/
- //指定管腳
- T_CLK BIT P2.6 /*DS1302時(shí)鐘口*/
- T_IO BIT P2.7 /*DS1302輸入輸出口*/
- T_RST BIT P2.5 /*DS1302復(fù)位口*/
- //指定存放地址
- SECOND EQU 40H /*秒分時(shí)日月周年低位年高位存儲(chǔ)地址*/
- MINUTE EQU 41H
- HOUR EQU 42H
- DAY EQU 43H
- MONTH EQU 44H
- WEEK EQU 45H
- YEARL EQU 46H
- YEARH EQU 47H
- //命令字
- WR_SECOND EQU 80H
- RD_SECOND EQU 81H
- WR_MINUTE EQU 82H
- RD_MINUTE EQU 83H
- WR_HOUR EQU 84H
- RD_HOUR EQU 85H
- WR_DAY EQU 86H
- RD_DAY EQU 87H
- WR_MONTH EQU 88H
- RD_MONTH EQU 89H
- WR_WEEK EQU 8AH
- RD_WEEK EQU 8BH
- WR_YEAR EQU 8CH
- RD_YEAR EQU 8DH
- WR_PROTECT EQU 8EH
- RD_PROTECT EQU 8FH
- /*********用戶開關(guān)及按鍵管腳定義***************/
- MODE_SELECT BIT P0.0 /*模式選擇管腳:默認(rèn)高電平,1-正常計(jì)時(shí)模式,0-時(shí)間設(shè)定模式*/
- BIT_SELECT BIT P0.1 /*移位選擇需要修改的參數(shù),使其閃爍,表明選中*/
- MODE_INC BIT P0.2 /*加*/
- MODE_DEC BIT P0.3 /*減*/
- MODE_ENSURE BIT P0.4 /*確認(rèn)*/
- /**************主程序**************************/
- ORG 0000H
- LJMP MAIN
- ORG 0100H
- MAIN:
- MOV SP,#60H
- //DS1302初始默認(rèn)時(shí)間設(shè)置
- MOV YEARH,#20H
- MOV YEARL,#19H
- MOV MONTH,#01H
- MOV DAY,#05H
- MOV WEEK,#06H
- MOV HOUR,#21H
- MOV MINUTE,#18H
- MOV SECOND,#00H
-
- LCALL DS1302Init /*DS1302初始設(shè)置*/
- LCALL Lcd12864Init /*LCD12864初始化*/
- //選擇左半屏
- SETB LCD_CS2
- CLR LCD_CS1
- //左半屏需要顯示的固定漢字
- LCALL Write_NIAN /*’年‘*/
- LCALL Write_SHI /*’時(shí)‘*/
- LCALL Write_XING /*’星‘*/
- LCALL Write_QI_1 /*’期‘左一半*/
- //選擇右半屏
- SETB LCD_CS1
- CLR LCD_CS2
- //右半屏需要顯示的固定漢字
- LCALL Write_YUE /*’月‘*/
- LCALL Write_RI /*‘日’*/
- LCALL Write_FEN /*‘分’*/
- LCALL Write_MIAO /*‘秒’*/
- LCALL Write_QI_2 /*‘期’右邊一半*/
-
- LOOP1:
- JB MODE_SELECT,LOOP2 /*狀態(tài)選擇,閉合低電平為時(shí)間設(shè)置狀態(tài),斷開高電平(默認(rèn)狀態(tài))正常計(jì)時(shí)狀態(tài)*/
- LCALL DELAY10MS /*軟件消抖*/
- JB MODE_SELECT,LOOP2
- LCALL DS1302SetTime
- LOOP2:
- LCALL DS1302GetData
- LCALL DS1302ShowTime
- LCALL DELAY800MS
- LJMP LOOP1
- /***************通過按鍵設(shè)定DS1302的起始時(shí)間**************************/
- /*
- 首先判斷模式選擇開關(guān):
- 1.沒有按下,執(zhí)行正常顯示的程序(也是彈開后重新執(zhí)行顯示程序)
- 2.按下后,執(zhí)行時(shí)間設(shè)置程序
- 其次判斷移位選擇開關(guān):
- 1.沒有按下,默認(rèn)選擇修改年高位
- 2.按下,切換需要修改的參數(shù)(順序?yàn)椋喝缦聵?biāo)識(shí)),并使其閃爍,證明選中
- 加按鈕:
- 1.沒有按下,等待
- 2.按下,判斷選擇的是哪一位,執(zhí)行相應(yīng)位的加程序
- 減按鈕:
- 1.沒有按下,等待
- 2.按下,判斷選擇的是哪一位,執(zhí)行相應(yīng)位的加程序
- 確認(rèn)按鈕:
- 1.沒有按下,等待
- 2.按下,鎖定當(dāng)前的值寫入DS1302
-
- 使選中字符閃爍:
- 無法在主循環(huán)延時(shí),可以嘗試開一個(gè)定時(shí)器中斷,每隔一秒插敘狀態(tài),執(zhí)行閃爍,寫空白字。
- */
- DS1302SetTime:
- MOV R0,#8 /*R0默認(rèn)為周*/
-
- SELECT_BIT_IF_INC:
- JB BIT_SELECT,EEE /*彈開的說明是選擇好了,判斷執(zhí)行的是加還是減*/
- LCALL DELAY10MS
- JB BIT_SELECT,EEE
- CJNE R0,#0,SELECT_BIT
- MOV R0,#8
- EEE: LJMP IF_INC
-
- SELECT_BIT:
- DEC R0
- JNB BIT_SELECT,$ /*鎖定,避免按下后不放就一直加*/
- //加判斷
- IF_INC:
- JB MODE_INC,GGG /*沒有按下,顯示默認(rèn)狀態(tài)(被迫這么些短轉(zhuǎn)移JB距離不夠,只好中轉(zhuǎn))*/
- LCALL DELAY10MS
- JB MODE_INC,GGG
- CJNE R0,#8,SET_SECOND
- LJMP SET_WEEK
- //減判斷
- GGG:
- JB MODE_DEC,AAA /*沒有按下,顯示默認(rèn)狀態(tài)(被迫這么些短轉(zhuǎn)移JB距離不夠,只好中轉(zhuǎn))*/
- LCALL DELAY10MS
- JB MODE_DEC,AAA
- CJNE R0,#8,HHH
- LJMP SET_WEEK_2
-
- HHH: LJMP SET_SECOND_2
- AAA:
- LJMP SHOW_PROCESS
- /**************************************************************************************************/
- //設(shè)置周+(8)
- SET_WEEK:
- MOV A,WEEK
- CJNE A,#7,WEEK_INC
- MOV WEEK,#1
-
- LJMP SHOW_PROCESS
-
- WEEK_INC:
- MOV A,WEEK
- ADD A,#1
- DA A
- MOV WEEK,A
- LJMP SHOW_PROCESS
-
- //設(shè)置秒+(7)
- SET_SECOND:
- CJNE R0,#7,SET_MINUTE
- MOV A,SECOND
- CJNE A,#59H,SECOND_INC
- MOV SECOND,#00H
- LJMP SHOW_PROCESS
- SECOND_INC:
- MOV A,SECOND
- ADD A,#1
- DA A
- MOV SECOND,A
- LJMP SHOW_PROCESS
-
- //設(shè)置分+(6)
- SET_MINUTE:
- CJNE R0,#6,SET_HOUR
- MOV A,MINUTE
- CJNE A,#59H,MINUTE_INC
- MOV MINUTE,#00H
- LJMP SHOW_PROCESS
-
- MINUTE_INC:
- MOV A,MINUTE
- ADD A,#1
- DA A
- MOV MINUTE,A
- LJMP SHOW_PROCESS
-
- //設(shè)置時(shí)+(5)
- SET_HOUR:
- CJNE R0,#5,SET_DAY
- MOV A,HOUR
- CJNE A,#23H,HOUR_INC
- MOV HOUR,#00
- LJMP SHOW_PROCESS
-
- HOUR_INC:
- MOV A,HOUR
- ADD A,#1
- DA A
- MOV HOUR,A
- LJMP SHOW_PROCESS
-
- //設(shè)置天+(4)
- SET_DAY:
- CJNE R0,#4,SET_MONTH
- MOV A,DAY
- CJNE A,#31H,DAY_INC
- MOV DAY,#1
- LJMP SHOW_PROCESS
-
- DAY_INC:
- MOV A,DAY
- ADD A,#1
- DA A
- MOV DAY,A
- LJMP SHOW_PROCESS
-
- //設(shè)置月+(3)
- SET_MONTH:
- CJNE R0,#3,SET_YEARL
- MOV A,MONTH
- CJNE A,#12H,MONTH_INC
- MOV MONTH,#1
- LJMP SHOW_PROCESS
-
- MONTH_INC:
- MOV A,MONTH
- ADD A,#1
- DA A
- MOV MONTH,A
- LJMP SHOW_PROCESS
-
- //設(shè)置年低位+(2)
- SET_YEARL:
- CJNE R0,#2,SET_YEARH
- MOV A,YEARL
- CJNE A,#99H,YEARL_INC
- MOV YEARL,#00H
- LJMP SHOW_PROCESS
-
- YEARL_INC:
- MOV A,YEARL
- ADD A,#1
- DA A
- MOV YEARL,A
- LJMP SHOW_PROCESS
-
- //設(shè)置年高位+(1)
- SET_YEARH:
- CJNE R0,#1,FFF
- MOV A,YEARH
- CJNE A,#99H,YEARH_INC
- MOV YEARH,#00H
- LJMP SHOW_PROCESS
- YEARH_INC:
- MOV A,YEARH
- ADD A,#1
- DA A
- MOV YEARH,A
- LJMP SHOW_PROCESS
- FFF: LJMP SET_WEEK //回調(diào),這個(gè)特別需要注意(頭疼死我了)
- /************************************************************************/
- //減部分咯
- //設(shè)置周-(8)
- SET_WEEK_2:
- MOV A,WEEK
- CJNE A,#1,WEEK_DEC
- MOV WEEK,#7
-
- LJMP SHOW_PROCESS
-
- WEEK_DEC:
- MOV A,WEEK
- CLR AC
- SUBB A,#1
- DA A
- MOV WEEK,A
- LJMP SHOW_PROCESS
-
- //設(shè)置秒-(7)
- SET_SECOND_2:
- CJNE R0,#7,SET_MINUTE_2
- MOV A,SECOND
- CJNE A,#00H,SECOND_DEC
- MOV SECOND,#59H
- LJMP SHOW_PROCESS
- SECOND_DEC:
- MOV A,SECOND
- CLR AC
- SUBB A,#1
- DA A
- MOV SECOND,A
- LJMP SHOW_PROCESS
-
- //設(shè)置分-(6)
- SET_MINUTE_2:
- CJNE R0,#6,SET_HOUR_2
- MOV A,MINUTE
- CJNE A,#00H,MINUTE_DEC
- MOV MINUTE,#59H
- LJMP SHOW_PROCESS
-
- MINUTE_DEC:
- MOV A,MINUTE
- CLR AC
- SUBB A,#1
- DA A
- MOV MINUTE,A
- LJMP SHOW_PROCESS
-
- //設(shè)置時(shí)-(5)
- SET_HOUR_2:
- CJNE R0,#5,SET_DAY_2
- MOV A,HOUR
- CJNE A,#00H,HOUR_DEC
- MOV HOUR,#23H
- LJMP SHOW_PROCESS
-
- HOUR_DEC:
- MOV A,HOUR
- CLR AC
- SUBB A,#1
- DA A
- MOV HOUR,A
- LJMP SHOW_PROCESS
-
- //設(shè)置天-(4)
- SET_DAY_2:
- CJNE R0,#4,SET_MONTH_2
- MOV A,DAY
- CJNE A,#01H,DAY_DEC
- MOV DAY,#31H
- LJMP SHOW_PROCESS
-
- DAY_DEC:
- MOV A,DAY
- CLR AC
- SUBB A,#1
- DA A
- MOV DAY,A
- LJMP SHOW_PROCESS
-
- //設(shè)置月-(3)
- SET_MONTH_2:
- CJNE R0,#3,SET_YEARL_2
- MOV A,MONTH
- CJNE A,#01H,MONTH_DEC
- MOV MONTH,#12H
- LJMP SHOW_PROCESS
-
- MONTH_DEC:
- MOV A,MONTH
- CLR AC
- SUBB A,#1
- DA A
- MOV MONTH,A
- LJMP SHOW_PROCESS
-
- //設(shè)置年低位-(2)
- SET_YEARL_2:
- CJNE R0,#2,SET_YEARH_2
- MOV A,YEARL
- CJNE A,#00H,YEARL_DEC
- MOV YEARL,#99H
- LJMP SHOW_PROCESS
-
- YEARL_DEC:
- MOV A,YEARL
- CLR AC
- SUBB A,#1
- DA A
- MOV YEARL,A
- LJMP SHOW_PROCESS
-
- //設(shè)置年高位-(1)
- SET_YEARH_2:
- CJNE R0,#1,III
- MOV A,YEARH
- CJNE A,#00H,YEARH_DEC
- MOV YEARH,#99H
- LJMP SHOW_PROCESS
- YEARH_DEC:
- MOV A,YEARH
- CLR AC
- SUBB A,#1
- DA A
- MOV YEARH,A
- LJMP SHOW_PROCESS
- III: LJMP SET_WEEK_2 //回調(diào),這個(gè)特別需要注意(頭疼死我了)
- //把修改后的結(jié)果顯示
- SHOW_PROCESS:
- JNB MODE_INC,[ DISCUZ_CODE_1 ]nbsp; //加按鍵沒有彈起,就等待彈起
- JNB MODE_DEC,[ DISCUZ_CODE_1 ]nbsp; //減按鍵沒有彈起,就等待彈起
- LCALL DS1302ShowTime //彈起了說明一次操作完成,就可以把結(jié)果顯示出來
- JB MODE_ENSURE,BBB //確認(rèn)鍵沒有按下的話,跳轉(zhuǎn)回去等待移位選擇
- LCALL DELAY10MS
- JB MODE_ENSURE,BBB
- LJMP DDD
- BBB: LJMP SELECT_BIT_IF_INC
- DDD: LCALL DS1302Init //如果確認(rèn)鍵按下就把初始值寫入DS1302
- RET
-
- /***************時(shí)間顯示**************************/
- DS1302ShowTime:
- //左半屏
- SETB LCD_CS2
- CLR LCD_CS1
- //左半屏讀取到的內(nèi)容
- LCALL Write_YEARH /*年份的高兩位,如“20”*/
- LCALL Write_YEARL /*年份的低兩位,如“18”*/
- LCALL Write_MONTH_1 /*月份的十位,也就是左半部分,如12月的“1”*/
- LCALL Write_HOUR /*小時(shí)的兩位,如12點(diǎn)10分的“12”*/
- LCALL Write_MINUTE /*分鐘的兩位,如12點(diǎn)10分的“10”*/
- //右半屏
- SETB LCD_CS1
- CLR LCD_CS2
- //右半屏讀取到的內(nèi)容
- LCALL Write_MONTH_2 /*月份的個(gè)位,也就是右半部分,如12月的“2”*/
- LCALL Write_DAY /*日期的兩位,如30號(hào)的“30”*/
- LCALL Write_SECOND /*秒的兩位,如45秒的“45”*/
- LCALL Write_WEEK /*周的一位漢字,如星期一的“一”*/
- RET
- /**************設(shè)置DS1302初始參數(shù)*************/
- DS1302Init:
- CLR T_RST
- CLR T_CLK
- SETB T_RST
- MOV B,#WR_PROTECT /*寫保護(hù)寄存器地址8EH*/
- LCALL DS1302WriteByte
- MOV B,#00H /*WP=0允許寫入*/
- LCALL DS1302WriteByte
- SETB T_CLK /*鎖定*/
- CLR T_RST
- MOV R0,#SECOND
- MOV R7,#7 /*秒,分,時(shí),日,月,星期,年*/
- MOV R1,#WR_SECOND
- WR_LOOP6:
- CLR T_RST
- CLR T_CLK
- SETB T_RST
- MOV B,R1
- LCALL DS1302WriteByte
- MOV A,@R0
- MOV B,A
- LCALL DS1302WriteByte
- INC R0
- INC R1 /*寫命令字是隔一個(gè)地址的*/
- INC R1
- SETB T_CLK /*鎖定*/
- CLR T_RST
- DJNZ R7,WR_LOOP6
- //重新鎖定寫保護(hù)寄存器
- CLR T_RST
- CLR T_CLK
- SETB T_RST
- MOV B,#WR_PROTECT
- LCALL DS1302WriteByte
- MOV B,#80H
- LCALL DS1302WriteByte
- SETB T_CLK
- CLR T_RST
- RET
- /************讀DS1302相關(guān)時(shí)間數(shù)據(jù)***********/
- DS1302GetData:
- MOV R0,#SECOND
- MOV R7,#7
- MOV R1,#RD_SECOND
- RD_LOOP2:
- CLR T_RST
- CLR T_CLK
- SETB T_RST
- MOV B,R1
- LCALL DS1302WriteByte
-
- LCALL DS1302ReadByte
- MOV @R0,A
- INC R0
- INC R1
- INC R1
- SETB T_CLK
- CLR T_RST
- DJNZ R7,RD_LOOP2
- RET
- /***********串行讀出DS1302一字節(jié)子程序*******/
- DS1302ReadByte:
- MOV R4,#8
- RD_LOOP1:
- MOV C,T_IO
- RRC A
- SETB T_CLK
- CLR T_CLK
- DJNZ R4,RD_LOOP1
- RET
- /***********串行寫入DS1302一字節(jié)子程序*******/
- DS1302WriteByte:
- MOV R4,#8
- WR_LOOP5:
- MOV A,B
- RRC A
- MOV B,A
- MOV T_IO,C
- SETB T_CLK
- CLR T_CLK
- DJNZ R4,WR_LOOP5
- RET
- /***********寫字子程序*************************/
- /*1.固定部分*/
- //注:一個(gè)漢字占兩頁中間空一頁,正巧使用完8頁
- //寫‘年’
- Write_NIAN:
- MOV LCD_PAGE,#0B8H ;
- MOV LCD_COLUMN,#67H
- MOV DPTR,#HAN_NIAN
- MOV A,#00H
- LCALL WriteChinese
- RET
- //寫‘月’
- Write_YUE:
- MOV LCD_PAGE,#0B8H
- MOV LCD_COLUMN,#49H
- MOV DPTR,#HAN_YUE
- MOV A,#00H
- LCALL WriteChinese
- RET
- //寫‘日’
- Write_RI:
- MOV LCD_PAGE,#0B8H
- MOV LCD_COLUMN,#6CH
- MOV DPTR,#HAN_RI
- MOV A,#00H
- LCALL WriteChinese
- RET
- //寫‘時(shí)’
- Write_SHI:
- MOV LCD_PAGE,#0BBH
- MOV LCD_COLUMN,#5EH
- MOV DPTR,#HAN_SHI
- MOV A,#00H
- LCALL WriteChinese
- RET
- //寫‘分’
- Write_FEN:
- MOV LCD_PAGE,#0BBH
- MOV LCD_COLUMN,#40H
- MOV DPTR,#HAN_FEN
- MOV A,#00H
- LCALL WriteChinese
- RET
- //寫‘秒’
- Write_MIAO:
- MOV LCD_PAGE,#0BBH
- MOV LCD_COLUMN,#63H
- MOV DPTR,#HAN_MIAO
- MOV A,#00H
- LCALL WriteChinese
- RET
- //寫‘星’
- Write_XING:
- MOV LCD_PAGE,#0BEH
- MOV LCD_COLUMN,#67H
- MOV DPTR,#HAN_XING
- MOV A,#00H
- LCALL WriteChinese
- RET
- //寫‘期’左邊一半
- Write_QI_1:
- MOV LCD_PAGE,#0BEH
- MOV LCD_COLUMN,#78H
- MOV DPTR,#YING_QI_1
- MOV A,#00H
- LCALL WriteChar
- RET
- //寫‘期’右邊一半
- Write_QI_2:
- MOV LCD_PAGE,#0BEH
- MOV LCD_COLUMN,#40H
- MOV DPTR,#YING_QI_2
- MOV A,#00H
- LCALL WriteChar
- RET
- /*2.從DS1302獲取部分*/
- Write_YEARH:
- /*
- 注:YEARH=20H手動(dòng)給定,A=20H/10H=02H->20H,正巧度過兩個(gè)字(8*2一個(gè)字符,20H為兩個(gè)字符)
- */
- //‘2’
- MOV A,YEARH
- MOV B,#10H
- DIV AB
- SWAP A
- MOV LCD_PAGE,#0B8H
- MOV LCD_COLUMN,#43H
- MOV DPTR,#YING_LING
- LCALL WriteChar
-
- //‘0’
- MOV A,B
- SWAP A
- MOV LCD_PAGE,#0B8H
- MOV LCD_COLUMN,#4CH
- MOV DPTR,#YING_LING
- LCALL WriteChar
- RET
- Write_YEARL:
- MOV A,YEARL
- MOV B,#10H
- DIV AB
- SWAP A
- MOV LCD_PAGE,#0B8H
- MOV LCD_COLUMN,#55H
- MOV DPTR,#YING_LING
- LCALL WriteChar
-
- MOV A,B
- SWAP A
- MOV LCD_PAGE,#0B8H
- MOV LCD_COLUMN,#5EH
- MOV DPTR,#YING_LING
- LCALL WriteChar
- RET
- Write_MONTH_1:
- //顯示月份的十位,個(gè)位在右半屏顯示
- MOV A,MONTH
- MOV B,#10H
- DIV AB
- SWAP A
- MOV LCD_PAGE,#0B8H
- MOV LCD_COLUMN,#78H
- MOV DPTR,#YING_LING
- LCALL WriteChar
- RET
- Write_HOUR:
- MOV A,HOUR
- MOV B,#10H
- DIV AB
- SWAP A
- MOV LCD_PAGE,#0BBH
- MOV LCD_COLUMN,#4CH
- MOV DPTR,#YING_LING
- LCALL WriteChar
-
- MOV A,B
- SWAP A
- MOV LCD_PAGE,#0BBH
- MOV LCD_COLUMN,#53H
- MOV DPTR,#YING_LING
- LCALL WriteChar
- RET
- Write_MINUTE:
- MOV A,MINUTE
- MOV B,#10H
- DIV AB
- SWAP A
- MOV LCD_PAGE,#0BBH
- MOV LCD_COLUMN,#6FH
- MOV DPTR,#YING_LING
- LCALL WriteChar
-
- MOV A,B
- SWAP A
- MOV LCD_PAGE,#0BBH
- MOV LCD_COLUMN,#78H
- MOV DPTR,#YING_LING
- LCALL WriteChar
- RET
- //月份的右半部份,即個(gè)位
- Write_MONTH_2:
- MOV A,MONTH
- MOV B,#10H
- DIV AB
- MOV A,B
- SWAP A
- MOV LCD_PAGE,#0B8H
- MOV LCD_COLUMN,#40H
- MOV DPTR,#YING_LING
- LCALL WriteChar
- RET
- Write_DAY:
- MOV A,DAY
- MOV B,#10H
- DIV AB
- SWAP A
- MOV LCD_PAGE,#0B8H
- MOV LCD_COLUMN,#5AH
- MOV DPTR,#YING_LING
- LCALL WriteChar
-
- MOV A,B
- SWAP A
- MOV LCD_PAGE,#0B8H
- MOV LCD_COLUMN,#63H
- MOV DPTR,#YING_LING
- LCALL WriteChar
- RET
- Write_SECOND:
- MOV A,SECOND
- MOV B,#10H
- DIV AB
- SWAP A
- MOV LCD_PAGE,#0BBH
- MOV LCD_COLUMN,#51H
- MOV DPTR,#YING_LING
- LCALL WriteChar
-
- MOV A,B
- SWAP A
- MOV LCD_PAGE,#0BBH
- MOV LCD_COLUMN,#5AH
- MOV DPTR,#YING_LING
- LCALL WriteChar
- RET
- Write_WEEK:
- /*
- 00H-周一;10H-周二;20H-周三;30H-周四;40H-周五;50H-周六;60H-周日(周七)
- 而BCD碼取值范圍為01H-07H,故減一處理
- */
- MOV A,WEEK
- DEC A
- SWAP A
- MOV B,A
- ADD A,B
- MOV LCD_PAGE,#0BEH
- MOV LCD_COLUMN,#49H
- MOV DPTR,#HAN_YI
- LCALL WriteChinese
- RET
- /*****************寫漢字**********************/
- WriteChinese:
- //漢字上半部分8*16
- MOV R3,A
- MOV LCD_CMD, LCD_PAGE
- LCALL Lcd12864WriteCmd
- MOV LCD_CMD, LCD_COLUMN
- LCALL Lcd12864WriteCmd
- MOV R2, #16
- WR_LOOP1:
- MOV A,R3
- MOVC A, @A+DPTR
- MOV LCD_DATA, A
- LCALL Lcd12864WriteData
- INC DPTR
- DJNZ R2, WR_LOOP1
- //漢字下半部分8*16
- INC LCD_PAGE
- MOV LCD_CMD, LCD_PAGE
- LCALL Lcd12864WriteCmd
- MOV LCD_CMD, LCD_COLUMN
- LCALL Lcd12864WriteCmd
- MOV R2, #16
- WR_LOOP2:
- MOV A,R3
- MOVC A, @A+DPTR
- MOV LCD_DATA, A
- LCALL Lcd12864WriteData
- INC DPTR
- DJNZ R2, WR_LOOP2
- RET
- /*******************寫字符**********************/
- WriteChar:
- //英文上半部分
- MOV R3,A
- MOV LCD_CMD, LCD_PAGE
- LCALL Lcd12864WriteCmd
- MOV LCD_CMD, LCD_COLUMN
- LCALL Lcd12864WriteCmd
- MOV R2,#8
- WR_LOOP3:
- MOV A,R3
- MOVC A, @A+DPTR
- MOV LCD_DATA, A
- LCALL Lcd12864WriteData
- INC DPTR
- DJNZ R2, WR_LOOP3
- //英文下半部分
- INC LCD_PAGE
- MOV LCD_CMD, LCD_PAGE
- LCALL Lcd12864WriteCmd
- MOV LCD_CMD, LCD_COLUMN
- LCALL Lcd12864WriteCmd
- MOV R2, #8
- WR_LOOP4:
- MOV A,R3
- MOVC A, @A+DPTR
- MOV LCD_DATA, A
- LCALL Lcd12864WriteData
- INC DPTR
- DJNZ R2, WR_LOOP4
- RET
- /**************LCD12864初始化*****************/
- Lcd12864Init:
- CLR LCD_RST
- LCALL DELAY100US
- SETB LCD_RST
-
- SETB LCD_CS1
- CLR LCD_CS2
- MOV LCD_CMD, #3EH
- LCALL Lcd12864WriteCmd
- CLR LCD_CS1
- SETB LCD_CS2
- MOV LCD_CMD, #3EH
- LCALL Lcd12864WriteCmd
-
- SETB LCD_CS1
- CLR LCD_CS2
- MOV LCD_CMD, #3FH
- LCALL Lcd12864WriteCmd
- CLR LCD_CS1
- SETB LCD_CS2
- MOV LCD_CMD, #3FH
- LCALL Lcd12864WriteCmd
- RET
- /***************讀狀態(tài)*************************/
- Lcd12864ReadBusy:
- MOV P1, #0FFH
- ReadBusyFlagLOOP:
- CLR LCD_E
- LCALL LcdDelay
- CLR LCD_DI
- SETB LCD_RW
- LCALL LcdDelay
- SETB LCD_E
- LCALL LcdDelay
- MOV A, P1
- LCALL LcdDelay
- CLR LCD_E
- LCALL LcdDelay
- CLR LCD_RW
- CLR LCD_DI
- SETB LCD_E
- JB ACC.7, ReadBusyFlagLOOP
- RET
- /**************LCD12864寫命令*****************/
- Lcd12864WriteCmd:
- LCALL Lcd12864ReadBusy
- CLR LCD_E
- LCALL LcdDelay
- CLR LCD_DI
- CLR LCD_RW
- LCALL LcdDelay
- SETB LCD_E
- LCALL LcdDelay
- MOV P1, LCD_CMD
- LCALL LcdDelay
- CLR LCD_E
- LCALL LcdDelay
- SETB LCD_DI
- SETB LCD_RW
- SETB LCD_E
- RET
- /**************LCD12864寫數(shù)據(jù)*****************/
- Lcd12864WriteData:
- LCALL Lcd12864ReadBusy
- CLR LCD_E
- LCALL LcdDelay
- SETB LCD_DI
- CLR LCD_RW
- LCALL LcdDelay
- SETB LCD_E
- LCALL LcdDelay
- MOV P1, LCD_DATA
- LCALL LcdDelay
- CLR LCD_E
- LCALL LcdDelay
- SETB LCD_DI
- SETB LCD_RW
- SETB LCD_E
- RET
- /***************LCD時(shí)序延時(shí)*************************/
- LcdDelay:
- NOP
- RET
- /*************LCD復(fù)位用延時(shí)*************************/
- DELAY100US:
- MOV R6,#13H
- DL0:
- MOV R5,#01H
- DJNZ R5,$
- DJNZ R6,DL0
- RET
- /***************閃爍用延時(shí)**************************/
- DELAY_1S:
- DEL1: MOV R5,#10;1us
- DEL2: MOV R6,#200;10*1us
- DEL3: MOV R7,#249;200*10*1us
- DEL4: DJNZ R7,DEL4;249*200*10*2us
- DJNZ R6,DEL3;200*10*2us
- DJNZ R5,DEL2;10*2us
- RET
- /**************消抖用延時(shí)******************************/
- DELAY10MS: ;誤差 0us
- MOV R7,#01H
- DL1:
- MOV R6,#26H
- DL2:
- MOV R5,#82H
- DJNZ R5,$
- DJNZ R6,DL2
- DJNZ R7,DL1
- RET
- /**************LCD顯示用延時(shí)******************************/
- DELAY800MS: ;誤差 0us
- MOV R7,#5FH
- DL3:
- MOV R6,#8AH
- DL4:
- MOV R5,#1DH
- DJNZ R5,$
- DJNZ R6,DL0
- DJNZ R7,DL1
- NOP
- NOP
- RET
- /**************顯示的內(nèi)容(字模)**********************/
- /*
- 年(0) 月(1) 日(2) 星(3) 期(4) 一(5) 二(6) 三(7)
- 四(8) 五(9) 六(10) 七(11) 時(shí)(12) 分(13) 秒(14) 0(15)
- 1(16) 2(17) 3(18) 4(19) 5(20) 6(21) 7(22) 8(23) 9(24)
- */
- HAN_NIAN:
- DB 0FFH,0DFH,0E7H,038H,0BBH,0BBH,0BBH,0BBH
- DB 003H,0BBH,0BBH,0BBH,0BBH,0FBH,0FFH,0FFH
- DB 0FBH,0FBH,0FBH,0F8H,0FBH,0FBH,0FBH,0FBH
- DB 000H,0FBH,0FBH,0FBH,0FBH,0FBH,0FBH,0FFH;年0
- HAN_YUE:
- DB 0FFH,0FFH,0FFH,001H,0DDH,0DDH,0DDH,0DDH
- DB 0DDH,0DDH,0DDH,0DDH,001H,0FFH,0FFH,0FFH
- DB 07FH,0BFH,0CFH,0F0H,0FDH,0FDH,0FDH,0FDH
- DB 0FDH,0FDH,0BDH,07DH,080H,0FFH,0FFH,0FFH;月1
- HAN_RI:
- DB 0FFH,0FFH,0FFH,001H,07DH,07DH,07DH,07DH
- DB 07DH,07DH,07DH,001H,0FFH,0FFH,0FFH,0FFH
- DB 0FFH,0FFH,0FFH,000H,0BFH,0BFH,0BFH,0BFH
- DB 0BFH,0BFH,0BFH,000H,0FFH,0FFH,0FFH,0FFH;日2
- HAN_XING:
- DB 0FFH,0FFH,0FFH,041H,0D5H,0D5H,0D5H,015H
- DB 0D5H,0D5H,0D5H,0C1H,0FFH,0FFH,0FFH,0FFH
- DB 0FFH,0BBH,0BDH,0B6H,0B6H,0B6H,0B6H,080H
- DB 0B6H,0B6H,0B6H,0B6H,0BEH,0BFH,0FFH,0FFH;星3
- YING_QI_1:
- DB 0FFH,0FDH,000H,06DH,06DH,06DH,000H,0FDH
- DB 0BBH,0DBH,0E8H,0FBH,0FBH,0F3H,0A8H,0DBH
- YING_QI_2:
- DB 0FFH,000H,0EEH,0EEH,0EEH,000H,0FFH,0FFH
- DB 0E7H,0F8H,0FEH,0DEH,0BEH,0C0H,0FFH,0FFH;期4
- HAN_YI:
- DB 07FH,07FH,07FH,07FH,07FH,07FH,07FH,07FH
- DB 07FH,07FH,07FH,07FH,07FH,07FH,07FH,0FFH
- DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
- DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;一5
- HAN_ER:
- DB 0FFH,0FFH,0F7H,0F7H,0F7H,0F7H,0F7H,0F7H
- DB 0F7H,0F7H,0F7H,0F7H,0F7H,0FFH,0FFH,0FFH
- DB 0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH
- DB 0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0FFH;二6
- HAN_SAN:
- DB 0FFH,0FBH,07BH,07BH,07BH,07BH,07BH,07BH
- DB 07BH,07BH,07BH,07BH,07BH,0FBH,0FFH,0FFH
- DB 0DFH,0DFH,0DFH,0DFH,0DFH,0DFH,0DFH,0DFH
- DB 0DFH,0DFH,0DFH,0DFH,0DFH,0DFH,0DFH,0FFH;三7
- HAN_SI:
- DB 0FFH,003H,0FBH,0FBH,0FBH,003H,0FBH,0FBH
- DB 0FBH,003H,0FBH,0FBH,0FBH,003H,0FFH,0FFH
- DB 0FFH,080H,0D7H,0DBH,0DCH,0DFH,0DFH,0DFH
- DB 0DFH,0DEH,0DDH,0DDH,0DDH,080H,0FFH,0FFH;四8
- HAN_WU:
- DB 0FFH,0FDH,0BDH,0BDH,0BDH,03DH,081H,0BDH
- DB 0BDH,0BDH,0BDH,03DH,0FDH,0FDH,0FFH,0FFH
- DB 0BFH,0BFH,0BFH,0BFH,087H,0B8H,0BFH,0BFH
- DB 0BFH,0BFH,0BFH,080H,0BFH,0BFH,0BFH,0FFH;五9
- HAN_LIU:
- DB 0DFH,0DFH,0DFH,0DFH,0DFH,0DFH,0DEH,0DDH
- DB 0D3H,0DFH,0DFH,0DFH,0DFH,0DFH,0DFH,0FFH
- DB 0FFH,0BFH,0DFH,0EFH,0F3H,0FCH,0FFH,0FFH
- DB 0FFH,0FEH,0FDH,0FBH,0E7H,09FH,0FFH,0FFH;六10
- HAN_QI:/*也就是星期日*/
- DB 0FFH,0FFH,0FFH,001H,07DH,07DH,07DH,07DH
- DB 07DH,07DH,07DH,001H,0FFH,0FFH,0FFH,0FFH
- DB 0FFH,0FFH,0FFH,000H,0BFH,0BFH,0BFH,0BFH
- DB 0BFH,0BFH,0BFH,000H,0FFH,0FFH,0FFH,0FFH;日11
- HAN_SHI:
- DB 0FFH,003H,07BH,07BH,07BH,003H,0FFH,0EFH
- DB 0EFH,0EFH,0EFH,0EFH,000H,0EFH,0EFH,0FFH
- DB 0FFH,0C0H,0EFH,0EFH,0EFH,0C0H,0FFH,0FFH
- DB 0FEH,0F9H,0BFH,07FH,080H,0FFH,0FFH,0FFH;時(shí)12
- HAN_FEN:
- DB 07FH,0BFH,0DFH,06FH,077H,079H,07FH,07FH
- DB 07FH,07CH,073H,0EFH,0DFH,0BFH,07FH,0FFH
- DB 0FFH,07FH,0BFH,0DFH,0E7H,0F8H,0FFH,0BFH
- DB 07FH,0BFH,0C0H,0FFH,0FFH,0FFH,0FFH,0FFH;分13
- HAN_MIAO:
- DB 0DBH,0DBH,05BH,001H,0DCH,0DDH,0FFH,03FH
- DB 0C7H,0FFH,000H,0FFH,0F7H,0EFH,09FH,0FFH
- DB 0F7H,0F9H,0FEH,000H,0FEH,0F9H,07EH,07FH
- DB 0BFH,0BFH,0D8H,0EFH,0F3H,0FCH,0FFH,0FFH;秒14
-
- YING_LING:
- DB 0FFH,01FH,0EFH,0F7H,0F7H,0EFH,01FH,0FFH
- DB 0FFH,0F0H,0EFH,0DFH,0DFH,0EFH,0F0H,0FFH;015
- YING_YI:
- DB 0FFH,0FFH,0EFH,0EFH,007H,0FFH,0FFH,0FFH
- DB 0FFH,0FFH,0DFH,0DFH,0C0H,0DFH,0DFH,0FFH;116
- YING_ER:
- DB 0FFH,08FH,0F7H,0F7H,0F7H,0F7H,00FH,0FFH
- DB 0FFH,0CFH,0D7H,0DBH,0DDH,0DEH,0CFH,0FFH;217
- YING_SAN:
- DB 0FFH,0CFH,0F7H,0F7H,0F7H,077H,08FH,0FFH
- DB 0FFH,0E7H,0DFH,0DEH,0DEH,0DDH,0E3H,0FFH;318
- YING_SI:
- DB 0FFH,0FFH,07FH,0BFH,0CFH,007H,0FFH,0FFH
- DB 0FFH,0F9H,0FAH,0DBH,0DBH,0C0H,0DBH,0DBH;419
- YING_WU:
- DB 0FFH,007H,077H,077H,077H,0F7H,0F7H,0FFH
- DB 0FFH,0E6H,0DFH,0DFH,0DFH,0EEH,0F1H,0FFH;520
- YING_LIU:
- DB 0FFH,01FH,0EFH,077H,077H,06FH,0FFH,0FFH
- DB 0FFH,0F0H,0EEH,0DFH,0DFH,0DFH,0E0H,0FFH;621
- YING_QI:
- DB 0FFH,0E7H,0F7H,0F7H,077H,097H,0E7H,0FFH
- DB 0FFH,0FFH,0FFH,0C1H,0FEH,0FFH,0FFH,0FFH;722
- YING_BA:
- DB 0FFH,08FH,077H,0F7H,0F7H,077H,08FH,0FFH
- DB 0FFH,0E3H,0DDH,0DEH,0DEH,0DDH,0E3H,0FFH;823
- YING_JIU:
- DB 0FFH,00FH,0F7H,0F7H,0F7H,0EFH,01FH,0FFH
- DB 0FFH,0FEH,0EDH,0DDH,0DDH,0EEH,0F0H,0FFH;924
- HAN_GAN:
- DB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF
- DB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF
- /***************結(jié)束*************************/
- END
復(fù)制代碼 (注:原工程文件見附件)
說明:
目前沒有把當(dāng)前選擇的修改閃爍或者加下劃線凸顯出來,小伙伴們可以進(jìn)行改進(jìn)提升一下。
附件:
仿真.zip
(21.54 KB, 下載次數(shù): 130)
2019-1-21 18:53 上傳
點(diǎn)擊文件名下載附件
Proteus仿真 下載積分: 黑幣 -5
程序.zip
(55.67 KB, 下載次數(shù): 117)
2019-1-21 18:53 上傳
點(diǎn)擊文件名下載附件
51工程文件 下載積分: 黑幣 -5
|