單片機(jī)課程設(shè)計(jì)(可調(diào)式中文電子日歷)_第1頁
已閱讀1頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  摘要</b></p><p>  萬年歷的功能可實(shí)現(xiàn)年、月、日、時(shí)、分、秒和星期的顯示。隨著社會(huì)的發(fā)展日歷的功能越來越強(qiáng)大,精確度越來越高。本次設(shè)計(jì)的日歷采用DS1302時(shí)鐘芯片,該芯片精確度高,性能可靠。用LCD12864液晶屏,既可以顯示數(shù)字又可以顯示漢字,方便了人們的生活。本設(shè)計(jì)總體分為硬件部分和軟件部分。硬件部分可分為:時(shí)鐘芯片DS1302、AT89C5

2、1和LCD12864等。本設(shè)計(jì)非常適合家庭使用。電源采用+5V電壓供電。走時(shí)精確,是現(xiàn)代家庭必備的設(shè)備之一。</p><p>  關(guān)鍵詞:?jiǎn)纹瑱C(jī),萬年歷, DS1302,時(shí)鐘芯片 1引言</p><p>  可調(diào)式電子日歷與時(shí)鐘小巧便于攜帶,界面清爽,一目了然,方便的知曉當(dāng)前時(shí)間,并可對(duì)時(shí)間做出修改,實(shí)在是居家旅行日常生活之必

3、備用品。在現(xiàn)今的可調(diào)式電子日歷與時(shí)鐘具有性能穩(wěn)定、精確度高、成本低、易于產(chǎn) 品化,以及方便、實(shí)用等特點(diǎn)。</p><p><b>  2.總體設(shè)計(jì)</b></p><p><b>  2.1基本原理</b></p><p>  硬件主要涉及到:AT89C51、DS1302、LCD12864等。軟件通過框圖編寫出程

4、序。AT89C51主要功能是存儲(chǔ)程序、根據(jù)程序的內(nèi)容對(duì)各個(gè)端口進(jìn)行判斷并做出相應(yīng)的處理。LCD12864主要的功能是實(shí)現(xiàn)年、月、日、時(shí)、分、秒的顯示效果。實(shí)時(shí)時(shí)鐘DS1302可提供秒、分、時(shí)、日、星期、月和年,一個(gè)月小與31天時(shí)可以自動(dòng)調(diào)整,且具有閏年補(bǔ)償功能。</p><p>  2.2系統(tǒng)總體框圖及設(shè)計(jì)思路</p><p><b>  3.詳細(xì)設(shè)計(jì)</b><

5、/p><p><b>  3.1 硬件設(shè)計(jì)</b></p><p>  3.1.1 DS1302芯片及原理介紹</p><p>  DS1302是美國DALLAS公司推出的一種高性能、低功耗的實(shí)時(shí)時(shí)鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)和RAM數(shù)據(jù)。實(shí)時(shí)時(shí)鐘可提供秒、分、

6、時(shí)、日、星期、月和年,一個(gè)月小與31天時(shí)可以自動(dòng)調(diào)整,且具有閏年補(bǔ)償功能。工作電壓寬達(dá)2.5~5.5V。采用雙電源供電(主電源和備用電源),可設(shè)置備用電源充電方式,提供了對(duì)后背電源進(jìn)行涓細(xì)電流充電的能力。 DS1302用于數(shù)據(jù)記錄,特別是對(duì)某些具有特殊意義的數(shù)據(jù)點(diǎn)的記錄上,能實(shí)現(xiàn)數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時(shí)間同時(shí)記錄,因此廣泛應(yīng)用于測(cè)量系統(tǒng)中。</p><p><b>  外部引腳分配</b><

7、;/p><p><b>  各引腳的功能為:</b></p><p>  Vcc1:備用電源;Vcc2:主電源。當(dāng)Vcc2>Vcc1+0.2V時(shí),由Vcc2向DS1302供電,當(dāng)Vcc2< Vcc1時(shí),由Vcc1向DS1302供電。</p><p>  SCLK:串行時(shí)鐘,輸入;  </p><p> 

8、 I/O:三線接口時(shí)的雙向數(shù)據(jù)線;</p><p>  CE:輸入信號(hào),在讀、寫數(shù)據(jù)期間,必須為高。該引腳有兩個(gè)功能:第一,CE開始控制字訪問移位寄存器的控制邏輯;其次,CE提供結(jié)束單字節(jié)或多字節(jié)數(shù)據(jù)傳輸?shù)姆椒ā?lt;/p><p><b>  內(nèi)部結(jié)構(gòu)</b></p><p>  DS1302是SPI總線驅(qū)動(dòng)方式。它不僅要向寄存器寫入控制字,還需

