c51課程設(shè)計(jì)報(bào)告(液晶時(shí)鐘)_第1頁
已閱讀1頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  嵌入式C語言課程設(shè)計(jì)報(bào)告</p><p><b>  目錄</b></p><p><b>  一、設(shè)計(jì)方案1</b></p><p><b>  1、功能簡介1</b></p><p>  2、開發(fā)測試環(huán)境選擇1</p><p&

2、gt;  二、液晶時(shí)鐘程序設(shè)計(jì)1</p><p>  1、功能狀態(tài)轉(zhuǎn)換圖1</p><p>  2、主要功能模塊2</p><p>  2.1主顯示模塊2</p><p>  2.2功能選擇模塊2</p><p>  2.3時(shí)間修改模塊3</p><p>  2.4鬧鈴修改模塊3&

3、lt;/p><p>  2.6其他輔助模塊函數(shù)以及變量4</p><p><b>  三、小結(jié)4</b></p><p><b>  四、附錄5</b></p><p><b>  1、使用說明5</b></p><p>  2、參考文獻(xiàn)資料5&l

4、t;/p><p><b>  3、附表16</b></p><p><b>  一、設(shè)計(jì)方案</b></p><p><b>  1、功能簡介</b></p><p>  本文所設(shè)計(jì)的簡易電子時(shí)鐘可輸出當(dāng)前時(shí)間以及鬧鈴時(shí)間,并可通過機(jī)械按鍵來實(shí)現(xiàn)修改當(dāng)前時(shí)間、修改鬧鈴時(shí)間、退出修

5、改以及控制鬧鈴的打開和關(guān)閉,并通過1602型號(hào)的液晶屏顯示出不同操作時(shí)的不同界面。本程序共設(shè)計(jì)按鍵5個(gè),按鍵及功能分別是1鍵:選擇功能界面下選擇時(shí)間修改、時(shí)間和鬧鈴修改狀態(tài)下的增加“1”計(jì)數(shù);2鍵:選擇功能界面下選擇鬧鈴修改、時(shí)間和鬧鈴修改狀態(tài)下的減少“1”計(jì)數(shù);3鍵:主顯示界面下進(jìn)入選擇功能界面、時(shí)間和鬧鈴修改狀態(tài)下切換修改項(xiàng)目、修改完成退回主顯示界面;4鍵:時(shí)間和鬧鈴修改狀態(tài)下直接退回主顯示界面;5鍵:主顯示界面下控制鬧鈴的開關(guān)。&

6、lt;/p><p>  2、開發(fā)測試環(huán)境選擇</p><p>  開發(fā)軟件選擇了ARM公司的KeiluVision4,仿真軟件選擇了英國Labcenter electronics公司的proteus7 professional,測試硬件選擇了普中的HC6800開發(fā)箱。首先在KeiluVision4下進(jìn)行程序設(shè)計(jì),編譯通過后用proteus7 professional進(jìn)行仿真并嘗試下載到開發(fā)箱中

7、進(jìn)行操作,最后下載到開發(fā)箱中進(jìn)行操作演示。</p><p>  二、液晶時(shí)鐘程序設(shè)計(jì)</p><p><b>  1、功能狀態(tài)轉(zhuǎn)換圖</b></p><p><b>  2、主要功能模塊</b></p><p>  注:本文中提到的函數(shù)均見附表1的液晶時(shí)鐘源程序中,本次使用的是1602液晶。<

8、/p><p><b>  2.1主顯示模塊</b></p><p>  主顯示模塊包含了時(shí)間顯示模塊void TimeDisplay(void)函數(shù),其運(yùn)行過程為首先讀取初始值,再通過定時(shí)器中斷TO的中斷服務(wù)函數(shù)void T0_int () interrupt 1 來進(jìn)行秒計(jì)時(shí)并通過void TimeRunning(void)函數(shù)進(jìn)行時(shí)間的加計(jì)數(shù)和進(jìn)位運(yùn)算;鬧鈴顯示模塊v

9、oid AlarmDisplay(void),其運(yùn)行過程為首先讀取初始值,再通過void AlarmRunning(void)來進(jìn)行比較,如果預(yù)設(shè)時(shí)間與當(dāng)前時(shí)間相等就將響鈴標(biāo)記變量SoundFlage_1置為1,進(jìn)而引發(fā)主函數(shù)中的響鈴事件。在鬧鈴顯示模塊還包含了鬧鈴開關(guān)控制模塊,用于控制鬧鈴是否開啟,若鬧鈴開啟會(huì),鬧鈴時(shí)間后就會(huì)顯示“P”字母。主顯示界面仿真結(jié)果如</p><p><b>  圖2:&l

10、t;/b></p><p><b>  2.2功能選擇模塊</b></p><p>  功能選擇模塊包含了void Menu_display (void)函數(shù),其運(yùn)行過程為當(dāng)按鍵3時(shí)間觸發(fā),切換到功能選擇界面是顯示時(shí)間修改及鬧鈴修改的提示,并等待按鍵1(時(shí)間修改)事件或者按鍵2(鬧鈴修改)事件。功能選擇界面仿真結(jié)果如圖3:</p><p>

