c51課程設計報告(液晶時鐘)_第1頁
已閱讀1頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

26、0; //設定控制按鍵的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; //設定的蜂鳴器的IO口</p><p>  sbit LED1 = P1^0; //設定三盞LED的IO口,用于顯示當前處于設置的時分秒</p><p>  sbit LED2 = P1^1;</p><p>  sbit LED3 = P1^2;</p

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

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

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

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

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

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

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

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

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

37、536/256; //讀定時器0進行重新裝載初始值</p><p>  TL0=15536%256;</p><p>  mes++; //計算定時器進入中斷的次數(shù),也用于計算秒</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) //當計夠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++; //就對鬧鈴的時間進行定時計數(shù)</p><p>  if (SoundFlage_2==RingingTime) //若計夠設置的響鈴時間</p>

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

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

44、play(); </p><p><b>  }</b></p><p>  TimeRunning(); //對時鐘時間進行運算</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ù)器0</p><p>  TH0=15536/256; //對定時計數(shù)器進行賦初始值</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(); //查詢鍵盤,從中可以得出有沒有按鍵按下,按下的是不是設置按鍵3</p><p>  if(SetTimeFlage==1) //設置時間標志位被置1,就說明當前處于設置時間狀態(tài)</p><p><b>  {</b></p><p>  SetTime(); //調用設置時間函數(shù)</p>&

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

50、;b>  }</b></p><p>  AlarmRunning(); //鬧鐘運行</p><p>  if (SoundFlage_1==1 && Alarm_ON==1) //若時間到了,這標志位就會被置1</p><p><b>  {</b></p><p>

51、  if (ring==0) //判斷當前是不是處于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ù)↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/</p><p>  void SetTime(void) //時間設置

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

55、此循環(huán)</p><p><b>  {</b></p><p>  lcd_w_cmd(0x01);//液晶清屏命令</p><p>  TimeDisplay();//顯示當前時間</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; //因為已經(jīng)進入設置時間狀態(tài),所以關總中斷和管定時器中斷</p><p><b>  ET0=0;</b></p><p><b>  TR0=0;</b></p><p>  point_dis=0; //將這值置0,用于時間顯示時顯示 :: </p>

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

59、yValue = GetKey(); //</p><p>  if (KeyValue==1) //若按下按鍵1,就對時進行加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,就對時進行減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(); //顯示當前時鐘的值,用于在液晶顯示刷新</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; //關閉設置時的LED,進行下一步的設置分</p><p>  KeyValue = GetKey();</p><p>  while(KeyValue!=3) //若沒有按下確認按鍵,直到按下確認按鍵為止</p><p><b>  {</b>

64、</p><p>  if(SetTimeFlage==1)</p><p>  LED2=0; //點亮LED2,用于顯示當前是在設置時鐘的分</p><p>  KeyValue = GetKey();</p><p>  if (KeyValue==1) //若按下按鍵1,就對分進行加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,就對分進行減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(); //顯示當前時鐘的值,用于在液晶顯示刷新</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; //關閉設置時的LED,進行下一步的設置秒</p><p>  KeyValue = GetKey();</p><p>  while(KeyValue!=3) //若沒有按下確認按鍵,直到按下確認按鍵為止</p><p><b>  {</b></p

72、><p>  if(SetTimeFlage==1)</p><p>  LED3=0; //點亮LED3,用于顯示當前是在設置時鐘的秒</p><p>  KeyValue = GetKey();</p><p>  if (KeyValue==1) //若按下按鍵1,就對秒進行加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,就對秒進行減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(); //顯示當前時鐘的值,用于在液晶顯示刷新</p><p>  if(KeyValue==4 || SetTimeFlage==0)</p><p><b>  break;&

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

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

82、 //鬧鈴設置</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) //等待按下確認按鍵</p><p><b>  {</b></p><p>  LED1 = 0; //點亮LED1,用于顯示當前是在設置時鐘的時</p><p>  KeyValue = GetKey(); //</p><p>

86、;  if (KeyValue==1) //若按下按鍵1,就對時進行加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,就對時進行減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(); //顯示當前時鐘的值,用于在液晶顯示刷新</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、 //關閉設置時的LED,進行下一步的設置分</p><p>  KeyValue = GetKey();</p><p>  while(KeyValue!=3) //若沒有按下確認按鍵,直到按下確認按鍵為止</p><p><b>  {</b></p><p>  if(SetAlarmFl

91、age==1)</p><p>  LED2=0; //點亮LED2,用于顯示當前是在設置時鐘的分</p><p>  KeyValue = GetKey();</p><p>  if (KeyValue==1) //若按下按鍵1,就對分進行加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,就對分進行減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(); //顯示當前時鐘的值,用于在液晶顯示刷新</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; //關閉設置時的LED,進行下一步的設置秒</p><p&

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

99、點亮LED3,用于顯示當前是在設置時鐘的秒</p><p>  KeyValue = GetKey();</p><p>  if (KeyValue==1) //若按下按鍵1,就對秒進行加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,就對秒進行減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(); //顯示當前時鐘的值,用于在液晶顯示刷新</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ù)↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/</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; //將顯示標志位置1,防止在發(fā)生中斷時,切斷當前的顯示,防止造成顯示亂碼</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); //在液晶上設置顯示的光標位置,第二行第1個</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; //清楚顯示標志位</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(); //顯示時間</p><p>  if(SetAlarmFlage==0 && SetTimeFlage==0) //判斷鬧鐘設置標志位,用于防止在設置鬧

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

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

117、  lcd_w_cmd (0x80); </p><p>  if (SetFlage == 0)//若現(xiàn)在不是出于設置選擇狀態(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]);//顯示時間的時的十位</

119、p><p>  lcd_w_dat (table[Hour%10]);//顯示時間的時的個位</p><p>  if (point_dis==1)//判斷0.5S的標志位,用于顯示 : ,或顯示空格字符,達到一種閃爍的效果</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]);//顯示時間的分的十位</p><p>  lcd_w_dat (table[Minute%10]);//顯示時間的分的個位</p><p>  if (point_dis==1)//判斷0.5S的標志位,用于顯示 : ,或顯示空格字符,達到一種閃爍

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]);//顯示時間的秒的十位</p><p>  lcd_w_dat (table[Second%10]);//顯示時間的秒的個

124、位</p><p>  DisplayFlage=0;//清除顯示標志位</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;//將顯示標志位置1,防止在發(fā)生中斷時,切斷當前的顯示,防止造成顯示亂碼</p><p>  if (SetFlage == 0)//若現(xiàn)在不是出于設置選擇狀態(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]);//顯示鬧鐘的時的十位</p><p>  lcd_w_dat (table[AHour%10]);//顯示鬧鐘的時的個位</

130、p><p>  lcd_w_dat (table[10]);//顯示 :</p><p>  lcd_w_dat (table[AMinute/10]);//顯示鬧鐘的分的十位</p><p>  lcd_w_dat (table[AMinute%10]);//顯示鬧鐘的分的個位</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]);//顯示鬧鐘的秒的個位</p><p><b>  }</b></p><p>  DisplayFlag

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

133、) //時鐘運行</p><p><b>  {</b></p><p>  if (Second>59) //對時分秒進行運算</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) //鬧鐘運行</p><p><b>  {</b></p><p>  if (Hour==AHour)

137、 //鬧鐘時分秒和時鐘時分秒進行對比</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; //若時分秒都相等,就將響鈴打開</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><

溫馨提示

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

評論

0/150

提交評論