9、要讀取相應(yīng)寄存器的數(shù)據(jù)。</p><p>  要想與DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如下圖。</p><p>  控制字的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302中。</p><p>  位6:如果為0,則表示存取日歷時(shí)鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);</p><p>

10、  位5至位1(A4~A0):指示操作單元的地址;</p><p>  位0(最低有效位):如為0,表示要進(jìn)行寫操作,為1表示進(jìn)行讀操作。</p><p>  3.1.2 LCD12864液晶屏</p><p>  LCD12864使用KS0108(或其兼容芯片)作為控制器,適配M6800系列時(shí)序,具有8位標(biāo)準(zhǔn)數(shù)據(jù)總線。6條控制線及電源線可顯示各種字符及圖形。每個(gè)

11、KS0108擁有64×64位(512字節(jié))的顯示RAM,12864顯示屏上的64×64點(diǎn),顯示RAM中的數(shù)據(jù)直接作為顯示驅(qū)動(dòng)信號(hào)。具有操作指令簡(jiǎn)單,低功耗的特點(diǎn)。</p><p>  主要技術(shù)參數(shù)和顯示特性:</p><p>  電源:VDD 3.3V~+5V(內(nèi)置升壓電路,無需負(fù)壓);</p><p>  顯示內(nèi)容:128列× 64行

12、</p><p>  與MCU接口:8位或4位并行/3位串行</p><p><b>  配置LED背光</b></p><p><b>  模塊引腳說明:</b></p><p><b>  12864引腳說明</b></p><p><b>

13、;  指令功能詳解:</b></p><p> ?。?)讀狀態(tài)字(read status)</p><p><b>  格式</b></p><p>  BUSY=1,表示KS0108正在處理計(jì)算機(jī)發(fā)來的指令或數(shù)據(jù)。此時(shí)接口電路被封鎖,不能接受除讀狀態(tài)字以外的任何操作。BUSY=0表示KS0108接口控制電路已處于“準(zhǔn)備好”狀態(tài),等

14、待計(jì)算機(jī)的訪問。</p><p>  ON/OFF:表示當(dāng)前的顯示狀態(tài)。ON/OFF=1表示關(guān)顯示狀態(tài);ON/OFF=0表示開顯示狀態(tài)。</p><p>  RESET表示當(dāng)前KS0108的工作狀態(tài),即反映RST端的電平狀態(tài)。當(dāng)RST為低電平狀態(tài)時(shí)KS0108處于復(fù)位工作狀態(tài),RESET=1。當(dāng)RST為高電平狀態(tài)時(shí),KS0108為正常工作狀態(tài),RESET=0。</p><

15、;p>  在占領(lǐng)設(shè)置和數(shù)據(jù)讀寫時(shí)要注意狀態(tài)字中的BUSY標(biāo)志。只有在BUSY=0時(shí),計(jì)算機(jī)對(duì)KS0108的操作才能有效。因此計(jì)算機(jī)在每次對(duì)KS0108操作之前,都要讀出狀態(tài)字判斷BUSY是否為“0”。若不為“0”,則計(jì)算機(jī)需要等待,直至BUSY=0為止。</p><p> ?。?)顯示開關(guān)(display on/off)</p><p><b>  格式</b>

16、</p><p>  該指令設(shè)置顯示開關(guān)/觸發(fā)器的狀態(tài),由此控制顯示數(shù)據(jù)鎖存器的工作方式,從而控制顯示上的顯示狀態(tài)。</p><p>  D位為顯示開/關(guān)的控制位。當(dāng)D=1為顯示設(shè)置,顯示數(shù)據(jù)鎖存器正常工作,顯示屏上呈現(xiàn)所許的效果。此時(shí)在狀態(tài)字中ON/OFF=0。當(dāng)D=0為關(guān)顯示設(shè)置,顯示數(shù)據(jù)鎖存器被置零,顯示屏呈不顯示狀態(tài),但顯示存儲(chǔ)器并沒有被破壞,在狀態(tài)組中ON/OFF=1。</

17、p><p> ?。?)顯示起始行設(shè)置(Display start line)</p><p><b>  格式</b></p><p>  該指令設(shè)置了顯示起始行寄存器的內(nèi)容。KS0108有64行顯示的管理能力,該指令中L5~L0為顯示起始行的地址,取值在00~3FH(1~64)范圍內(nèi),它規(guī)定了顯示屏上最頂一行所對(duì)應(yīng)的顯示存儲(chǔ)器的行地址。如果定時(shí)間