11、;<b>  2.3時(shí)間修改模塊</b></p><p>  時(shí)間修改模塊主要通過調(diào)用時(shí)間顯示函數(shù)和按鍵響應(yīng)函數(shù):按鍵讀值uchar GetKey(void)和響應(yīng)void QueryKeyboard(void),并通過時(shí)間設(shè)置標(biāo)記變量SetTimeFlage的值來判斷是否執(zhí)行時(shí)間修改。時(shí)間修改模式下計(jì)時(shí)會(huì)暫停,按鍵1、按鍵2、按鍵3以及按鍵4會(huì)響應(yīng),實(shí)現(xiàn)時(shí)間的加減、項(xiàng)目切換及退回主界面的操

12、作。進(jìn)行時(shí)間加減時(shí),計(jì)數(shù)會(huì)循環(huán)變化,如:當(dāng)時(shí)間為23:59:59時(shí),時(shí)加會(huì)變?yōu)?0,分加會(huì)變?yōu)?0并且時(shí)會(huì)加1,秒同理;當(dāng)時(shí)間為00:00:00時(shí),時(shí)減會(huì)變?yōu)?3,分減會(huì)變?yōu)?9并且時(shí)會(huì)減1,秒同理。同時(shí),當(dāng)進(jìn)入時(shí)間修改界面后三盞指示LED燈就會(huì)分別點(diǎn)亮,第一盞點(diǎn)亮表示時(shí)修改,第二盞點(diǎn)亮表示分修改,第三盞點(diǎn)亮表示秒修改(初始為時(shí)修改,可按按鍵3進(jìn)行切換)。時(shí)間修改界面仿真結(jié)果如圖4:</p><p><b&

13、gt;  2.4鬧鈴修改模塊</b></p><p>  鬧鈴修改模塊與時(shí)間修改模塊結(jié)構(gòu)類似,通過調(diào)用鬧鈴顯示函數(shù)和按鍵響應(yīng)函數(shù),并通過鬧鈴設(shè)置標(biāo)記變量SetAlarmFlage的值來判斷是否執(zhí)行鬧鈴修改。鬧鈴修改模式下,計(jì)時(shí)不會(huì)暫停但鬧鈴不會(huì)響應(yīng),按鍵1、按鍵2、按鍵3以及按鍵4會(huì)響應(yīng),實(shí)現(xiàn)時(shí)間的加減、項(xiàng)目切換及退回主界面的操作。進(jìn)行時(shí)間加減時(shí),計(jì)數(shù)會(huì)循環(huán)變化,如:當(dāng)鬧鈴時(shí)間為23:59:59時(shí),時(shí)

14、加會(huì)變?yōu)?0,分加會(huì)變?yōu)?0并且時(shí)會(huì)加1,秒同理;當(dāng)時(shí)間為00:00:00時(shí),時(shí)減會(huì)變?yōu)?3,分減會(huì)變?yōu)?9并且時(shí)會(huì)減1,秒同理。同時(shí),當(dāng)進(jìn)入鬧鈴修改界面后三盞指示LED燈就會(huì)分別點(diǎn)亮,第一盞點(diǎn)亮表示時(shí)修改,第二盞點(diǎn)亮表示分修改,第三盞點(diǎn)亮表示秒修改(初始為時(shí)修改,可按按鍵3進(jìn)行切換)。鬧鈴修改界面仿真結(jié)果如圖5(見下一頁):</p><p>  2.5.液晶使用模塊</p><p>  

15、本模塊包含了,void init_lcd1602 (void) 1602液晶初始化函數(shù),void lcd_w_dat ( uchar dat )對(duì)1602液晶寫數(shù)據(jù)函數(shù)void lcd_w_cmd ( uchar com )對(duì)1602液晶寫指令函數(shù),void delay_us ( uchar t )延時(shí)函數(shù),均為1602型液晶必須函數(shù)。</p><p>  2.6其他輔助模塊函數(shù)以及變量</p>&

16、lt;p>  除了以上介紹的模塊以外,本程序還編寫了其他的輔助模塊函數(shù)以及變量。如前面提到的GetKey(void)讀按鍵值函數(shù),void QueryKeyboard(void)查詢按鍵函數(shù),還有SetTimeFlage設(shè)置時(shí)間標(biāo)志,DisplayFlage=0顯示標(biāo)志,用于防止在發(fā)生中斷時(shí),切斷當(dāng)前的顯示,防止造成顯示亂碼,SetAlarmFlage設(shè)置鬧鐘標(biāo)志,SetFlage設(shè)置標(biāo)志位,用于在設(shè)置選擇時(shí),防止在液晶第二行顯

17、示鬧鐘的時(shí)間,SoundFlage_1用于控制的鬧鐘的開和關(guān)的標(biāo)志位,SoundFlage_2用于計(jì)算響鈴的秒數(shù),Alarm_ON鬧鈴開關(guān)point_dis、ring用于標(biāo)志0.5S,mes用于定時(shí)器計(jì)時(shí)標(biāo)志。</p><p><b>  三、小結(jié)</b></p><p>  本次設(shè)計(jì)是采用液晶顯示,若僅是在液晶上顯示時(shí)鐘且無其他功能,程序的編寫非常簡單,但若加上可調(diào)

