版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 課 程 設 計</p><p> 課程名稱 單片機原理與應用 </p><p> 課題名稱 電子時鐘 </p><p> 專 業(yè) 電氣工程及其自動化 </p><p> 班 級 &
2、lt;/p><p> 學 號 </p><p> 姓 名 </p><p> 指導教師 </p><p><b> 年 月 日</b></
3、p><p> 課 程 設 計 任 務 書</p><p> 課程名稱 單片機原理與應用 </p><p> 課 題 電子時鐘 </p><p> 專業(yè)班級 </p><p> 學生姓名
4、 </p><p> 學 號 </p><p> 指導老師 </p><p> 審 批 </p><p> 任務書下達日期 年 月 日</p>
5、<p> 任務完成日期 年 月 日</p><p><b> 目 錄</b></p><p> 第1章 總體設計方案選擇與說明1</p><p> 1.1 設計方案1</p><p> 第2章 系統(tǒng)結構框圖與工作原理2</p><p> 2.1系統(tǒng)結構
6、框圖:2</p><p> 2.2系統(tǒng)工作原理2</p><p> 第3章 硬件電路設計及說明3</p><p> 3.1鍵盤接口電路3</p><p><b> 3.2顯示電路4</b></p><p> 第4章 軟件設計與說明5</p><p>
7、 4.1 初始化子程序5</p><p> 4.2 延時子函數(shù)5</p><p> 4.3 鍵盤掃描函數(shù)6</p><p> 4.4 按鍵服務函數(shù)6</p><p> 4.5 數(shù)碼管顯示函數(shù)8</p><p> 4.6 中斷服務函數(shù)10</p><p> 4.7 主程序流
8、程圖12</p><p> 第5章 調試結果與調試說明13</p><p><b> 設計總結14</b></p><p><b> 參考文獻15</b></p><p><b> 附 錄16</b></p><p> 附錄A:設計電
9、路圖16</p><p> 附錄B:源程序清單17</p><p> 第1章 總體設計方案選擇與說明</p><p><b> 1.1 設計方案</b></p><p> 本系統(tǒng)的硬件主要包括單片機芯片、數(shù)碼管顯示、按鍵開關電路,它的硬件電路如原理圖,單片機采用廣泛的AT89C51,系統(tǒng)時鐘采用12MHz的晶
10、振,8個數(shù)碼管顯示,小時與分鐘、分鐘與秒鐘之間用短橫線間隔,采用共陽極七段式數(shù)碼管,P0口為段選碼輸出端與數(shù)碼管相連,P2口為位選碼輸出端,分別與數(shù)碼管陽極相連。按鍵開關設定了6個,通過P1口相連。分別為啟動、停止、復位、設置、加、減。</p><p> 整個系統(tǒng)分為:主程序、數(shù)碼管顯示模塊(在本系統(tǒng)中數(shù)碼管采用軟件譯碼動態(tài)顯示,在存儲器中首先建立一張顯示信息的字段碼管,顯示時,先從顯示緩沖區(qū)中取出顯示的信息,
11、然后通過查表程序在字段碼中查出顯示所顯示的信息的字段碼,從P0口將對應的位選碼輸出,選中顯示的數(shù)碼管,就能在相應的數(shù)碼管上顯示顯示緩沖區(qū)的內容。)、定時器/計數(shù)器T1中斷服務程序、按鍵處理模塊(按鍵處理設置為:在時鐘正常顯示時,按下【設置】鍵進入秒表模式,若不按秒表的控制鍵啟動、停止、復位,則在再次按下【設置】鍵是轉入調秒狀態(tài),再按進入調分,再按進入調時,再按回到正常顯示時鐘狀態(tài)。否則會直接回到正常狀態(tài)。 在調秒、調時、調分狀態(tài)下按下
12、【加】或【減】可進行單個加1或單個減1操作,若按下不松1s后會連續(xù)加或連續(xù)減。</p><p> 第2章 系統(tǒng)結構框圖與工作原理</p><p> 2.1系統(tǒng)結構框圖: </p><p> 圖2.1 系統(tǒng)結構框圖</p><p><b> 2.2系統(tǒng)工作原理</b>&l
13、t;/p><p> 利用單片機定時器完成計時功能,定時器1計時中斷程序每隔10ms中斷一次并當作一個計數(shù),設定定時1秒的中斷計數(shù)初值閥值為100,每中斷一次中斷計數(shù)加1,當加到100時,則表示1s到了,秒變量加1,同理再判斷是否1min鐘到了,再判斷是否1h到了。 </p><p> 為了將時間在LED數(shù)碼管上顯示,可采用靜態(tài)顯示法和動態(tài)顯示法,由于靜態(tài)顯示法需要譯碼器,數(shù)據(jù)鎖存
14、器等較多硬件,可采用動態(tài)顯示法實現(xiàn)LED顯示,通過對每位數(shù)碼管的依次掃描,使對應數(shù)碼管亮,同時向該數(shù)碼管送對應的字碼,使其顯示數(shù)字。由于數(shù)碼管掃描周期很短,由于人眼的視覺暫留效應,使數(shù)碼管看起來總是亮的,從而實現(xiàn)了各種顯示。</p><p> 第3章 硬件電路設計及說明</p><p><b> 3.1鍵盤接口電路</b></p><p>
15、 獨立式鍵盤:獨立式鍵盤中,每個按鍵占用一根I/O口線,每個按鍵電路相對獨立。I/O口通過按鍵與地相連,I/O口有上拉電阻,無鍵按下時,引腳端為高電平,有鍵按下時,引腳電平被拉低,I/O口內部有上拉電阻時,外部可不接上拉電阻。</p><p> 圖3.1 鍵盤接口電路圖</p><p><b> 3.2顯示電路</b></p><p>
16、 它的連接方式為7段共陽LED顯示器的公共端分別接單片機的P2口。相應的P0口接LED顯示器的a、b、c、d、e、f、g和dp引腳,利用程序進行動態(tài)的掃描實現(xiàn)顯示功能。</p><p> 圖3.2 硬件顯示電路圖</p><p> LED數(shù)碼管的原理與接口:</p><p> 八段LED顯示器與單片機的接口比較簡單,只要將一個8位并行口與顯示器的引腳對應相接即
17、可,由8位并行口輸出不同的字節(jié)數(shù)據(jù),顯示出不同的數(shù)字或字符。</p><p> 控制LED顯示出不同的數(shù)字或字符的8位字節(jié)數(shù)據(jù)稱為“段選碼”,共陰極LED與共陽極LED的段選碼互為補碼。數(shù)碼管的接口有靜態(tài)和動態(tài)接口兩種,靜態(tài)接口為固定顯示方式,無閃爍,其電路可采用一個并行口接一個數(shù)碼管,數(shù)碼管的公共端按共陰或共陽分別接地或接電源。</p><p> 動態(tài)接口采用各數(shù)碼管循環(huán)輪流顯示的方
18、法,當循環(huán)顯示的頻率教高時,利用人眼的視覺暫留性,看不出閃爍顯示現(xiàn)象,這種顯示與要一個接口完成字形碼的輸出,另一接口完成各數(shù)碼管的輪流點亮。</p><p> 第4章 軟件設計與說明</p><p> 4.1 初始化子程序</p><p> 對所用到的存儲單元和寄存器單元進行初始化,同時對要使用到的定時器進行清零并賦初始值。</p><p&
19、gt;<b> 初始化子程序:</b></p><p> void InitTimer1(void) // 系統(tǒng)初始化 函數(shù)</p><p><b> {</b></p><p> TMOD = 0x10; // 定時器 T1,工作方式1</p><p> TH1 = 0x
20、0D8; // 賦初值 </p><p> TL1 = 0x0F0;</p><p> EA = 1; // 開總中斷</p><p> ET1 = 1; // 開定時器T1中斷</p><p> TR1 = 1; // 開定時器T1</p><p><b
21、> }</b></p><p><b> 4.2 延時子函數(shù)</b></p><p> void delay1(unsigned int de) //延時函數(shù)由于數(shù)碼管暫留</p><p><b> {</b></p><p> unsigned int t;<
22、/p><p> for(t=0;t<de;t++);</p><p><b> }</b></p><p> 4.3 鍵盤掃描函數(shù)</p><p> void key_scan() // 按鍵掃描函數(shù)</p><p><b> {</b></p&g
23、t;<p> if(key_sr1==1) // 第一個按鍵松開</p><p><b> {</b></p><p> key_lock1=0; // 解鎖</p><p> delay_cnt1=0; // 延時計數(shù)清零</p><p><b> }</b>&
24、lt;/p><p> else if(key_lock1==0) // 是否按下,避免重復觸發(fā)</p><p><b> {</b></p><p> ++delay_cnt1;</p><p> if(delay_cnt1>cnt_delay_cnt1) // 消抖動</p><p&
25、gt;<b> {</b></p><p> delay_cnt1=0;</p><p> key_lock1=1; // 上鎖</p><p> key_sec=1; //觸發(fā)1號鍵</p><p><b> } </b></p><
26、;p><b> }</b></p><p> ......具體請看附錄B 源代碼</p><p><b> }</b></p><p> 4.4 按鍵服務函數(shù)</p><p> void key_service() // 按鍵服務函數(shù)</p><p>&l
27、t;b> {</b></p><p> static unsigned char x =0; // 用于連發(fā)頻率控制變量</p><p> switch(key_sec)</p><p><b> {</b></p><p> case 1:// 開始鍵</p>
28、<p> switch (wd_sec)</p><p><b> {</b></p><p> case 2: // 秒表 模式</p><p> start = 1; // 啟動秒表</p><p> sec_sec = 1; // 秒表執(zhí)行標志 用于窗口轉換選擇<
29、/p><p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0;</p><p><b> break;</b></p><p> case 2: // 停止鍵</p
30、><p> switch (wd_sec)</p><p><b> {</b></p><p> case 2: // 秒表 模式</p><p> start = 0;</p><p> sec_sec = 1;// 秒表執(zhí)行標志 用于窗口轉換選擇 </p>
31、<p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0;//清除鍵值</p><p><b> break;</b></p><p> case 3: // 復位鍵</p&
32、gt;<p> switch (wd_sec)</p><p><b> {</b></p><p> case 2: // 秒表 模式</p><p> //qing dong miao biao </p><p> if(!start) // 秒表在停止狀態(tài)下 才允許復位&
33、lt;/p><p><b> {</b></p><p> time_sec = 0;</p><p> time_min = 0;</p><p> timesec = 0;</p><p><b> }</b></p><p> sec_
34、sec = 1; //秒表執(zhí)行標志 用于窗口轉換選擇 </p><p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0;//清除鍵值</p><p><b> break;</b></p
35、><p> ... ... 具體請看附錄B 源代碼</p><p><b> }</b></p><p> 4.5 數(shù)碼管顯示函數(shù)</p><p> void display() // 顯示函數(shù)</p><p><b> {</b></p>&l
36、t;p> static unsigned char i; </p><p> switch(wd_sec) // 不同模式(窗口)下給顯示緩沖區(qū)的值不同</p><p><b> {</b></p><p> case 1: // 正常顯示時間</p><p> temp[
37、7]=sec%10;</p><p> temp[6]=sec/10;</p><p> temp[4]=min%10;</p><p> temp[3]=min/10;</p><p> temp[1]=hour%10;</p><p> temp[0]=hour/10;</p><p
38、><b> break;</b></p><p> case 2: // 顯示秒表模式</p><p> temp[7]=timesec%10;</p><p> temp[6]=timesec/10;</p><p> temp[4]=time_sec%10;</p><
39、;p> temp[3]=time_sec/10;</p><p> temp[1]=time_min%10;</p><p> temp[0]=time_min/10;</p><p><b> break;</b></p><p> case 3: // 時間調整 秒 </p>
40、<p> temp[4]=min%10;</p><p> temp[3]=min/10;</p><p> if (biaozhi) // 閃爍標志</p><p><b> {</b></p><p> temp[7]=sec%10; // 顯示</p><p&g
41、t; temp[6]=sec/10;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> temp[7]=11 ; // 滅</p><p> temp
42、[6]=11 ;</p><p><b> }</b></p><p> temp[1]=hour%10; // 分離個位</p><p> temp[0]=hour/10; // 分離十位</p><p><b> break;</b></p>
43、<p> case 4:// 時間調整 分 </p><p><b> ... ...</b></p><p><b> break;</b></p><p> case 5:// 時間調整 時 </p><p><b> ... ...</b>
44、;</p><p><b> break;</b></p><p><b> }</b></p><p> delay1(1); // 小延時</p><p> P0=0xff; // 關段碼 </p><p> P2= 0x00; // 關位碼
45、 用于消影</p><p> delay1(1); // 小延時</p><p> P2=wele[i]; // 位選控制</p><p> P0=table[temp[i]]; //段選控制</p><p> delay1(50); // 延時 視覺暫留</p><p><b>
46、 if(++i>8)</b></p><p><b> i=0;</b></p><p><b> }</b></p><p> 4.6 中斷服務函數(shù)</p><p> void Timer1Interrupt(void) interrupt 3 // 10 ms
47、中斷函數(shù)</p><p><b> {</b></p><p> static unsigned char time1;</p><p> TH1 = 0x0D8; // 重新裝入初值</p><p> TL1 = 0x0F0;</p><p> if (!(wd_sec == 3 |
48、 wd_sec == 4 | wd_sec == 5 )) </p><p> { // 時間在 調整過程中不允許走時</p><p> if(++time==100) // 一秒時間到</p><p><b> {</b></p><p><b> time=0; </b
49、></p><p> if(++sec==60) // 一分鐘時間到</p><p><b> {</b></p><p><b> sec=0;</b></p><p> if(++min==60) // 一小時時間到</p><p><b>
50、{</b></p><p><b> min=0;</b></p><p> if(++hour==24) // 一天時間到 </p><p><b> {</b></p><p><b> hour=0; </b></p><p
51、><b> } </b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>
52、 if (wd_sec == 2 && start==1) </p><p> { // 秒表開始計時條件( 在秒表模式且秒表啟動 )</p><p> if (++timesec == 100) // 1秒時間到</p><p><b> {</b></p><p> t
53、imesec =0;</p><p> if (++time_sec == 60) // 1分鐘時間到 </p><p><b> {</b></p><p> time_sec =0;</p><p> time_min++;</p><p><b> }</b>
54、;</p><p><b> }</b></p><p><b> }</b></p><p> if (++time1>= 25) // 時間調整的閃爍標志</p><p><b> {</b></p><p><b&g
55、t; time1=0;</b></p><p> biaozhi = ~biaozhi;</p><p><b> }</b></p><p> key_scan(); // 按鍵掃描 </p><p><b> }</b></p><p>
56、; 4.7 主程序流程圖</p><p> 圖4.1 主程序流程圖</p><p> 第5章 調試結果與調試說明</p><p> 通過proteus 7.7SP2仿真,開始后數(shù)碼管可以正常顯示時間,此時按下【設置】鍵,可切換到秒表模式,在秒表模式下按【啟動】鍵開始計時,最小值為10ms。按【停止】鍵可以停止計時,按【復位】鍵可以清零秒表,以便開始下一輪的計
57、時。</p><p> 當回到正常顯示模式后,連續(xù)按兩次【設置】鍵即可進入時鐘調整狀態(tài)。依次調整秒、分、時。</p><p> 在時鐘調整的狀態(tài)下,按【加】鍵可以對當前閃爍的秒(或分或時)進行單個加1操作,若按下不松1s后進入連續(xù)加1操作,以實現(xiàn)快速時鐘調整。</p><p> 調試過程中的截圖如下:</p><p> 圖 5.1 分
58、鐘調試過程</p><p><b> 設計總結</b></p><p> 通過本次的單片機課程設計,我在電路調試經(jīng)驗等方面增加了很多經(jīng)驗,這些都是在課本上無法學到得東西。在程序方面,在一些延時子程序等網(wǎng)絡上有很多現(xiàn)成的資料,我們要充分的利用資源,借鑒別人優(yōu)秀的程序,做出來的程序更加優(yōu)秀。程序方面我覺得寫程序注釋寫得越詳細越好、不要怕麻煩。這樣方便自己讀懂程序,也是
59、有利于讓別人能讀懂你寫的程序。在反復確認自己的程序正確無誤之后,接下來要做的就是模擬仿真了。我們在書上、網(wǎng)上都查閱了相關芯片的功能、管腳等信息。仔細研究芯片的主要功能及管腳接法,這也就為我們后面比較成功地仿真出結果打好了基礎。當仿真出錯時我們反復檢查線路連接是否有誤,仔細的觀察相應管腳在運行時的電位的變化。我相信,不管是什么電路,經(jīng)過如此仔細的檢查后,任何錯誤不會遺漏。當然,這也是我們最終走向成功的原因。</p><
60、p> 在老師的辛勤的指導下,最后我們順利地完成了這次的課程設計??匆姷秸n本所學知識得以應用,心中滿是歡喜,滿是激動。這次課程設計加強了我的實際操作能力,提高了我解決實際問題的能力,并對本專業(yè)的課程充滿了濃厚的興趣,及對以后的學習充滿了信心,決定在以后的學習生活中加強練習,端正心態(tài),迎接新的挑戰(zhàn)。</p><p><b> 參考文獻</b></p><p>
61、 1、《單片機C語言輕松入門》周堅編 北京航空航天大學出版社</p><p> 2、《單片機人機接口實例》公茂法編著 北京航空航天大學出版社</p><p> 3、《51系列單片機應用與實踐教程》周向紅編著 北京航空航天大學出版社</p><p> 4、《單片機原理與應用》王迎旭編著 機械工業(yè)出版社 </p><p><b
62、> 附 錄</b></p><p><b> 附錄A:設計電路圖</b></p><p><b> 附錄B:源程序清單</b></p><p><b> /*</b></p><p> 單片機課程設計 </p><p>
63、 課題名稱 :基于單片機的電子時鐘設計</p><p> 時間 :2013年6月13日</p><p> 硬件 :P0口 接數(shù)碼管的段碼。 P2口 接數(shù)碼的位選 </p><p> 六個獨立按鍵接 P1^0 到 P1^5 口 </p><p> 晶振 12 MHz 單片機 AT89C51&
64、lt;/p><p> 功能 : 利用定時中斷進行計時,有正常時間顯示, </p><p> 有秒表啟動、停止、復位功能 ,時間可以 </p><p><b> 調整,</b></p><p> 時間調整 按加鍵時間加1,若不松開,</p><p> 1s后進入連續(xù)加1直至松開按鈕
65、。</p><p><b> */</b></p><p> #include <reg51.h></p><p> #define cnt_delay_cnt1 25 //按鍵去抖延時</p><p> void delay1(unsigned int de); // 小延時 數(shù)碼管顯示暫留延時
66、</p><p> void display(); // 顯示函數(shù)</p><p> void key_scan();//按鍵掃描函數(shù)放在中斷函數(shù)里面</p><p> void key_service(); //案件服務函數(shù)放在主函數(shù)里面</p><p> sbit key_sr1=P1^0;//獨立按鍵輸入 啟動
67、</p><p> sbit key_sr2=P1^1;//獨立按鍵輸入 停止</p><p> sbit key_sr3=P1^2;//。。。。。。 復位</p><p> sbit key_sr4=P1^3; // 模式</p><p> sbit key_sr5=P1^4; //
68、 加</p><p> sbit key_sr6=P1^5; // 減</p><p> unsigned char key_lock1=0; //按鍵自鎖標志</p><p> unsigned char key_lock2=0;</p><p> unsigned char key_lock3=0
69、;</p><p> unsigned char key_lock4=0;</p><p> unsigned char key_lock5=0;</p><p> unsigned char key_lock6=0;</p><p> unsigned int delay_cnt=0; // 6號鍵長按延時 </p>
70、<p> unsigned int delay_cnt_1=0; // 5號鍵長按延時</p><p> unsigned int delay_cnt1=0; //延時計數(shù)器的變量</p><p> unsigned int delay_cnt2=0;</p><p> unsigned int delay_cnt3=0;</p>
71、;<p> unsigned int delay_cnt4=0;</p><p> unsigned int delay_cnt5=0;</p><p> unsigned int delay_cnt6=0;</p><p> unsigned char key_sec=0;//哪個鍵被觸發(fā)</p><p> uns
72、igned char wd_sec = 1;</p><p> bit biaozhi = 1; // 位閃爍用 時間標志</p><p> bit start =0; // 秒表開始標志</p><p> bit sec_sec = 0; //用來區(qū)分 從秒表模式切換到 正常顯示(1) 還是 調整時間(0)</p>
73、<p> unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; // 段碼數(shù)組 0到9 + '-' + ' '</p><p> unsigned char code wele[]={0x01,0x02,0x04,0x08,0x1
74、0,0x20,0x40,0x80}; // 數(shù)碼管位選碼</p><p> unsigned char temp[]={0,0,10,0,0,10,0,0}; // 顯示緩沖區(qū) (原先將 '-' 寫入)</p><p> int time=0,sec=0,min=0,hour=0 ; // 定義時間的 變量</p><p>
75、; int timesec=0,time_sec =0, time_min=0; // 定義秒表的變量</p><p> void InitTimer1(void) // 系統(tǒng)初始化 函數(shù)</p><p><b> {</b></p><p> TMOD = 0x10;</p><p> TH1
76、= 0x0D8;</p><p> TL1 = 0x0F0;</p><p><b> EA = 1;</b></p><p><b> ET1 = 1;</b></p><p><b> TR1 = 1;</b></p><p><b&g
77、t; }</b></p><p> void main(void) // 主函數(shù)</p><p><b> {</b></p><p> InitTimer1(); // 初始化</p><p><b> while(1)</b></p><p>
78、<b> { </b></p><p> display(); // 顯示子程序 </p><p> key_service(); //按鍵服務程序</p><p><b> }</b></p><p><b> }</b><
79、/p><p> void display() // 顯示函數(shù)</p><p><b> {</b></p><p> static unsigned char i; </p><p> switch(wd_sec) // 不同模式(窗口)下給顯示緩沖區(qū)的值不同</p><
80、p><b> {</b></p><p> case 1: // 正常顯示時間</p><p> temp[7]=sec%10;</p><p> temp[6]=sec/10;</p><p> temp[4]=min%10;</p><p> temp[3]=
81、min/10;</p><p> temp[1]=hour%10;</p><p> temp[0]=hour/10;</p><p><b> break;</b></p><p> case 2: // 顯示秒表模式</p><p> temp[7]=timesec%
82、10;</p><p> temp[6]=timesec/10;</p><p> temp[4]=time_sec%10;</p><p> temp[3]=time_sec/10;</p><p> temp[1]=time_min%10;</p><p> temp[0]=time_min/10;<
83、;/p><p><b> break;</b></p><p> case 3: // 時間調整 秒 </p><p> temp[4]=min%10;</p><p> temp[3]=min/10;</p><p> if (biaozhi) // 閃爍標志</p&
84、gt;<p><b> {</b></p><p> temp[7]=sec%10; // 顯示</p><p> temp[6]=sec/10;</p><p><b> }</b></p><p><b> else</b></p>
85、;<p><b> {</b></p><p> temp[7]=11 ; // 滅</p><p> temp[6]=11 ;</p><p><b> }</b></p><p> temp[1]=hour%10; // 分離個位</p&g
86、t;<p> temp[0]=hour/10; // 分離十位</p><p><b> break;</b></p><p> case 4:// 時間調整 分 </p><p> temp[7]=sec%10;</p><p> temp[6]=sec/10;</p>
87、<p> if (biaozhi) // 閃爍標志</p><p><b> {</b></p><p> temp[4]=min%10;</p><p> temp[3]=min/10;</p><p><b> }</b></p><p>&l
88、t;b> else</b></p><p><b> {</b></p><p> temp[4]=11 ;</p><p> temp[3]=11 ;</p><p><b> }</b></p><p> temp[1]=hour%10;
89、</p><p> temp[0]=hour/10;</p><p><b> break;</b></p><p> case 5:// 時間調整 時 </p><p> temp[7]=sec%10;</p><p> temp[6]=sec/10;</p>&
90、lt;p> temp[4]=min%10;</p><p> temp[3]=min/10;</p><p> if (biaozhi) // 閃爍標志</p><p><b> {</b></p><p> temp[1]=hour%10;</p><p> temp[
91、0]=hour/10;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> temp[1]=11;</p><p> temp[0]=11 ;</
92、p><p><b> }</b></p><p><b> break;</b></p><p><b> }</b></p><p> delay1(1); </p><p> P0=0xff; // 關段碼 </p>&
93、lt;p> P2= 0x00; // 關位碼 用于消影</p><p> delay1(1);</p><p> P2=wele[i]; // 位選</p><p> P0=table[temp[i]]; //段選</p><p> delay1(50); // 延時 視覺暫留</p><
94、;p><b> if(++i>8)</b></p><p><b> i=0;</b></p><p><b> }</b></p><p> void delay1(unsigned int de) //延時函數(shù)</p><p><b>
95、 {</b></p><p> unsigned int t;</p><p> for(t=0;t<de;t++);</p><p><b> }</b></p><p> void key_scan() // 按鍵掃描函數(shù)</p><p><b>
96、 {</b></p><p> if(key_sr1==1) // 第一個按鍵松開</p><p><b> {</b></p><p> key_lock1=0; // 解鎖</p><p> delay_cnt1=0; // 延時計數(shù)清零</p><p>&l
97、t;b> }</b></p><p> else if(key_lock1==0) // </p><p><b> {</b></p><p> ++delay_cnt1;</p><p> if(delay_cnt1>cnt_delay_cnt1) // 消抖動</p>
98、<p><b> {</b></p><p> delay_cnt1=0;</p><p> key_lock1=1;</p><p> key_sec=1;//觸發(fā)1號鍵</p><p><b> } </b></p><p><b>
99、 }</b></p><p> if(key_sr2==1)</p><p><b> {</b></p><p> key_lock2=0;</p><p> delay_cnt2=0;</p><p><b> }</b></p>&
100、lt;p> else if(key_lock2==0)</p><p><b> {</b></p><p> ++delay_cnt2;</p><p> if(delay_cnt2>cnt_delay_cnt1)</p><p><b> {</b></p>
101、<p> delay_cnt2=0;</p><p> key_lock2=1;</p><p> key_sec=2;//觸發(fā)2號鍵</p><p><b> }</b></p><p><b> }</b></p><p> if(key_sr3
102、==1)</p><p><b> {</b></p><p> key_lock3=0;</p><p> delay_cnt3=0;</p><p><b> }</b></p><p> else if(key_lock3==0)</p><
103、;p><b> {</b></p><p> ++delay_cnt3;</p><p> if(delay_cnt3>cnt_delay_cnt1)</p><p><b> {</b></p><p> delay_cnt3=0;</p><p>
104、; key_lock3=1;</p><p> key_sec=3;//觸發(fā)3號鍵</p><p><b> }</b></p><p><b> }</b></p><p> if(key_sr4==1)</p><p><b> {</b&g
105、t;</p><p> key_lock4=0;</p><p> delay_cnt4=0;</p><p><b> }</b></p><p> else if(key_lock4==0)</p><p><b> {</b></p><p
106、> ++delay_cnt4;</p><p> if(delay_cnt4>cnt_delay_cnt1)</p><p><b> {</b></p><p> delay_cnt4=0;</p><p> key_lock4=1;</p><p> key_sec=4
107、;//觸發(fā)4號鍵</p><p><b> }</b></p><p><b> }</b></p><p> if(key_sr5==1)</p><p><b> {</b></p><p> key_lock5=0;</p>
108、<p> delay_cnt5=0;</p><p> delay_cnt_1=0;</p><p><b> }</b></p><p> else //if(key_lock5==0)</p><p><b> {</b></p><p> ++
109、delay_cnt5;</p><p> if(delay_cnt5>cnt_delay_cnt1) //消抖 </p><p><b> {</b></p><p> if(++delay_cnt_1 >100) // 長按延時檢測</p><p><b> {</b&g
110、t;</p><p> key_sec = 11; // 連發(fā)狀態(tài)</p><p><b> }</b></p><p> else if (key_lock5 == 0)</p><p><b> {</b></p><p> key_lock5=1;<
111、/p><p> key_sec = 5; //單發(fā)</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(key_sr6==1)</p><p
112、><b> {</b></p><p> key_lock6=0;</p><p> delay_cnt6=0;</p><p> delay_cnt=0;</p><p><b> }</b></p><p> else// if(1)//(key_loc
113、k6==0)</p><p><b> {</b></p><p> ++delay_cnt6;</p><p> if(delay_cnt6>cnt_delay_cnt1)</p><p><b> {</b></p><p> if(++delay_cnt
114、 >100)</p><p><b> {</b></p><p> key_sec = 12; // 連發(fā)狀態(tài)</p><p><b> }</b></p><p> else if (key_lock6 == 0)</p><p><b>
115、{</b></p><p> key_lock6=1;</p><p> key_sec = 6; //單發(fā)</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b><
116、;/p><p><b> }</b></p><p> void key_service() // 按鍵服務函數(shù)</p><p><b> {</b></p><p> static unsigned char x =0;</p><p> switch(key_s
117、ec)</p><p><b> {</b></p><p> case 1:// 開始鍵</p><p> switch (wd_sec)</p><p><b> {</b></p><p> case 2: // 秒表 模式</p&g
118、t;<p> start = 1; // 啟動秒表</p><p> sec_sec = 1; // 秒表執(zhí)行標志 用于窗口轉換選擇</p><p><b> break;</b></p><p><b> }</b></p><p> key_sec
119、= 0;</p><p><b> break;</b></p><p> case 2: // 停止鍵</p><p> switch (wd_sec)</p><p><b> {</b></p><p> case 2: // 秒表 模式 &l
120、t;/p><p> start = 0;</p><p> sec_sec = 1;// 秒表執(zhí)行標志 用于窗口轉換選擇 </p><p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0;//清
121、除鍵值</p><p><b> break;</b></p><p> case 3: // 復位鍵</p><p> switch (wd_sec)</p><p><b> {</b></p><p> case 2: // 秒表 模式&
122、lt;/p><p> if(!start) // 秒表在停止狀態(tài)下 才允許復位</p><p><b> {</b></p><p> time_sec = 0;</p><p> time_min = 0;</p><p> timesec = 0;</p>&l
123、t;p><b> }</b></p><p> sec_sec = 1; //秒表執(zhí)行標志 用于窗口轉換選擇 </p><p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0;//清除
124、鍵值</p><p><b> break;</b></p><p> case 4: // 菜單鍵 </p><p> switch(wd_sec)</p><p><b> {</b></p><p> case 1: // 正常顯示<
125、;/p><p><b> wd_sec++;</b></p><p> sec_sec = 0;</p><p><b> break;</b></p><p> case 2: // 秒表模式</p><p> if (sec_sec) // 判斷秒表模式
126、是否執(zhí)行了,若執(zhí)行了切換到 正常顯示模式</p><p> wd_sec = 1;</p><p> else // 否則 轉到調時間模式</p><p><b> wd_sec++;</b></p><p><b> break;</b></p><p&
127、gt; case 3: // 調秒</p><p><b> wd_sec++;</b></p><p><b> break;</b></p><p> case 4: // 調分 </p><p><b> wd_sec++;</b></p
128、><p><b> break;</b></p><p> case 5: // 調時</p><p><b> wd_sec=1;</b></p><p> break;</p><p><b> }</b></p
129、><p> key_sec = 0;//清除鍵值</p><p><b> break;</b></p><p> case 5: // 時間單個加</p><p> switch (wd_sec)</p><p><b> {</b></p>
130、<p><b> case 3:</b></p><p> if(++sec >59) //秒上限</p><p><b> sec = 0;</b></p><p><b> break;</b></p><p><b> cas
131、e 4:</b></p><p> if(++min >59) // 分上限</p><p><b> min = 0;</b></p><p><b> break;</b></p><p><b> case 5:</b></p>
132、<p> if (++hour > 23) //時上限</p><p><b> hour = 0;</b></p><p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0; /
133、/清除鍵值</p><p><b> break;</b></p><p> case 6: // 時間單個減</p><p> switch (wd_sec)</p><p><b> {</b></p><p><b> case 3:</
134、b></p><p> if (--sec < 0 )</p><p><b> sec = 59;</b></p><p><b> break;</b></p><p><b> case 4:</b></p><p> i
135、f (--min < 0 )</p><p><b> min = 59;</b></p><p><b> break;</b></p><p><b> case 5:</b></p><p> if (--hour <0)</p><
136、;p> hour = 23;</p><p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0; //清除鍵值</p><p><b> break;</b></p>&l
137、t;p> case 11: // 時間連續(xù)加</p><p> if(++x>80)</p><p><b> {</b></p><p><b> x =0;</b></p><p> switch (wd_sec)</p><p><b&g
138、t; {</b></p><p><b> case 3:</b></p><p> if(++sec >59)</p><p><b> sec = 0;</b></p><p><b> break;</b></p><
139、p><b> case 4:</b></p><p> if(++min >59)</p><p><b> min = 0;</b></p><p><b> break;</b></p><p><b> case 5:</b>&
140、lt;/p><p> if (++hour > 23)</p><p><b> hour = 0;</b></p><p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0
141、; //清除鍵值</p><p><b> }</b></p><p><b> break;</b></p><p> case 12: // 時間連續(xù)減</p><p> if(++x>80)</p><p><b> {<
142、/b></p><p><b> x =0;</b></p><p> switch (wd_sec)</p><p><b> {</b></p><p><b> case 3:</b></p><p> if (--sec <
143、 0 )</p><p><b> sec = 59;</b></p><p><b> break;</b></p><p><b> case 4:</b></p><p> if (--min < 0 )</p><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
提交評論