18、隔地,等間距地修改(如加一或減一)顯示起始行寄存器的內(nèi)容,則顯示屏將呈現(xiàn)顯示內(nèi)容向上或向下平滑滾動(dòng)的顯示效果。</p><p>  (4)頁面地址設(shè)置[Set page(X address)]</p><p><b>  格式</b></p><p>  該指令設(shè)置了頁面地址-X地址寄存器的內(nèi)容。KS0108將顯示存儲(chǔ)器分成了8頁,指令代碼中P

19、2~P0就是要確定當(dāng)前所要選擇的頁面地址,取值范圍為00~07H,代表第1~8頁。該指令規(guī)定了以后的讀/寫操作將在哪一個(gè)頁面上進(jìn)行。執(zhí)行本指令后,下面的讀寫操作將在指定頁內(nèi),直到重新設(shè)置。頁地址就是DDRAM 的行地址,頁地址存儲(chǔ)在X地址計(jì)數(shù)器中,P2-P0可表示8頁,讀寫數(shù)據(jù)對(duì)頁地址沒有影響,除本指令可改變頁地址外,復(fù)位信號(hào)(RST)可把頁地址計(jì)數(shù)器內(nèi)容清零。</p><p>  (5)列地址設(shè)置(Set Y

20、address)</p><p><b>  格式</b></p><p>  該指令設(shè)置了Y地址計(jì)數(shù)器的內(nèi)容,C5~C0=0~3FH(1~64)代表某一頁面上的某一單元地址,隨后的一次讀或?qū)憯?shù)據(jù)將在這個(gè)單元上進(jìn)行。Y地址計(jì)數(shù)器具有自動(dòng)加一功能,在每一次讀/寫數(shù)據(jù)后它將自動(dòng)加一,所以在連續(xù)進(jìn)行讀/寫數(shù)據(jù)時(shí),Y地址計(jì)數(shù)器不必每次都設(shè)置一次。頁面地址的設(shè)置和列地址的設(shè)置將

21、顯示存儲(chǔ)器單元唯一地確定下來,為后來的顯示數(shù)據(jù)的讀/寫作了地址的選通。</p><p> ?。?)寫顯示數(shù)據(jù)(Write display data)</p><p><b>  格式</b></p><p>  該操作將8位數(shù)據(jù)寫入先前已確定的顯示存儲(chǔ)器的單元內(nèi),操作完成后列地址計(jì)數(shù)器自動(dòng)加1。</p><p> ?。?

22、)讀顯示數(shù)據(jù)(Read display data)</p><p><b>  格式</b></p><p>  該操作將KS0108接口部的輸出寄存器內(nèi)容讀出,然后列地址計(jì)數(shù)器自動(dòng)加1。</p><p>  3.1.3硬件原理圖</p><p><b>  3.2軟件設(shè)計(jì)</b></p>

23、;<p>  3.2.1 程序流程圖</p><p>  3.2.2 程序代碼</p><p>  LCD12864顯示驅(qū)動(dòng)程序</p><p>  #include <reg52.h></p><p>  #include <intrins.h></p><p>  #defin

24、e uchar unsigned char</p><p>  #define uint unsigned int</p><p>  #define LCD_DB_PORT P0 // 液晶數(shù)據(jù)線端口DB0-DB7</p><p>  #define LCD_START_ROW 0xc0 //起始行命令</p><p>  #defi

25、ne LCD_PAGE 0xB8 // 頁指令</p><p>  #define LCD_COL 0x40 // 列指令</p><p>  bit Reverse_Display=0; //是否反相顯示(白底黑字/黑底白字)</p><p>  sbit DI=P2^0; //液晶引腳定義<

26、/p><p>  sbit RW=P2^1;</p><p>  sbit E=P2^2;</p><p>  sbit CS1=P2^3;</p><p>  sbit CS2=P2^4;</p><p>  sbit RST=P2^5;</p><p>  bit LCD_IS_BUSY()

27、 //檢查L(zhǎng)CD是否忙</p><p><b>  {</b></p><p>  LCD_DB_PORT=0xFF;</p><p><b>  RW=1;</b></p><p><b>  _nop_();</b></p><p>&

28、lt;b>  DI=0;</b></p><p><b>  E=1;</b></p><p><b>  _nop_();</b></p><p><b>  E=0;</b></p><p>  return (bit)(P0&0x80);<