18、鬧鈴、可調(diào)時(shí)間,那么程序設(shè)計(jì)上就要花費(fèi)點(diǎn)功夫。編程調(diào)試時(shí)主要遇到如下問題:1、鬧鈴的響應(yīng),如果將整個(gè)模塊放到WHILE中,可能會(huì)造成響鈴時(shí)其他操作無法響應(yīng);2、時(shí)間和鬧鈴調(diào)節(jié)時(shí)液晶的響應(yīng)與按鍵的關(guān)系,如果將整個(gè)調(diào)節(jié)進(jìn)程放到顯示函數(shù)中,由于液晶的特性就導(dǎo)致了按鍵按下卻無響應(yīng)的情況;3、設(shè)置時(shí)的顯示提示,由于時(shí)間的調(diào)節(jié)需要調(diào)節(jié)時(shí)分秒三個(gè)項(xiàng)目,且切換到某個(gè)項(xiàng)目卻無提示是沒有意義的,但是實(shí)現(xiàn)時(shí)分秒的閃爍比較麻煩。</p><

19、p>  解決方法:1、2:通過編寫自定義函數(shù),并設(shè)置對(duì)應(yīng)的標(biāo)記變量,用標(biāo)記變量來控制對(duì)應(yīng)函數(shù)的運(yùn)行,進(jìn)而解決了響應(yīng)問題;3、通過外接3個(gè)LED燈,在設(shè)置時(shí)分秒時(shí)點(diǎn)亮對(duì)應(yīng)的燈進(jìn)行提示。</p><p><b>  四、附錄</b></p><p><b>  1、使用說明</b></p><p>  本程序下載到HC6

20、800單片機(jī)開發(fā)箱的使用方法如下:</p><p>  連接:用短路帽將MCU的P1.5腳與蜂鳴器連接,用連接線(排線或者杜邦線)分別將P3^0、P3^1、P3^2、P3^3連接到獨(dú)立按鍵的K1、K2、K3、K4、K5;分別將P1^0、P1^1、P1^2連接到8*1的LED等的D1、D2、D3,再在相應(yīng)的位置插上1602型液晶屏。</p><p><b>  操作方法:</

21、b></p><p>  主界面下:按鍵3(設(shè)置)、按鍵5(鬧鈴開關(guān))有效,按下按鍵3可進(jìn)入功能選擇界面,按鍵5可實(shí)現(xiàn)鬧鐘的開和關(guān)。</p><p>  功能選擇界面下:按鍵1、按鍵2有效,按下按鍵1可進(jìn)入時(shí)間修改界面,按下按鍵2可進(jìn)入鬧鈴修改界面。</p><p>  時(shí)間修改界面:按鍵1、按鍵2、按鍵3、按鍵4、LED1(對(duì)應(yīng)時(shí))、LED2(對(duì)應(yīng)分)、LE

22、D3(對(duì)應(yīng)秒)有效。按鍵1能進(jìn)行加1計(jì)數(shù),按鍵2能進(jìn)行減1計(jì)數(shù),按鍵3能進(jìn)行LED1~3的順序切換(LED3時(shí)再按一次則會(huì)回到主界面),按鍵4可直接退回主界面。</p><p>  鬧鈴修改界面:與時(shí)間修改界面相同。</p><p><b>  2、參考文獻(xiàn)資料</b></p><p>  a.單片機(jī)應(yīng)用技術(shù):C語言版/王靜霞主編.——北京:電

23、子工業(yè)出版社,2009.5</p><p><b>  b.百度文庫。</b></p><p><b>  3、附表1</b></p><p><b>  液晶時(shí)鐘源程序</b></p><p>  #include <reg51.h> </

24、p><p>  #define uchar unsigned char</p><p>  #define RingingTime30 //定義鬧鐘響鈴時(shí)間</p><p>  char Hour=23,Minute=59,Second=45; //定義時(shí)間的初始值</p><p>  char AHour=23,AMinu

25、te=59,ASecond=50; //定義鬧鐘的初始值</p><p>  sbit rs = P2^6; //設(shè)定液晶的相關(guān)管腳</p><p>  sbit rw= P2^5; </p><p>  sbit e = P2^7; </p><p>  sbit one_add = P3^

26、0; //設(shè)定控制按鍵的IO口</p><p>  sbit two_lower= P3^1; </p><p>  sbit set_sel = P3^2;</p><p>  sbit quit = P3^3;</p><p>  sbit alarm_on = P3^4; <

27、/p><p>  sbit Sound = P1^5; //設(shè)定的蜂鳴器的IO口</p><p>  sbit LED1 = P1^0; //設(shè)定三盞LED的IO口,用于顯示當(dāng)前處于設(shè)置的時(shí)分秒</p><p>  sbit LED2 = P1^1;</p><p>  sbit LED3 = P1^2;</p

28、><p>  uchar SetTimeFlage=0, //定義設(shè)置時(shí)間標(biāo)志位</p><p>  DisplayFlage=0, //定義顯示標(biāo)志位,用于防止在發(fā)生中斷時(shí),切斷當(dāng)前的顯示,防止造成顯示亂碼</p><p>  SetAlarmFlage=0, //定義設(shè)置鬧鐘標(biāo)志位</p><p>  SetFl

29、age=0, //定義設(shè)置標(biāo)志位,用于在設(shè)置選擇時(shí),防止在液晶第二行顯示鬧鐘的時(shí)間</p><p>  SoundFlage_1=0, //用于控制的鬧鐘的開和關(guān)的標(biāo)志位</p><p>  SoundFlage_2=0, //用于計(jì)算響鈴的秒數(shù)</p><p>  Alarm_ON=1; //鬧鈴開關(guān)</p&

