實時時鐘課題要求:
實時時鐘系統設計
1、用 1 個撥動開關設定“工作狀態”和“設置狀態”;
2、“設置狀態”下,用 4 個獨立按鍵實現時間設置:“+”“-”、“移位”、“確認”,
對年(2 位)、月、日、時、分、秒進行每 1 位的數值設置;
3、采用 DS1302 時鐘芯片,采用 LCD 進行時鐘顯示
Proteus7.8仿真效果如下:
protesu仿真效果.png (70.54 KB, 下載次數: 106)
下載附件
Proteus仿真效果
2019-1-21 18:46 上傳
(注:Proteus仿真源文件見附件)
匯編代碼如下:
- /*******************************實時時鐘實驗(Zidone)*************************************************/
- /***********LCD12864相關定義******************/
- //指定管腳
- LCD_E BIT P2.0 /*12864使能口*/
- LCD_DI BIT P3.0 /*12864數據命令選擇*/
- LCD_RW BIT P3.1 /*12864讀寫選擇*/
- LCD_RST BIT P3.3 /*12864復位*/
- LCD_CS1 BIT P3.2 /*12864選屏*/
- LCD_CS2 BIT P2.1 /*12864選屏*/
- //指定存放地址
- LCD_CMD EQU 30H /*12864命令存放地址*/
- LCD_DATA EQU 31H /*12864數據存放地址*/
- LCD_PAGE EQU 32H /*起始B8H 存放頁數(用于字符或漢字)*/
- LCD_COLUMN EQU 33H /*起始40H 存放列數*/
- /***********DS1302相關定義******************/
- //指定管腳
- T_CLK BIT P2.6 /*DS1302時鐘口*/
- T_IO BIT P2.7 /*DS1302輸入輸出口*/
- T_RST BIT P2.5 /*DS1302復位口*/
- //指定存放地址
- SECOND EQU 40H /*秒分時日月周年低位年高位存儲地址*/
- 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
- /*********用戶開關及按鍵管腳定義***************/
- MODE_SELECT BIT P0.0 /*模式選擇管腳:默認高電平,1-正常計時模式,0-時間設定模式*/
- BIT_SELECT BIT P0.1 /*移位選擇需要修改的參數,使其閃爍,表明選中*/
- MODE_INC BIT P0.2 /*加*/
- MODE_DEC BIT P0.3 /*減*/
- MODE_ENSURE BIT P0.4 /*確認*/
- /**************主程序**************************/
- ORG 0000H
- LJMP MAIN
- ORG 0100H
- MAIN:
- MOV SP,#60H
- //DS1302初始默認時間設置
- 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初始設置*/
- LCALL Lcd12864Init /*LCD12864初始化*/
- //選擇左半屏
- SETB LCD_CS2
- CLR LCD_CS1
- //左半屏需要顯示的固定漢字
- LCALL Write_NIAN /*’年‘*/
- LCALL Write_SHI /*’時‘*/
- 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 /*狀態選擇,閉合低電平為時間設置狀態,斷開高電平(默認狀態)正常計時狀態*/
- LCALL DELAY10MS /*軟件消抖*/
- JB MODE_SELECT,LOOP2
- LCALL DS1302SetTime
- LOOP2:
- LCALL DS1302GetData
- LCALL DS1302ShowTime
- LCALL DELAY800MS
- LJMP LOOP1
- /***************通過按鍵設定DS1302的起始時間**************************/
- /*
- 首先判斷模式選擇開關:
- 1.沒有按下,執行正常顯示的程序(也是彈開后重新執行顯示程序)
- 2.按下后,執行時間設置程序
- 其次判斷移位選擇開關:
- 1.沒有按下,默認選擇修改年高位
- 2.按下,切換需要修改的參數(順序為:如下標識),并使其閃爍,證明選中
- 加按鈕:
- 1.沒有按下,等待
- 2.按下,判斷選擇的是哪一位,執行相應位的加程序
- 減按鈕:
- 1.沒有按下,等待
- 2.按下,判斷選擇的是哪一位,執行相應位的加程序
- 確認按鈕:
- 1.沒有按下,等待
- 2.按下,鎖定當前的值寫入DS1302
-
- 使選中字符閃爍:
- 無法在主循環延時,可以嘗試開一個定時器中斷,每隔一秒插敘狀態,執行閃爍,寫空白字。
- */
- DS1302SetTime:
- MOV R0,#8 /*R0默認為周*/
-
- SELECT_BIT_IF_INC:
- JB BIT_SELECT,EEE /*彈開的說明是選擇好了,判斷執行的是加還是減*/
- 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 /*沒有按下,顯示默認狀態(被迫這么些短轉移JB距離不夠,只好中轉)*/
- LCALL DELAY10MS
- JB MODE_INC,GGG
- CJNE R0,#8,SET_SECOND
- LJMP SET_WEEK
- //減判斷
- GGG:
- JB MODE_DEC,AAA /*沒有按下,顯示默認狀態(被迫這么些短轉移JB距離不夠,只好中轉)*/
- LCALL DELAY10MS
- JB MODE_DEC,AAA
- CJNE R0,#8,HHH
- LJMP SET_WEEK_2
-
- HHH: LJMP SET_SECOND_2
- AAA:
- LJMP SHOW_PROCESS
- /**************************************************************************************************/
- //設置周+(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
-
- //設置秒+(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
-
- //設置分+(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
-
- //設置時+(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
-
- //設置天+(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
-
- //設置月+(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
-
- //設置年低位+(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
-
- //設置年高位+(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 //回調,這個特別需要注意(頭疼死我了)
- /************************************************************************/
- //減部分咯
- //設置周-(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
-
- //設置秒-(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
-
- //設置分-(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
-
- //設置時-(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
-
- //設置天-(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
-
- //設置月-(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
-
- //設置年低位-(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
-
- //設置年高位-(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 //回調,這個特別需要注意(頭疼死我了)
- //把修改后的結果顯示
- SHOW_PROCESS:
- JNB MODE_INC,[ DISCUZ_CODE_1 ]nbsp; //加按鍵沒有彈起,就等待彈起
- JNB MODE_DEC,[ DISCUZ_CODE_1 ]nbsp; //減按鍵沒有彈起,就等待彈起
- LCALL DS1302ShowTime //彈起了說明一次操作完成,就可以把結果顯示出來
- JB MODE_ENSURE,BBB //確認鍵沒有按下的話,跳轉回去等待移位選擇
- LCALL DELAY10MS
- JB MODE_ENSURE,BBB
- LJMP DDD
- BBB: LJMP SELECT_BIT_IF_INC
- DDD: LCALL DS1302Init //如果確認鍵按下就把初始值寫入DS1302
- RET
-
- /***************時間顯示**************************/
- DS1302ShowTime:
- //左半屏
- SETB LCD_CS2
- CLR LCD_CS1
- //左半屏讀取到的內容
- LCALL Write_YEARH /*年份的高兩位,如“20”*/
- LCALL Write_YEARL /*年份的低兩位,如“18”*/
- LCALL Write_MONTH_1 /*月份的十位,也就是左半部分,如12月的“1”*/
- LCALL Write_HOUR /*小時的兩位,如12點10分的“12”*/
- LCALL Write_MINUTE /*分鐘的兩位,如12點10分的“10”*/
- //右半屏
- SETB LCD_CS1
- CLR LCD_CS2
- //右半屏讀取到的內容
- LCALL Write_MONTH_2 /*月份的個位,也就是右半部分,如12月的“2”*/
- LCALL Write_DAY /*日期的兩位,如30號的“30”*/
- LCALL Write_SECOND /*秒的兩位,如45秒的“45”*/
- LCALL Write_WEEK /*周的一位漢字,如星期一的“一”*/
- RET
- /**************設置DS1302初始參數*************/
- DS1302Init:
- CLR T_RST
- CLR T_CLK
- SETB T_RST
- MOV B,#WR_PROTECT /*寫保護寄存器地址8EH*/
- LCALL DS1302WriteByte
- MOV B,#00H /*WP=0允許寫入*/
- LCALL DS1302WriteByte
- SETB T_CLK /*鎖定*/
- CLR T_RST
- MOV R0,#SECOND
- MOV R7,#7 /*秒,分,時,日,月,星期,年*/
- 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 /*寫命令字是隔一個地址的*/
- INC R1
- SETB T_CLK /*鎖定*/
- CLR T_RST
- DJNZ R7,WR_LOOP6
- //重新鎖定寫保護寄存器
- 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相關時間數據***********/
- 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一字節子程序*******/
- DS1302ReadByte:
- MOV R4,#8
- RD_LOOP1:
- MOV C,T_IO
- RRC A
- SETB T_CLK
- CLR T_CLK
- DJNZ R4,RD_LOOP1
- RET
- /***********串行寫入DS1302一字節子程序*******/
- 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.固定部分*/
- //注:一個漢字占兩頁中間空一頁,正巧使用完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
- //寫‘時’
- 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手動給定,A=20H/10H=02H->20H,正巧度過兩個字(8*2一個字符,20H為兩個字符)
- */
- //‘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:
- //顯示月份的十位,個位在右半屏顯示
- 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
- //月份的右半部份,即個位
- 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
- /***************讀狀態*************************/
- 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寫數據*****************/
- 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時序延時*************************/
- LcdDelay:
- NOP
- RET
- /*************LCD復位用延時*************************/
- DELAY100US:
- MOV R6,#13H
- DL0:
- MOV R5,#01H
- DJNZ R5,$
- DJNZ R6,DL0
- RET
- /***************閃爍用延時**************************/
- 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
- /**************消抖用延時******************************/
- DELAY10MS: ;誤差 0us
- MOV R7,#01H
- DL1:
- MOV R6,#26H
- DL2:
- MOV R5,#82H
- DJNZ R5,$
- DJNZ R6,DL2
- DJNZ R7,DL1
- RET
- /**************LCD顯示用延時******************************/
- DELAY800MS: ;誤差 0us
- MOV R7,#5FH
- DL3:
- MOV R6,#8AH
- DL4:
- MOV R5,#1DH
- DJNZ R5,$
- DJNZ R6,DL0
- DJNZ R7,DL1
- NOP
- NOP
- RET
- /**************顯示的內容(字模)**********************/
- /*
- 年(0) 月(1) 日(2) 星(3) 期(4) 一(5) 二(6) 三(7)
- 四(8) 五(9) 六(10) 七(11) 時(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;時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
- /***************結束*************************/
- END
復制代碼 (注:原工程文件見附件)
說明:
目前沒有把當前選擇的修改閃爍或者加下劃線凸顯出來,小伙伴們可以進行改進提升一下。
附件:
仿真.zip
(21.54 KB, 下載次數: 130)
2019-1-21 18:53 上傳
點擊文件名下載附件
Proteus仿真 下載積分: 黑幣 -5
程序.zip
(55.67 KB, 下載次數: 117)
2019-1-21 18:53 上傳
點擊文件名下載附件
51工程文件 下載積分: 黑幣 -5
|