29、/p><p><b>  }</b></p><p>  void Write_Byte_To_LCD(uchar comand) //向LCD寫入一個(gè)字節(jié)(一般用于發(fā)送命令)</p><p><b>  {</b></p><p>  while(LCD_IS_BUSY()); </p&g

30、t;<p>  LCD_DB_PORT=0xFF;</p><p><b>  RW=0;</b></p><p><b>  _nop_();</b></p><p><b>  DI=0;</b></p><p>  LCD_DB_PORT=comand;&l

31、t;/p><p><b>  E=1;</b></p><p><b>  _nop_();</b></p><p><b>  E=0;</b></p><p><b>  }</b></p><p>  void Write_Dat

32、a_To_LCD(uchar dat) //向LCD寫入數(shù)據(jù)</p><p><b>  {</b></p><p>  while(LCD_IS_BUSY()); </p><p>  LCD_DB_PORT=0xFF;</p><p><b>  RW=0;</b></p>

33、<p><b>  _nop_();</b></p><p><b>  DI=1;</b></p><p>  if(!Reverse_Display) //根據(jù)Reverse_Display決定是否反相顯示</p><p>  LCD_DB_PORT=dat;</p><p>

34、<b>  else </b></p><p>  LCD_DB_PORT=~dat;</p><p><b>  E=1;</b></p><p><b>  _nop_();</b></p><p><b>  E=0;</b></p>

35、<p><b>  }</b></p><p>  void LCD12864_Initialization() //初始化LCD</p><p><b>  {</b></p><p><b>  CS1=1;</b></p><p><b> 

36、 CS2=1;</b></p><p>  Write_Byte_To_LCD(0x38);</p><p>  Write_Byte_To_LCD(0x0F);</p><p>  Write_Byte_To_LCD(0x01);</p><p>  Write_Byte_To_LCD(0x06);</p><

37、;p>  Write_Byte_To_LCD(LCD_START_ROW);</p><p><b>  }</b></p><p>  void LCD_Show(uchar P,uchar L,uchar W,uchar *r) reentrant //通用顯示函數(shù)</p><p><b>  {</b>&l

38、t;/p><p><b>  uchar i;</b></p><p><b>  if(L<64)</b></p><p><b>  {</b></p><p><b>  CS1=1;</b></p><p><b&g

39、t;  CS2=0;</b></p><p>  Write_Byte_To_LCD(LCD_PAGE+P);</p><p>  Write_Byte_To_LCD(LCD_COL+L);</p><p>  if(L+W<64)</p><p><b>  { </b></p><

40、;p>  for(i=0;i<W;i++)</p><p>  Write_Data_To_LCD(r[i]);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p>&l

41、t;p>  for(i=0;i<64-L;i++)</p><p>  Write_Data_To_LCD(r[i]);</p><p><b>  CS1=0;</b></p><p><b>  CS2=1;</b></p><p>  Write_Byte_To_LCD(LCD_P

42、AGE+P);</p><p>  Write_Byte_To_LCD(LCD_COL);</p><p>  for(i=64-L;i<W;i++)</p><p>  Write_Data_To_LCD(r[i]);</p><p><b>  }</b></p><p><b&g

43、t;  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  CS1=0;</b></p><p><b>  CS2=1;</b></p><p>

44、;  Write_Byte_To_LCD(LCD_PAGE+P);</p><p>  Write_Byte_To_LCD(LCD_COL+L-64);</p><p>  for(i=0;i<W;i++)</p><p>  Write_Data_To_LCD(r[i]);</p><p><b>  }</b>

45、</p><p><b>  }</b></p><p>  void Display_char(uchar P1,uchar L1,uchar *M) reentrant // 顯示一個(gè)8×16點(diǎn)陣字符</p><p><b>  {</b></p><p>  LCD_Show(P

46、1,L1,8,M);</p><p>  LCD_Show(P1+1,L1,8,M+8); </p><p><b>  }</b></p><p>  void Display_Word(uchar P2,uchar L2,uchar *M) reentrant // 顯示一個(gè)16×16點(diǎn)陣符 </p><p&

47、gt;  { </p><p>  LCD_Show(P2,L2,16,M); </p><p>  LCD_Show(P2+1,L2,16,M+16); </p><p><b>  }</b></p><p>  DS1302時(shí)鐘程序</p><p>  #include

48、 <reg51.h></p><p>  #include <string.h></p><p>  #include <intrins.h></p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p>