30、gt;<p>  point_dis=0,ring=0, //用于標(biāo)志0.5S</p><p><b>  mes=0;</b></p><p>  uchar table[]="0123456789: "; //定義用于液晶顯示的字符串?dāng)?shù)組</p><p>  uchar Display2[]=

31、"1:Time 2:Alarm "; //定義顯示選擇菜單的內(nèi)容</p><p>  uchar Display3[]="Time :"; //定義顯示時(shí)間T和鬧鐘A的內(nèi)容</p><p>  uchar Display4[]="Alarm:";</p><p>  void init_lcd1

32、602 (void); //聲明1602液晶初始化函數(shù)</p><p>  void lcd_w_dat ( uchar dat ); //聲明對(duì)1602液晶寫數(shù)據(jù)函數(shù)</p><p>  void lcd_w_cmd ( uchar com ); //聲明對(duì)1602液晶寫指令函數(shù)</p><p>  void delay_u

33、s ( uchar t ); //聲明延時(shí)函數(shù)</p><p>  uchar GetKey(void); //聲明讀按鍵值函數(shù)</p><p>  void QueryKeyboard(void); //聲明查詢按鍵函數(shù)</p><p>  void SetTime(void); //聲明設(shè)置時(shí)間函數(shù)</p>

34、<p>  void SetAlarm(void); //聲明設(shè)置鬧鐘函數(shù)</p><p>  void Menu_display(void); //聲明主菜單顯示函數(shù)</p><p>  void Display(void); //聲明顯示函數(shù)</p><p>  void TimeDisplay(void); /

35、/聲明時(shí)間顯示</p><p>  void AlarmDisplay(void); //聲明鬧鐘顯示函數(shù)</p><p>  void TimeRunning(void); //聲明時(shí)鐘運(yùn)行函數(shù)</p><p>  void AlarmRunning(void); //聲明鬧鐘運(yùn)行函數(shù)</p><p>  /*↓↓

36、↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓定時(shí)中斷服務(wù)函數(shù)↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/</p><p>  void T0_int () interrupt1 //定時(shí)器0的中斷入口函數(shù)</p><p><b>  {</b></p><p>  TH0=15

37、536/256; //讀定時(shí)器0進(jìn)行重新裝載初始值</p><p>  TL0=15536%256;</p><p>  mes++; //計(jì)算定時(shí)器進(jìn)入中斷的次數(shù),也用于計(jì)算秒</p><p>  if(mes<5) ring=1;</p><p>  else if (mes<10)

38、 </p><p><b>  {</b></p><p>  point_dis=1;</p><p><b>  ring=0;</b></p><p><b>  }</b></p><p>  else if (mes<15)

39、ring=1;</p><p><b>  else</b></p><p><b>  {</b></p><p>  point_dis=0;</p><p><b>  ring=0;</b></p><p><b>  }</b&

40、gt;</p><p>  if (mes==20) //當(dāng)計(jì)夠20次就等于1S</p><p><b>  {</b></p><p><b>  mes = 0;</b></p><p><b>  Second++;</b></p><p

41、>  if (SoundFlage_1==1) //若鬧鐘鈴被打開</p><p><b>  {</b></p><p>  SoundFlage_2++; //就對(duì)鬧鈴的時(shí)間進(jìn)行定時(shí)計(jì)數(shù)</p><p>  if (SoundFlage_2==RingingTime) //若計(jì)夠設(shè)置的響鈴時(shí)間</p>

42、<p><b>  {</b></p><p>  SoundFlage_1=0; //關(guān)響鈴</p><p>  SoundFlage_2=0; //清計(jì)數(shù)</p><p>  Sound=1; //關(guān)蜂鳴器</p><p><b>  }</b></p

43、><p><b>  } </b></p><p><b>  }</b></p><p>  if (DisplayFlage==0) //判斷有無其它函數(shù)在對(duì)液晶進(jìn)行寫操作</p><p><b>  {</b></p><p>  Dis

44、play(); </p><p><b>  }</b></p><p>  TimeRunning(); //對(duì)時(shí)鐘時(shí)間進(jìn)行運(yùn)算</p><p><b>  }</b></p><p>  /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓主函數(shù)

45、↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/</p><p>  void main ( void ) //主函數(shù)</p><p><b>  {</b></p><p><b>  rw = 0;</b></p><p>  init_lcd1602(

46、); //初始化1602液晶</p><p>  TMOD=0x01; //開通定時(shí)計(jì)數(shù)器0</p><p>  TH0=15536/256; //對(duì)定時(shí)計(jì)數(shù)器進(jìn)行賦初始值</p><p>  TL0=15536%256;</p><p>  EA=1; //打開總中斷<

47、/p><p><b>  ET0=1;</b></p><p><b>  TR0=1;</b></p><p><b>  while (1)</b></p><p><b>  {</b></p><p>  QueryKeyboa

48、rd(); //查詢鍵盤,從中可以得出有沒有按鍵按下,按下的是不是設(shè)置按鍵3</p><p>  if(SetTimeFlage==1) //設(shè)置時(shí)間標(biāo)志位被置1,就說明當(dāng)前處于設(shè)置時(shí)間狀態(tài)</p><p><b>  {</b></p><p>  SetTime(); //調(diào)用設(shè)置時(shí)間函數(shù)</p>&

49、lt;p><b>  }</b></p><p>  if(SetAlarmFlage==1) //設(shè)置鬧鐘標(biāo)志位被置1,就說明當(dāng)前處于設(shè)置鬧鐘狀態(tài)</p><p><b>  {</b></p><p>  SetAlarm(); //調(diào)用設(shè)置鬧鐘函數(shù)</p><p><

50、;b>  }</b></p><p>  AlarmRunning(); //鬧鐘運(yùn)行</p><p>  if (SoundFlage_1==1 && Alarm_ON==1) //若時(shí)間到了,這標(biāo)志位就會(huì)被置1</p><p><b>  {</b></p><p>

51、  if (ring==0) //判斷當(dāng)前是不是處于0.5S,用于半秒響一次鈴、滅一次鈴</p><p><b>  {</b></p><p>  Sound=1; </p><p><b>  }</b></p><p><b>  else</b>

52、</p><p><b>  {</b></p><p><b>  Sound=0;</b></p><p><b>  }</b></p><p><b>  } </b></p><p><b> 

53、 }</b></p><p><b>  }</b></p><p>  /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓時(shí)間、鬧鈴設(shè)置函數(shù)↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/</p><p>  void SetTime(void) //時(shí)間設(shè)置

54、</p><p><b>  {</b></p><p>  uchar KeyValue=0,i=0;</p><p>  uchar tset_dis[]=" Time setting";</p><p>  while (SetTimeFlage == 1) //直到時(shí)間設(shè)置完成才推出

55、此循環(huán)</p><p><b>  {</b></p><p>  lcd_w_cmd(0x01);//液晶清屏命令</p><p>  TimeDisplay();//顯示當(dāng)前時(shí)間</p><p>  lcd_w_cmd(0xc0);</p><p>  while(tset_

56、dis[i]!='\0')</p><p><b>  {</b></p><p>  lcd_w_dat(tset_dis[i]);</p><p><b>  i++;</b></p><p><b>  }</b></p><p>

57、  EA=0; //因?yàn)橐呀?jīng)進(jìn)入設(shè)置時(shí)間狀態(tài),所以關(guān)總中斷和管定時(shí)器中斷</p><p><b>  ET0=0;</b></p><p><b>  TR0=0;</b></p><p>  point_dis=0; //將這值置0,用于時(shí)間顯示時(shí)顯示 :: </p>

58、<p>  KeyValue = GetKey();</p><p>  while(KeyValue!=3) //等待按下確認(rèn)按鍵</p><p><b>  {</b></p><p>  LED1 = 0; //點(diǎn)亮LED1,用于顯示當(dāng)前是在設(shè)置時(shí)鐘的時(shí)</p><p>  Ke

59、yValue = GetKey(); //</p><p>  if (KeyValue==1) //若按下按鍵1,就對(duì)時(shí)進(jìn)行加1</p><p><b>  { </b></p><p>  if (Hour<23) </p><p><b>  Hour++;</b

60、></p><p>  else Hour=0;</p><p><b>  }</b></p><p>  if (KeyValue==2) //若按下按鍵2,就對(duì)時(shí)進(jìn)行減1</p><p><b>  {</b></p><p>  if(Hour>1

61、)</p><p><b>  Hour--;</b></p><p>  else Hour=23;</p><p><b>  }</b></p><p>  TimeDisplay(); //顯示當(dāng)前時(shí)鐘的值,用于在液晶顯示刷新</p><p>  if(Ke

62、yValue==4)</p><p><b>  {</b></p><p>  SetTimeFlage=0;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</

63、b></p><p>  LED1=1; //關(guān)閉設(shè)置時(shí)的LED,進(jìn)行下一步的設(shè)置分</p><p>  KeyValue = GetKey();</p><p>  while(KeyValue!=3) //若沒有按下確認(rèn)按鍵,直到按下確認(rèn)按鍵為止</p><p><b>  {</b>

64、</p><p>  if(SetTimeFlage==1)</p><p>  LED2=0; //點(diǎn)亮LED2,用于顯示當(dāng)前是在設(shè)置時(shí)鐘的分</p><p>  KeyValue = GetKey();</p><p>  if (KeyValue==1) //若按下按鍵1,就對(duì)分進(jìn)行加1</p>&l

65、t;p><b>  {</b></p><p>  if(Minute<59)</p><p><b>  Minute++;</b></p><p><b>  else </b></p><p><b>  {</b></p>

66、<p><b>  Minute=0;</b></p><p>  if(Hour==23)</p><p><b>  Hour=0;</b></p><p>  else Hour++;</p><p><b>  }</b></p><p&

67、gt;<b>  }</b></p><p>  if (KeyValue==2) //若按下按鍵2,就對(duì)分進(jìn)行減1</p><p><b>  {</b></p><p>  if(Minute>1)</p><p><b>  Minute--;</b><

68、;/p><p><b>  else</b></p><p><b>  {</b></p><p>  Minute=59;</p><p>  if(Hour==0)</p><p><b>  Hour=23;</b></p><p

69、>  else Hour--;</p><p><b>  }</b></p><p><b>  }</b></p><p>  TimeDisplay(); //顯示當(dāng)前時(shí)鐘的值,用于在液晶顯示刷新</p><p>  if(KeyValue==4 || SetTimeFlage