49、;<p>  sbit SDA=P1^0; //DS1302數(shù)據(jù)線</p><p>  sbit CLK=P1^1; //DS1302時(shí)鐘線</p><p>  sbit RST=P1^2; // DS1302復(fù)位線</p><p>  char Adjust_Index=-1; //當(dāng)前調(diào)節(jié)的時(shí)間對(duì)象:秒,分,時(shí),日,月,年</p

50、><p>  uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31}; // 一年中每個(gè)月的天數(shù),二月//的天數(shù)由年份決定</p><p>  uchar DateTime[7]; //所讀取的日期時(shí)間</p><p>  void Write_Byte_TO_DS1302(uchar X);

51、 // 向DS1302寫入一個(gè)字節(jié)</p><p>  uchar Read_Byte_FROM_DS1302();//從DS1302中讀取一個(gè)字節(jié)</p><p>  uchar Read_Data_FROM_DS1302(uchar addr); //從DS1302指定位置讀取數(shù)據(jù), 讀數(shù)據(jù)</p><p>  void Write_Data_TO_D

52、S1302(uchar addr,uchar dat); //向DS1302指定位置寫入數(shù)據(jù),寫數(shù)據(jù)</p><p>  void SET_DS1302(); // 設(shè)置時(shí)間</p><p>  void GetTime(); // 讀取當(dāng)前時(shí)間</p><p>  uchar Is_Leapyear(uint year);// 判斷是否為閏年<

53、;/p><p>  void Write_Byte_TO_DS1302(uchar X) // 向DS1302寫入一個(gè)字節(jié)</p><p><b>  {</b></p><p><b>  uchar i;</b></p><p>  for(i=0;i<8;i++)</p>

54、<p><b>  {</b></p><p><b>  SDA=X&1;</b></p><p><b>  CLK=1;</b></p><p><b>  CLK=0;</b></p><p><b>  X>&

55、gt;=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  uchar Read_Byte_FROM_DS1302()//從DS1302中讀取一個(gè)字節(jié)</p><p><b>  {</b></

56、p><p>  uchar i,byte,t;</p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p><b>  byte>>=1;</b></p><p><b>  t=SDA;</b&

57、gt;</p><p>  byte|=t<<7;</p><p><b>  CLK=1;</b></p><p><b>  CLK=0;</b></p><p><b>  }</b></p><p>  return byte/16*

58、10+byte%16; //BCD碼轉(zhuǎn)換</p><p><b>  }</b></p><p>  uchar Read_Data_FROM_DS1302(uchar addr) //從DS1302指定位置讀取數(shù)據(jù), 讀數(shù)據(jù)</p><p><b>  {</b></p><p>  u

59、char dat;</p><p><b>  RST=0;</b></p><p><b>  CLK=0;</b></p><p><b>  RST=1;</b></p><p>  Write_Byte_TO_DS1302(addr); //向DS1302寫入一個(gè)地址

60、</p><p>  dat=Read_Byte_FROM_DS1302(); //在上面寫入的地址中讀取數(shù)據(jù)</p><p><b>  CLK=1;</b></p><p><b>  RST=0;</b></p><p>  return dat;</p><p>&l

61、t;b>  }</b></p><p>  void Write_Data_TO_DS1302(uchar addr,uchar dat) // 向DS1302指定位置寫入數(shù)據(jù),寫數(shù)據(jù)</p><p><b>  {</b></p><p><b>  CLK=0;</b></p><

62、;p><b>  RST=1;</b></p><p>  Write_Byte_TO_DS1302(addr);</p><p>  Write_Byte_TO_DS1302(dat);</p><p><b>  CLK=1;</b></p><p><b>  RST=0;&l

63、t;/b></p><p><b>  }</b></p><p>  void SET_DS1302() // 設(shè)置時(shí)間</p><p><b>  {</b></p><p><b>  uchar i;</b></p><p>  Wr

64、ite_Data_TO_DS1302(0x8E,0x00); //寫控制字,取消寫保護(hù) </p><p>  for(i=1;i<7;i++) // 分,時(shí),日,月,年依次寫入</p><p><b>  {</b></p><p>  Write_Data_TO_DS1302(0x80+2*i,(DateTime[i]/

65、10<<4)|(DateTime[i]%10));</p><p><b>  }</b></p><p>  Write_Data_TO_DS1302(0x8E,0x80); //寫控制字,加寫保護(hù)</p><p><b>  }</b></p><p>  void Get

66、Time() // 讀取當(dāng)前時(shí)間</p><p><b>  {</b></p><p><b>  uchar i;</b></p><p>  for(i=0;i<7;i++)</p><p><b>  {</b></p><p> 