70、==0)</p><p><b>  {</b></p><p>  SetTimeFlage=0;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b>&

71、lt;/p><p>  LED2=1; //關(guān)閉設(shè)置時(shí)的LED,進(jìn)行下一步的設(shè)置秒</p><p>  KeyValue = GetKey();</p><p>  while(KeyValue!=3) //若沒有按下確認(rèn)按鍵,直到按下確認(rèn)按鍵為止</p><p><b>  {</b></p

72、><p>  if(SetTimeFlage==1)</p><p>  LED3=0; //點(diǎn)亮LED3,用于顯示當(dāng)前是在設(shè)置時(shí)鐘的秒</p><p>  KeyValue = GetKey();</p><p>  if (KeyValue==1) //若按下按鍵1,就對(duì)秒進(jìn)行加1</p><p>

73、;<b>  {</b></p><p>  if(Second<59)</p><p><b>  Second++;</b></p><p><b>  else </b></p><p><b>  {</b></p><p

74、><b>  Second=0;</b></p><p>  if(Minute==59)</p><p><b>  {</b></p><p><b>  Minute=0;</b></p><p>  if(Hour==23)</p><p>

75、;<b>  Hour=0;</b></p><p>  else Hour++;</p><p><b>  }</b></p><p>  else Minute++;</p><p><b>  }</b></p><p><b>  }

76、</b></p><p>  if (KeyValue==2) //若按下按鍵2,就對(duì)秒進(jìn)行減1</p><p><b>  {</b></p><p>  if(Second>1)</p><p><b>  Second--;</b></p><p&

77、gt;<b>  else</b></p><p><b>  {</b></p><p>  Second=59;</p><p>  if(Minute==0)</p><p><b>  {</b></p><p>  Minute=59;<

78、/p><p>  if(Hour==0)</p><p><b>  Hour=23;</b></p><p>  else Hour--;</p><p><b>  }</b></p><p>  else Minute--;</p><p><

79、b>  }</b></p><p><b>  }</b></p><p>  TimeDisplay(); //顯示當(dāng)前時(shí)鐘的值,用于在液晶顯示刷新</p><p>  if(KeyValue==4 || SetTimeFlage==0)</p><p><b>  break;&

80、lt;/b></p><p><b>  }</b></p><p>  LED3=1; //關(guān)閉LED,設(shè)置完成</p><p>  EA=1; //打開相關(guān)中斷</p><p><b>  ET0=1;</b></p><p><

81、;b>  TR0=1;</b></p><p>  SetTimeFlage=0; //將時(shí)間設(shè)置標(biāo)志位置0,完成一次時(shí)間的設(shè)置</p><p><b>  }</b></p><p><b>  }</b></p><p>  void SetAlarm(void)

82、 //鬧鈴設(shè)置</p><p><b>  {</b></p><p>  uchar KeyValue=0,i=0;</p><p>  uchar aset_dis[]="Alarm setting";</p><p>  while (SetAlarmFlage == 1)</p

83、><p><b>  {</b></p><p>  lcd_w_cmd(0x01);</p><p>  lcd_w_cmd(0x80);</p><p>  while(aset_dis[i]!='\0')</p><p><b>  {</b></p&

84、gt;<p>  lcd_w_dat(aset_dis[i]);</p><p><b>  i++;</b></p><p><b>  }</b></p><p>  KeyValue = GetKey();</p><p>  AlarmDisplay();</p>

85、<p>  while(KeyValue!=3) //等待按下確認(rèn)按鍵</p><p><b>  {</b></p><p>  LED1 = 0; //點(diǎn)亮LED1,用于顯示當(dāng)前是在設(shè)置時(shí)鐘的時(shí)</p><p>  KeyValue = GetKey(); //</p><p>

86、;  if (KeyValue==1) //若按下按鍵1,就對(duì)時(shí)進(jìn)行加1</p><p><b>  { </b></p><p>  if (AHour<23) </p><p><b>  AHour++;</b></p><p>  else AHour=0;&l

87、t;/p><p><b>  }</b></p><p>  if (KeyValue==2) //若按下按鍵2,就對(duì)時(shí)進(jìn)行減1</p><p><b>  {</b></p><p>  if(AHour>1)</p><p><b>  AHour--

88、;</b></p><p>  else AHour=23;</p><p><b>  }</b></p><p>  AlarmDisplay(); //顯示當(dāng)前時(shí)鐘的值,用于在液晶顯示刷新</p><p>  if(KeyValue==4)</p><p><b&

89、gt;  {</b></p><p>  SetAlarmFlage=0;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  LED1=1;

90、 //關(guān)閉設(shè)置時(shí)的LED,進(jìn)行下一步的設(shè)置分</p><p>  KeyValue = GetKey();</p><p>  while(KeyValue!=3) //若沒有按下確認(rèn)按鍵,直到按下確認(rèn)按鍵為止</p><p><b>  {</b></p><p>  if(SetAlarmFl

91、age==1)</p><p>  LED2=0; //點(diǎn)亮LED2,用于顯示當(dāng)前是在設(shè)置時(shí)鐘的分</p><p>  KeyValue = GetKey();</p><p>  if (KeyValue==1) //若按下按鍵1,就對(duì)分進(jìn)行加1</p><p><b>  {</b></p

92、><p>  if(AMinute<59)</p><p>  AMinute++;</p><p><b>  else </b></p><p><b>  {</b></p><p>  AMinute=0;</p><p>  if(AHou

93、r==23)</p><p><b>  AHour=0;</b></p><p>  else AHour++;</p><p><b>  }</b></p><p><b>  }</b></p><p>  if (KeyValue==2)

94、 //若按下按鍵2,就對(duì)分進(jìn)行減1</p><p><b>  {</b></p><p>  if(AMinute>1)</p><p>  AMinute--;</p><p><b>  else</b></p><p><b>  {</b&g

95、t;</p><p>  AMinute=59;</p><p>  if(AHour==0)</p><p><b>  AHour=23;</b></p><p>  else AHour--;</p><p><b>  }</b></p><p&g

96、t;<b>  }</b></p><p>  AlarmDisplay(); //顯示當(dāng)前時(shí)鐘的值,用于在液晶顯示刷新</p><p>  if(KeyValue==4 || SetAlarmFlage==0)</p><p><b>  {</b></p><p>  SetAlarm

97、Flage=0;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  LED2=1; //關(guān)閉設(shè)置時(shí)的LED,進(jìn)行下一步的設(shè)置秒</p><p&

98、gt;  KeyValue = GetKey();</p><p>  while(KeyValue!=3) //若沒有按下確認(rèn)按鍵,直到按下確認(rèn)按鍵為止</p><p><b>  {</b></p><p>  if(SetAlarmFlage==1)</p><p>  LED3=0; //

99、點(diǎn)亮LED3,用于顯示當(dāng)前是在設(shè)置時(shí)鐘的秒</p><p>  KeyValue = GetKey();</p><p>  if (KeyValue==1) //若按下按鍵1,就對(duì)秒進(jìn)行加1</p><p><b>  {</b></p><p>  if(ASecond<59)</p>&

100、lt;p>  ASecond++;</p><p><b>  else </b></p><p><b>  {</b></p><p>  ASecond=0;</p><p>  if(AMinute==59)</p><p><b>  {</b

101、></p><p>  AMinute=0;</p><p>  if(AHour==23)</p><p><b>  AHour=0;</b></p><p>  else AHour++;</p><p><b>  }</b></p><p&

102、gt;  else AMinute++;</p><p><b>  }</b></p><p><b>  }</b></p><p>  if (KeyValue==2) //若按下按鍵2,就對(duì)秒進(jìn)行減1</p><p><b>  {</b></p>

103、<p>  if(ASecond>1)</p><p>  ASecond--;</p><p><b>  else</b></p><p><b>  {</b></p><p>  ASecond=59;</p><p>  if(AMinute==0

104、)</p><p><b>  {</b></p><p>  AMinute=59;</p><p>  if(AHour==0)</p><p><b>  AHour=23;</b></p><p>  else AHour--;</p><p>

105、;<b>  }</b></p><p>  else AMinute--;</p><p><b>  }</b></p><p><b>  }</b></p><p>  AlarmDisplay(); //顯示當(dāng)前時(shí)鐘的值,用于在液晶顯示刷新</p>

106、;<p>  if(KeyValue==4 || SetAlarmFlage==0)</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  LED3=1;</b></p><p>  SetAla

107、rmFlage=0;</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓時(shí)間、鬧鈴、設(shè)置菜單顯示函數(shù)↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/</p>

108、;<p>  void Menu_display (void) //主菜單顯示函數(shù)</p><p><b>  {</b></p><p>  uchar i=0,KeyValue=0;</p><p>  uchar menu_dis[]="Setting Function";

109、</p><p>  DisplayFlage=1; //將顯示標(biāo)志位置1,防止在發(fā)生中斷時(shí),切斷當(dāng)前的顯示,防止造成顯示亂碼</p><p>  KeyValue = GetKey();</p><p><b>  Sound=1;</b></p><p>  lcd_w_cmd(0x01);</

110、p><p>  lcd_w_cmd(0x80);</p><p>  while(menu_dis[i]!='\0') //顯示 Setting Function</p><p><b>  {</b></p><p>  lcd_w_dat ( menu_dis[i] );</p>

111、<p><b>  i++;</b></p><p><b>  }</b></p><p><b>  i=0;</b></p><p>  lcd_w_cmd (0xc0); //在液晶上設(shè)置顯示的光標(biāo)位置,第二行第1個(gè)</p><p&g

112、t;  while(Display2[i]!='\0') //循環(huán)輸出上面定義的主菜單顯示字符數(shù)組</p><p><b>  {</b></p><p>  lcd_w_dat ( Display2[i] );</p><p><b>  i++;</b></p><p>

113、;<b>  } </b></p><p>  DisplayFlage=0; //清楚顯示標(biāo)志位</p><p><b>  }</b></p><p>  void Display(void) //主顯示函數(shù)</p><p><b>  {</b&

114、gt;</p><p>  if(SetAlarmFlage==0 && SetTimeFlage==0)</p><p>  TimeDisplay(); //顯示時(shí)間</p><p>  if(SetAlarmFlage==0 && SetTimeFlage==0) //判斷鬧鐘設(shè)置標(biāo)志位,用于防止在設(shè)置鬧