67、 DateTime[i]=Read_Data_FROM_DS1302(0x81+2*i);</p><p><b>  }</b></p><p><b>  }</b></p><p>  uchar Is_Leapyear(uint year) // 判斷是否為閏年</p><p><

68、;b>  {</b></p><p>  return (year%4==0&&year%100!=0)||(year%400==0) ;</p><p><b>  }</b></p><p>  void Refresh_Week_Day() // 求自2000.1.1開始的任何一天是星期幾?</

69、p><p><b>  {</b></p><p>  uint i,d,w=5; //已知1999年12.31是星期五</p><p>  for(i=2000;i<2000+DateTime[6];i++)</p><p><b>  {</b></p>&

70、lt;p>  d=Is_Leapyear(i)?366:365;</p><p>  w=(w+d)%7;</p><p><b>  }</b></p><p><b>  d=0;</b></p><p>  for (i=1;i<DateTime[4];i++)</p>

71、<p>  {d+=MonthsDays[i];}</p><p>  d+=DateTime[3];</p><p>  DateTime[5]=(w+d)%7+1; //保存星期,0-6表示星期日,星期一至星期六,為了與//DS1302的星期格式匹配,返回值需要加1</p><p><b>  }</b></p>

72、;<p>  void Datetime_Adjust(char X) //年,月,日和時(shí),分++/--</p><p><b>  {</b></p><p>  switch(Adjust_Index)</p><p><b>  {</b></p><p>  case 6:

73、 //年調(diào)整,00-99</p><p>  if(X==1&&DateTime[6]<99)</p><p><b>  { </b></p><p>  DateTime[6]++;</p><p><b>  }</b>&

74、lt;/p><p>  if(X==-1&&DateTime[6]>0)</p><p><b>  { </b></p><p>  DateTime[6]--;</p><p><b>  }</b></p><p>  MonthsDays[2]=Is

75、_Leapyear(2000+DateTime[6])?29:28; //獲取2月天數(shù)</p><p>  if(DateTime[3]>MonthsDays[DateTime[4]])</p><p><b>  {</b></p><p>  DateTime[3]=MonthsDays[DateTime[4]];</p>

76、;<p><b>  }</b></p><p>  Refresh_Week_Day(); //刷新星期</p><p><b>  break;</b></p><p>  case 4: //月調(diào)整 01-12</p>&

77、lt;p>  if(X==1&&DateTime[4]<12)</p><p><b>  { </b></p><p>  DateTime[4]++;</p><p><b>  }</b></p><p>  if(X==-1&&DateTime[4

78、]>1)</p><p><b>  { </b></p><p>  DateTime[4]--;</p><p><b>  }</b></p><p>  MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28; //獲取2月天數(shù)</p

79、><p>  if(DateTime[3]>MonthsDays[DateTime[4]])</p><p><b>  {</b></p><p>  DateTime[3]=MonthsDays[DateTime[4]];</p><p><b>  }</b></p><

80、p>  Refresh_Week_Day(); //刷新星期</p><p><b>  break;</b></p><p>  case 3: //日調(diào)整00-28或00-29或00-30或00-31</p><p>  MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28

81、; //調(diào)節(jié)之前首先根據(jù)當(dāng)</p><p>  //前年份得出該年中2月的天數(shù)</p><p>  if(X==1&&DateTime[3]<MonthsDays[DateTime[4]])</p><p><b>  { </b></p><p>  DateTime[3]++;</p>

82、;<p><b>  }</b></p><p>  if(X==-1&&DateTime[3]>0)</p><p><b>  { </b></p><p>  DateTime[3]--;</p><p><b>  }</b><

83、/p><p>  Refresh_Week_Day(); //刷新星期</p><p><b>  break;</b></p><p>  case 2: // 時(shí)調(diào)整</p><p>  if(X==1&&DateTime[2]<2