115、鐘時(shí),被定時(shí)中斷調(diào)用,防止出現(xiàn)亂碼</p><p><b>  { </b></p><p>  AlarmDisplay(); //鬧鐘時(shí)間顯示</p><p><b>  }</b></p><p><b>  }</b></p><p

116、>  void TimeDisplay(void) //時(shí)間顯示</p><p><b>  {</b></p><p>  uchar i=0;</p><p>  DisplayFlage=1; //將顯示標(biāo)志位置1,防止在發(fā)生中斷時(shí),切斷當(dāng)前的顯示,防止造成顯示亂碼</p><p>

117、  lcd_w_cmd (0x80); </p><p>  if (SetFlage == 0)//若現(xiàn)在不是出于設(shè)置選擇狀態(tài)</p><p><b>  {</b></p><p>  while(Display3[i]!='\0')</p><p><b&

118、gt;  {</b></p><p>  lcd_w_dat(Display3[i]);</p><p><b>  i++;</b></p><p><b>  }</b></p><p>  lcd_w_dat (table[Hour/10]);//顯示時(shí)間的時(shí)的十位</

119、p><p>  lcd_w_dat (table[Hour%10]);//顯示時(shí)間的時(shí)的個(gè)位</p><p>  if (point_dis==1)//判斷0.5S的標(biāo)志位,用于顯示 : ,或顯示空格字符,達(dá)到一種閃爍的效果</p><p><b>  {</b></p><p>  lcd_w_dat (t

120、able[11]);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  lcd_w_dat (table[10]);</p><p><b>  }

121、</b></p><p>  lcd_w_dat (table[Minute/10]);//顯示時(shí)間的分的十位</p><p>  lcd_w_dat (table[Minute%10]);//顯示時(shí)間的分的個(gè)位</p><p>  if (point_dis==1)//判斷0.5S的標(biāo)志位,用于顯示 : ,或顯示空格字符,達(dá)到一種閃爍

122、的效果</p><p><b>  {</b></p><p>  lcd_w_dat (table[11]);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b&

123、gt;</p><p>  lcd_w_dat (table[10]);</p><p><b>  }</b></p><p>  lcd_w_dat (table[Second/10]);//顯示時(shí)間的秒的十位</p><p>  lcd_w_dat (table[Second%10]);//顯示時(shí)間的秒的個(gè)

124、位</p><p>  DisplayFlage=0;//清除顯示標(biāo)志位</p><p><b>  }</b></p><p><b>  }</b></p><p>  void AlarmDisplay(void) //鬧鐘顯示</p>

125、<p><b>  {</b></p><p>  uchar i=0;</p><p>  DisplayFlage=1;//將顯示標(biāo)志位置1,防止在發(fā)生中斷時(shí),切斷當(dāng)前的顯示,防止造成顯示亂碼</p><p>  if (SetFlage == 0)//若現(xiàn)在不是出于設(shè)置選擇狀態(tài)</p>

126、;<p><b>  { </b></p><p>  if(Alarm_ON==1)</p><p><b>  {</b></p><p>  lcd_w_cmd(0xcf);</p><p>  lcd_w_dat('P');</p><p&g

127、t;<b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  lcd_w_cmd(0xcf);</p><p>  lcd_w_dat(' ');</p><p>&

128、lt;b>  }</b></p><p>  lcd_w_cmd (0xc0); </p><p>  while(Display4[i]!='\0')</p><p><b>  {</b></p><p>  lcd_w_dat(Display4[i]);

129、</p><p><b>  i++;</b></p><p><b>  }</b></p><p>  lcd_w_dat (table[AHour/10]);//顯示鬧鐘的時(shí)的十位</p><p>  lcd_w_dat (table[AHour%10]);//顯示鬧鐘的時(shí)的個(gè)位</

130、p><p>  lcd_w_dat (table[10]);//顯示 :</p><p>  lcd_w_dat (table[AMinute/10]);//顯示鬧鐘的分的十位</p><p>  lcd_w_dat (table[AMinute%10]);//顯示鬧鐘的分的個(gè)位</p><p>  lcd_w_dat (table[1

131、0]);//顯示 :</p><p>  lcd_w_dat (table[ASecond/10]);//顯示鬧鐘的秒的十位</p><p>  lcd_w_dat (table[ASecond%10]);//顯示鬧鐘的秒的個(gè)位</p><p><b>  }</b></p><p>  DisplayFlag

132、e=0;//清除顯示標(biāo)志位</p><p><b>  }</b></p><p>  /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓時(shí)間、鬧鈴計(jì)時(shí)運(yùn)算函數(shù)↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/</p><p>  void TimeRunning(void

133、) //時(shí)鐘運(yùn)行</p><p><b>  {</b></p><p>  if (Second>59) //對(duì)時(shí)分秒進(jìn)行運(yùn)算</p><p><b>  {</b></p><p><b>  Second=0;</b></p>

134、<p><b>  Minute++;</b></p><p>  if (Minute>59)</p><p><b>  {</b></p><p><b>  Minute=0;</b></p><p><b>  Hour++;</b&

135、gt;</p><p>  if (Hour>23)</p><p><b>  {</b></p><p>  Hour=0; </p><p><b>  }</b></p><p><b>  } </b></p>

136、<p><b>  }</b></p><p><b>  }</b></p><p>  void AlarmRunning(void) //鬧鐘運(yùn)行</p><p><b>  {</b></p><p>  if (Hour==AHour)

137、 //鬧鐘時(shí)分秒和時(shí)鐘時(shí)分秒進(jìn)行對(duì)比</p><p><b>  {</b></p><p>  if (Minute==AMinute)</p><p><b>  {</b></p><p>  if (Second==ASecond)</p><p><b>

138、;  {</b></p><p>  SoundFlage_1=1; //若時(shí)分秒都相等,就將響鈴打開</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><

溫馨提示

  • 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)論