84、3)</p><p><b>  { </b></p><p>  DateTime[2]++;</p><p><b>  }</b></p><p>  if(X==-1&&DateTime[4]>0)</p><p><b>  { &l

85、t;/b></p><p>  DateTime[2]--;</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case 1: // 分調(diào)整</p><p>

86、  if(X==1&&DateTime[1]<59)</p><p><b>  { </b></p><p>  DateTime[1]++;</p><p><b>  }</b></p><p>  if(X==-1&&DateTime[4]>0)&

87、lt;/p><p><b>  { </b></p><p>  DateTime[1]--;</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case 0:

88、 // 秒調(diào)整</p><p>  if(X==1&&DateTime[1]<59)</p><p><b>  { </b></p><p>  DateTime[0]++;</p><p><b>  }</b></p><p>  if(

89、X==-1&&DateTime[4]>0)</p><p><b>  { </b></p><p>  DateTime[0]--;</p><p><b>  }</b></p><p><b>  break;</b></p><

90、p><b>  }</b></p><p><b>  }</b></p><p><b>  字符漢字顯示程序</b></p><p>  // 與本程序有關(guān)的數(shù)字和漢字的點(diǎn)陣編碼 DotMatrix.c</p><p>  #include <reg51.h&g

91、t;</p><p>  #include <string.h></p><p>  #include <intrins.h></p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  

92、//年、月、日、星期、時(shí)、分、秒等漢字點(diǎn)陣(16×16)</p><p>  uchar code DATE_TIME_WORDS[]={</p><p>  0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00, //年</p><p>  0x0

93、4,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,</p><p>  0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,//月</p><p>  0x00,0x40,0x20

94、,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00,</p><p>  0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,//日</p><p>  0x00,0x00,0x00,0x3F,0x10,

95、0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,</p><p>  0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,</p><p>  0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F

96、,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00,</p><p>  0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,//期</p><p>  0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,

97、0x02,0x22,0x42,0x3F,0x00,0x00,</p><p>  0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,//時(shí)</p><p>  0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0

98、x00,0x00,0x00,0x00,</p><p>  0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,//分</p><p>  0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x

99、00,0x00,</p><p>  0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,//秒</p><p>  0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00<

100、/p><p><b>  };</b></p><p>  //一、二、三、四、五、六和天等漢字點(diǎn)陣(16×16)</p><p>  uchar code WEEK_WORDS[]={</p><p>  0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42

101、,0x42,0x42,0x42,0x40,0x00,//天</p><p>  0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00,</p><p>  0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,

102、0xC0,0xC0,0x00,//一</p><p>  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,</p><p>  0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0

103、x00,//二</p><p>  0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00,</p><p>  0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,//三<

104、/p><p>  0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,</p><p>  0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,//四</p><

105、;p>  0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00,</p><p>  0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,//五</p><p>  0x2

106、0,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00,</p><p>  0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,//六</p><p>  0x00,0x40,0x20

107、,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00,</p><p><b>  };</b></p><p>  //0-9等數(shù)字點(diǎn)陣(8×16)</p><p>  uchar code Digits[]={ </p><p>

108、;  0x00,0x00,0xF0,0xF8,0x08,0x68,0xF8,0xF0,0x00,0x00,0x07,0x0F,0x0B,0x08,0x0F,0x07, //0</p><p>  0x00,0x20,0x20,0x30,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00, //1</p><p>  0x

109、00,0x30,0x38,0x08,0x88,0xF8,0x70,0x00,0x00,0x0C,0x0E,0x0B,0x09,0x08,0x08,0x00, //2</p><p>  0x00,0x30,0x38,0x88,0x88,0xF8,0x70,0x00,0x00,0x06,0x0E,0x08,0x08,0x0F,0x07,0x00, //3</p><p>  0x00,0x

110、00,0xF8,0xF8,0x00,0xE0,0xE0,0x00,0x00,0x03,0x03,0x02,0x02,0x0F,0x0F,0x02,//4</p><p>  0x00,0xF8,0xF8,0x88,0x88,0x88,0x08,0x00,0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,//5</p><p>  0x00,0xC0,0xE0,

111、0x78,0x58,0xC8,0x80,0x00,0x00,0x07,0x0F,0x08,0x08,0x0F,0x07,0x00,//6</p><p>  0x00,0x08,0x08,0x88,0xE8,0x78,0x18,0x00,0x00,0x00,0x0E,0x0F,0x01,0x00,0x00,0x00,//7</p><p>  0x00,0x70,0xF8,0xC8,0x8

112、8,0xF8,0x70,0x00,0x00,0x07,0x0F,0x08,0x09,0x0F,0x07,0x00,//8</p><p>  0x00,0xF0,0xF8,0x08,0x08,0xF8,0xF0,0x00,0x00,0x00,0x09,0x0D,0x0F,0x03,0x01,0x00,//9</p><p><b>  };</b></p>

113、<p><b>  主程序</b></p><p>  #include <reg51.h></p><p>  #include <string.h></p><p>  #include <intrins.h></p><p>  #define uchar unsi

114、gned char</p><p>  #define uint unsigned int</p><p>  extern void LCD12864_Initialization();</p><p>  extern void Display_char(uchar P1,uchar L1,uchar *M) reentrant;</p><

115、p>  extern void Display_Word(uchar P2,uchar L2,uchar *M) reentrant;</p><p>  extern void Datetime_Adjust(char X);</p><p>  extern void SET_DS1302(); // 設(shè)置時(shí)間</p><p>  extern Ge

116、tTime();</p><p>  void Initialization();//初始化函數(shù)</p><p>  extern bit Reverse_Display;//是否反相顯示(白底黑字/黑底白字)</p><p>  extern uchar code Digits[];</p><p>  extern uchar code

117、WEEK_WORDS[];</p><p>  extern uchar code Digits[];</p><p>  extern uchar code DATE_TIME_WORDS[];</p><p>  extern char Adjust_Index; //當(dāng)前調(diào)節(jié)的時(shí)間對(duì)象:秒,分,時(shí),日,月,年(0,1,2,3,4,6)</p>

118、<p>  extern uchar MonthsDays[]; // 一年中每個(gè)月的天數(shù),二月的天數(shù)由年份決定</p><p>  extern uchar DateTime[7]; //所讀取的日期時(shí)間</p><p>  sbit k1=P3^4; // 選擇按鍵</p><p>  sbit k2=P3^5; // 加&

119、lt;/p><p>  sbit k3=P3^6; //減</p><p>  sbit k4=P3^7; //確定</p><p>  uchar tcount=0;</p><p>  uchar H_Offset=10;//水平與垂直偏移</p><p>  uchar V_page_Offse

120、t=0;</p><p>  void main()</p><p><b>  {</b></p><p>  Initialization();</p><p><b>  while(1)</b></p><p><b>  {</b></p

121、><p>  if(Adjust_Index==-1) GetTime();</p><p><b>  }</b></p><p><b>  }</b></p><p>  void Initialization() //初始化函數(shù)</p><p><b>

122、  {</b></p><p><b>  IE=0x83;</b></p><p><b>  IP=0x01;</b></p><p><b>  IT0=0X01;</b></p><p>  TH0=-50000/256; // 寫入初值</p&

123、gt;<p>  TL0=-50000%256; // 寫入初值</p><p><b>  TR0=1;</b></p><p>  LCD12864_Initialization(); //液晶初始化函數(shù)</p><p>  Display_char(V_page_Offset,0+H_Offset,Digits+2

124、*16); //顯示年的前面固定的兩位</p><p>  Display_char(V_page_Offset,8+H_Offset,Digits);</p><p>  //在12864屏幕上固定顯示漢字:年月日,星期,時(shí)分秒</p><p>  Display_Word(V_page_Offset,32+H_Offset,DATE_TIME_WORDS+0

125、*32);</p><p>  Display_Word(V_page_Offset,64+H_Offset,DATE_TIME_WORDS+1*32);</p><p>  Display_Word(V_page_Offset,96+H_Offset,DATE_TIME_WORDS+2*32);</p><p>  Display_Word(V_page_Offs

126、et+3,56+H_Offset,DATE_TIME_WORDS+3*32);</p><p>  Display_Word(V_page_Offset+3,72+H_Offset,DATE_TIME_WORDS+4*32);</p><p>  Display_Word(V_page_Offset+6,32+H_Offset,DATE_TIME_WORDS+5*32);</p>

127、;<p>  Display_Word(V_page_Offset+6,64+H_Offset,DATE_TIME_WORDS+6*32);</p><p>  Display_Word(V_page_Offset+6,96+H_Offset,DATE_TIME_WORDS+7*32);</p><p><b>  }</b></p>&l

128、t;p>  void T0_INT()interrupt 1 // 定時(shí)器0刷新LCD顯示函數(shù)</p><p><b>  {</b></p><p>  TH0=-50000/256; // 寫入初值</p><p>  TL0=-50000%256; // 寫入初值</p><p>

129、  if(++tcount!=2) return;</p><p><b>  tcount=0;</b></p><p>  Reverse_Display=Adjust_Index==6; //年(后兩位)</p><p>  Display_char(V_page_Offset,16+H_Offset,Digits+DateTime[

130、6]/10*16);</p><p>  Display_char(V_page_Offset,24+H_Offset,Digits+DateTime[6]%10*16);</p><p>  Reverse_Display=Adjust_Index==5; //星期</p><p>  Display_Word(V_page_Offset+3,96+H_Off

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論