版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 題目:數(shù)字電子時(shí)鐘(基于SPCE061A凌陽單片機(jī))</p><p><b> 一、要求</b></p><p> 1、基于凌陽SPCE061A單片機(jī)與SPLC501點(diǎn)陣LCD制作一個(gè)數(shù)字電子鐘</p><p> 2、電子鐘計(jì)時(shí)準(zhǔn)確,能準(zhǔn)確進(jìn)位,顯示年月日時(shí)分秒和星期</p><p> 3、
2、電子鐘可以手動(dòng)設(shè)置時(shí)間</p><p><b> 二、分析</b></p><p> 從題目可以分析出,題目要求電子鐘的CPU為凌陽公司的SPCE061A單片機(jī),該款單片機(jī)時(shí)凌陽科技推出的一款16位結(jié)構(gòu)的微控制器,SPCE061A里內(nèi)嵌32K字的FLASH,CPU時(shí)鐘為0.32MHz~49.152MHz,擁有豐富的定時(shí)器資源和時(shí)基中斷源,可以輕松勝任電子時(shí)鐘的任務(wù)
3、。SPLC501液晶顯示模組采用凌陽科技的SPLC501A芯片驅(qū)動(dòng),擁有128*64點(diǎn)陣,足夠顯示一個(gè)電子時(shí)鐘的界面。</p><p> 由于要有準(zhǔn)確的計(jì)時(shí),因此計(jì)時(shí)部分采用SPCE061A的2Hz時(shí)基中斷,每計(jì)數(shù)2次中斷一次,時(shí)間加1。</p><p> 由于時(shí)鐘的進(jìn)位有不同的進(jìn)制,日期上的更是各有不同,因此特別定義一個(gè)時(shí)間進(jìn)位函數(shù),當(dāng)時(shí)間產(chǎn)生進(jìn)位時(shí),調(diào)用該函數(shù)進(jìn)行進(jìn)位計(jì)算,避免產(chǎn)生
4、錯(cuò)誤時(shí)間。</p><p> 按鍵控制采用1KHz時(shí)基中斷來判斷按鍵是否按下,程序中加入了軟件去抖動(dòng)功能。</p><p> 程序開始時(shí),會(huì)在LCD上顯示出一個(gè)界面,增加系統(tǒng)的美觀度。</p><p> 模組上的液晶顯示器采用凌陽科技的 SPLC501 芯片作為 LCD驅(qū)動(dòng)和控制器,為 128×64 點(diǎn)陣圖形。用單片機(jī)的IO口可以很方便的設(shè)置某一個(gè)點(diǎn)
5、為1,之后就會(huì)點(diǎn)亮這一點(diǎn)。作為一個(gè)配套的實(shí)驗(yàn)?zāi)=M,模組里面內(nèi)置有很多函數(shù),這個(gè)電子時(shí)鐘就是利用其中的LCD501_Bitmap()和LCD501_PutString()函數(shù)來顯示對應(yīng)的文字或者字符。還有一個(gè)很方便的工具,就是利用對應(yīng)的DM字模提取工具,可以獲取要顯示的數(shù)字或者文字在液晶顯示模中的數(shù)組。</p><p><b> 三、設(shè)計(jì)</b></p><p>&l
6、t;b> 1、硬件設(shè)計(jì)</b></p><p> 1.1 PLCD501模組的硬件平面圖</p><p> 1.2這是模組的內(nèi)部設(shè)置的點(diǎn)陣圖</p><p> 1.3 液晶模組相關(guān)配置信息</p><p> 內(nèi)置 8580 位顯示 RAM。RAM 中的一位數(shù)據(jù)控制液晶屏上的一個(gè)象素點(diǎn)的亮、暗狀態(tài)。“1”亮“0”暗。
7、具有 65 行驅(qū)動(dòng)輸出和 132 列驅(qū)動(dòng)輸出(注:模組中的液晶顯示面板僅為 64 行、128 列) 可以直接與 80 系列和68系列微處理器相連。 內(nèi)置晶振電路,也可以外接晶振 工作溫度范圍為-40 攝氏度~+85攝氏度 。</p><p><b> 2、軟件設(shè)計(jì)</b></p><p> 2.1常用功能函數(shù)介紹 </p><p><
8、b> 液晶顯示控制類: </b></p><p> LCD501_Init 液晶初始化 </p><p> LCD501_ClrScreen 清屏 </p><p> LCD501_ReverseColor 顯示翻轉(zhuǎn) </p><p> LCD501_SetPaintMode 設(shè)置圖形顯示模式</p&
9、gt;<p> LCD501_GetPaintMode 獲取當(dāng)前顯示模式 </p><p> LCD501_FontSet 設(shè)置文本字體 </p><p> LCD501_FontGet 獲取當(dāng)前文本字體 </p><p> LCD501_PutChar 顯示單個(gè)字符</p><p> LCD501_PutStr
10、ing 顯示字符串</p><p> LCD501_PutPixel 畫點(diǎn) </p><p> LCD501_Line 畫直線</p><p> LCD501_Circle 畫圓 </p><p> LCD501_Rectangle 畫矩形 </p><p> LCD501_Bitmap 位圖顯示/
11、漢字顯示 </p><p> SPCE061A與SPLC501的接口采用6800并行接口電路,即8位數(shù)據(jù)總線、1個(gè)讀寫選通端口、1個(gè)數(shù)據(jù)指令選通端口、1個(gè)信號(hào)使能端口,具體接法如下圖:</p><p> 按鍵采用凌陽61板上提供的三個(gè)按鍵,接口電路如下:</p><p><b> 2.2軟件編程</b></p><p&
12、gt; 軟件部分由三個(gè)部分組成:主程序部分、2Hz時(shí)基中斷部分、1KHz時(shí)基中斷部分,主程序部分主要負(fù)責(zé)初始化LCD和顯示界面,2Hz時(shí)基中斷部分負(fù)責(zé)時(shí)間的計(jì)數(shù),1KHz時(shí)基中斷部分負(fù)責(zé)按鍵的掃描,下面看看這三個(gè)程序的流程圖:</p><p> 2.2.1主程序流程圖:</p><p> 2.2.2主要程序及注釋:</p><p> 2.2.2.1時(shí)鐘計(jì)數(shù)程
13、序:</p><p><b> //main.c</b></p><p> #include "SPLC501User.h"</p><p> #include "Mychar.h"</p><p> #include "SPCE061A.h"</
14、p><p> int Count_time = 0;</p><p> int Key_time = 0;</p><p> unsigned int Contr = 24;</p><p> int Set_mode = 0;</p><p> struct Time//定義時(shí)間結(jié)構(gòu)體,存儲(chǔ)現(xiàn)在的時(shí)間</
15、p><p><b> {</b></p><p> int year;//年</p><p> int month;//月</p><p> int week;//周 </p><p> int day;//日</p><p> int hour;//時(shí)</p
16、><p> int minute;//分 </p><p> int second;//秒 </p><p><b> }Clock;</b></p><p> void Clock_Init();</p><p> void Clock_Fix();</p><p>
17、; void Disp_Time();</p><p> const char clr[]={" "};</p><p> int main()</p><p> { long int m=100000;</p><p> //add your code here</p>
18、;<p><b> int dly;</b></p><p> LCD501_Init(0x00);</p><p> *P_IOA_Dir &= 0xfff8;</p><p> *P_IOA_Attrib &= 0xfff8;</p><p> *P_IOA_Data &
19、;= 0xfff8;</p><p> LCD501_Bitmap(32,0,(unsigned int*)encoding_00);//課 </p><p> LCD501_Bitmap(48,0,(unsigned int*)encoding_01);//程 </p><p> LCD501_Bitmap(64,0,(unsigned int*)encod
20、ing_02);//設(shè)</p><p> LCD501_Bitmap(80,0,(unsigned int*)encoding_03);//計(jì)</p><p> LCD501_Bitmap(24,16,(unsigned int*)encoding_04);//計(jì)</p><p> LCD501_Bitmap(40,16,(unsigned int*)enco
21、ding_05);//算</p><p> LCD501_Bitmap(56,16,(unsigned int*)encoding_06);//機(jī) </p><p> LCD501_Bitmap(72,16,(unsigned int*)encoding_07);//接 </p><p> LCD501_Bitmap(88,16,(unsigned int*)
22、encoding_08);//口</p><p> LCD501_Bitmap(16,32,(unsigned int*)encoding_09);//數(shù) </p><p> LCD501_Bitmap(32,32,(unsigned int*)encoding_0a);//字 </p><p> LCD501_Bitmap(48,32,(unsigned i
23、nt*)encoding_0b);//電 </p><p> LCD501_Bitmap(64,32,(unsigned int*)encoding_0c);//子</p><p> LCD501_Bitmap(80,32,(unsigned int*)encoding_0d);//時(shí)</p><p> LCD501_Bitmap(96,32,(unsigne
24、d int*)encoding_0e);//鐘</p><p> *P_Watchdog_Clear = 0x0001 ;</p><p> while(m--)</p><p> *P_Watchdog_Clear = 0x0001 ;</p><p> Clock_Init();</p><p> LCD
25、501_PutString(0,0,clr);</p><p> for(dly=0;dly<100;dly++); </p><p> LCD501_PutString(0,16,clr);</p><p> for(dly=0;dly<100;dly++);</p><p> LCD501_PutString(0,32
26、,clr);</p><p> for(dly=0;dly<100;dly++);</p><p> LCD501_PutString(0,48,clr);</p><p> for(dly=0;dly<100;dly++);</p><p> LCD501_Bitmap(0,0,(unsigned int*)encodi
27、ng_15);//鄧 </p><p> LCD501_Bitmap(16,0,(unsigned int*)encoding_16);//中 </p><p> LCD501_Bitmap(32,0,(unsigned int*)encoding_17);//滿 </p><p> LCD501_PutString(56,0,"08064030&q
28、uot;);//08064030</p><p> LCD501_Bitmap(32,16,(unsigned int*)encoding_18);//年</p><p> LCD501_Bitmap(64,16,(unsigned int*)encoding_19);//月</p><p> LCD501_Bitmap(96,16,(unsigned int
29、*)encoding_1a);//日</p><p> *P_Watchdog_Clear = 0x0001 ;</p><p> LCD501_Bitmap(0,34,(unsigned int*)encoding_1b);//北</p><p> LCD501_Bitmap(12,34,(unsigned int*)encoding_1c);//京<
30、/p><p> LCD501_Bitmap(24,34,(unsigned int*)encoding_1d);//時(shí)</p><p> LCD501_Bitmap(36,34,(unsigned int*)encoding_1e);//間</p><p> LCD501_PutChar(46,32,':');</p><p&g
31、t; *P_Watchdog_Clear = 0x0001 ;</p><p> LCD501_Bitmap(0,48,(unsigned int*)encoding_13);//星 </p><p> LCD501_Bitmap(16,48,(unsigned int*)encoding_14);//期 </p><p> LCD501_PutChar(3
32、2,48,':');</p><p> LCD501_Bitmap(80,51,(unsigned int*)encoding_0f);//歡 </p><p> LCD501_Bitmap(92,51,(unsigned int*)encoding_10);//迎 </p><p> LCD501_Bitmap(104,51,(unsig
33、ned int*)encoding_11);//使 </p><p> LCD501_Bitmap(116,51,(unsigned int*)encoding_12);//用 </p><p> *P_Watchdog_Clear = 0x0001 ;</p><p> LCD501_PutChar(72,32,':');</p>
34、;<p> LCD501_PutChar(96,32,':');</p><p> LCD501_PutChar(120,32,' ');</p><p> LCD501_PutChar(124,32,' ');</p><p> Disp_Time();</p><p>
35、 *P_INT_Ctrl = C_IRQ5_2Hz | C_IRQ4_1KHz;</p><p> __asm("int irq");</p><p><b> while(1)</b></p><p><b> {</b></p><p> *P_Watchdog_C
36、lear = 0x0001;</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> void IRQ4(void) __attribute__ ((ISR));</p&g
37、t;<p> void IRQ5(void) __attribute__ ((ISR));</p><p> void IRQ4(void)</p><p><b> {</b></p><p> int time_dly;</p><p> int sign=0;</p><
38、p> sign = 0;//如果為4、6、9、11月,則31日進(jìn)位,如果為1、3、5、7、8、10、12月,則32日進(jìn)位,如果為2月,29日進(jìn) </p><p> if(Clock.month == 4)</p><p><b> sign = 1;</b></p><p> if(Clock.month == 6)</p&
39、gt;<p><b> sign = 1;</b></p><p> if(Clock.month == 9)</p><p><b> sign = 1;</b></p><p> if(Clock.month == 11)</p><p><b> sign =
40、 1;</b></p><p> if((*P_INT_Ctrl & C_IRQ4_1KHz) != 0x0000)</p><p><b> {</b></p><p> *P_INT_Clear = C_IRQ4_1KHz;//清中斷 </p><p> if(Key_time%=50)/
41、/20Hz判斷按鍵是否按下 </p><p><b> {</b></p><p> if((*P_IOA_Data & 0x0007) != 0x0000)//軟件去抖動(dòng), </p><p><b> {</b></p><p> for(time_dly=0;time_dly&l
42、t;5000;time_dly++);//去抖動(dòng)延時(shí),</p><p><b> }</b></p><p> if((*P_IOA_Data & 0x0007) != 0x0000)</p><p><b> {</b></p><p> if((*P_IOA_Data &
43、 0x0001) != 0x0000)//如果按下KEY1 </p><p><b> {</b></p><p> Set_mode++;</p><p> Set_mode %= 8;</p><p><b> }</b></p><p> if((*P_IO
44、A_Data & 0x0002) != 0x0000)//如果按下KEY2 </p><p><b> {</b></p><p> if(Set_mode == 0)</p><p><b> {</b></p><p><b> Contr++;</b>&
45、lt;/p><p> Contr = (Contr>31)?0:Contr;</p><p> LCD501_SetContrast(Contr);</p><p><b> }</b></p><p> //如果為設(shè)置時(shí)間模式 </p><p> if(Set_mode == 1
46、)</p><p> Clock.year++;</p><p> if(Set_mode == 2)</p><p> {Clock.month++;</p><p> if(Clock.month==13)//13月進(jìn)位 </p><p><b> {</b></p>
47、<p> Clock.month = 1;</p><p><b> }</b></p><p><b> }</b></p><p> if(Set_mode == 3)</p><p> {Clock.day++;</p><p> if((Cloc
48、k.month == 2) && (Clock.day == 29))//2月29日進(jìn)位 </p><p><b> {</b></p><p> Clock.day = 1;</p><p><b> }</b></p><p> if((sign == 1) &
49、& (Clock.day == 31))</p><p><b> {</b></p><p> Clock.day = 1;</p><p><b> }</b></p><p> if((sign == 0) && (Clock.day == 32))</p
50、><p><b> {</b></p><p> Clock.day = 1;</p><p><b> }</b></p><p><b> }</b></p><p> if(Set_mode == 4)</p><p>
51、; {Clock.hour++;</p><p> if(Clock.hour==24)</p><p> Clock.hour=0;</p><p><b> }</b></p><p> if(Set_mode == 5)</p><p> {Clock.minute++;<
52、/p><p> if(Clock.minute==60)</p><p> Clock.minute=0;</p><p><b> }</b></p><p> if(Set_mode == 6)</p><p> {Clock.second++;</p><p>
53、 if(Clock.second==60)</p><p> Clock.second=0;</p><p><b> }</b></p><p> if(Set_mode == 7)</p><p> {Clock.week++;</p><p> if(Clock.week>
54、7)</p><p> Clock.week=1;</p><p><b> } </b></p><p><b> }</b></p><p> if((*P_IOA_Data & 0x0004) != 0x0000)//如果按下KEY3 </p><p&g
55、t;<b> {</b></p><p> if(Set_mode == 0)</p><p> { Contr--;</p><p> Contr = (Contr>31)?31:Contr;</p><p> LCD501_SetContrast(Contr);</p><p&g
56、t;<b> }</b></p><p> if(Set_mode == 1)//如果為設(shè)置時(shí)間模式</p><p> Clock.year--;</p><p> if(Set_mode == 2)</p><p><b> {</b></p><p> Clo
57、ck.month--;</p><p> if(Clock.month==0)</p><p> { Clock.month=12;</p><p><b> }</b></p><p><b> }</b></p><p> if(Set_mode == 3)&l
58、t;/p><p><b> {</b></p><p> Clock.day--;</p><p> if((Clock.month == 2) && (Clock.day == 0))//3月0日 變成2月29日 </p><p><b> { </b></p>
59、<p> Clock.day = 28;</p><p><b> }</b></p><p> if((sign == 1) && (Clock.day == 0))//4、6、9、11月0日變成前一月的31日 </p><p><b> {</b></p><
60、;p> Clock.day = 30;</p><p><b> }</b></p><p> if((sign == 0) && (Clock.day == 0))//1、3、5、7、8、10、12月0日變成前一月的31日 </p><p><b> {</b></p>&
61、lt;p> Clock.day = 31;</p><p><b> }</b></p><p><b> }</b></p><p> if(Set_mode == 4)</p><p><b> {</b></p><p> Cl
62、ock.hour--;</p><p> if(Clock.hour<0)</p><p><b> {</b></p><p> Clock.hour=23;</p><p><b> }</b></p><p><b> }</b>&
63、lt;/p><p> if(Set_mode == 5)</p><p><b> {</b></p><p> Clock.minute--;</p><p> if(Clock.minute<0)</p><p><b> {</b></p>&
64、lt;p> Clock.minute=59;</p><p><b> }</b></p><p><b> }</b></p><p> if(Set_mode == 6)</p><p><b> {</b></p><p> Cl
65、ock.second--;</p><p> if(Clock.second<0)</p><p><b> {</b></p><p> Clock.second=59;</p><p><b> }</b></p><p><b> }</
66、b></p><p> if(Set_mode == 7)</p><p> {Clock.week--;</p><p> if(Clock.week<1)</p><p> Clock.week=7;</p><p><b> }</b></p><
67、p><b> }</b></p><p><b> }</b></p><p> while((*P_IOA_Data & 0x0007) != 0x0000);</p><p><b> }</b></p><p> Key_time++;</p
68、><p><b> }</b></p><p><b> }</b></p><p> void IRQ5(void)//2Hz時(shí)基中斷控制時(shí)間</p><p><b> {</b></p><p> //add your code here<
69、;/p><p> if((*P_INT_Ctrl & C_IRQ5_2Hz)!=0x0000)</p><p><b> {</b></p><p> *P_INT_Clear = C_IRQ5_2Hz;</p><p> Count_time++;</p><p> Count_t
70、ime %= 2;</p><p> if(Set_mode == 0)//如果是時(shí)鐘顯示模式 </p><p><b> {</b></p><p> if(Count_time == 1)</p><p><b> {</b></p><p> Clock.
71、second++;</p><p> Clock_Fix();</p><p> Disp_Time();</p><p><b> }</b></p><p><b> }</b></p><p> if(Set_mode > 0)//如果是設(shè)置時(shí)間模式&l
72、t;/p><p><b> {</b></p><p> Disp_Time();</p><p> if(Count_time)</p><p><b> {</b></p><p> if(Set_mode == 1)</p><p>
73、; LCD501_PutString(0,16," ");//年跳動(dòng) </p><p> if(Set_mode == 2)</p><p> LCD501_PutString(48,16," ");//月跳動(dòng) </p><p> if(Set_mode == 3)</p><p>
74、 LCD501_PutString(80,16," ");//日跳動(dòng) </p><p> if(Set_mode == 4)</p><p> LCD501_PutString(56,32," ");//時(shí)跳動(dòng) </p><p> if(Set_mode == 5)</p><p> LC
75、D501_PutString(80,32," ");//分跳動(dòng) </p><p> if(Set_mode == 6)</p><p> LCD501_PutString(104,32," ");//秒跳動(dòng) </p><p> if(Set_mode == 7)</p><p> LCD5
76、01_PutString(40,48," ");//星期跳動(dòng) </p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b><
77、/p><p> void Clock_Init()</p><p><b> {</b></p><p> Clock.year = 2010;</p><p> Clock.month = 12;</p><p> Clock.day = 31;</p><p>
78、 Clock.hour = 23;</p><p> Clock.minute = 59;</p><p> Clock.second = 45;</p><p> Clock.week = 3;</p><p><b> }</b></p><p> void Clock_Fix()/
79、/定義修正時(shí)間函數(shù),如果時(shí)間產(chǎn)生溢出,則按時(shí)間計(jì)算規(guī)則進(jìn)行處理</p><p><b> {</b></p><p><b> int flag;</b></p><p> flag = 0;//如果為4、6、9、11月,則31日進(jìn)位,如果為1、3、5、7、8、10、12月,則32日進(jìn)位,如果為2月,29日進(jìn) <
80、;/p><p> if(Clock.month == 4)</p><p><b> flag = 1;</b></p><p> if(Clock.month == 6)</p><p><b> flag = 1;</b></p><p> if(Clock.mon
81、th == 9)</p><p><b> flag = 1;</b></p><p> if(Clock.month == 11)</p><p><b> flag = 1;</b></p><p> if(Clock.second == 60)//秒修正 </p><
82、;p><b> {</b></p><p> Clock.minute++;</p><p> Clock.second = 0;</p><p><b> }</b></p><p> if(Clock.minute == 60)//分修正 </p><p>
83、;<b> {</b></p><p> Clock.hour++;</p><p> Clock.minute = 0;</p><p><b> }</b></p><p> if(Clock.hour == 24)//時(shí)修正 </p><p><b>
84、; {</b></p><p> Clock.day++;</p><p> Clock.hour = 0;</p><p> Clock.week++;//星期加一次 </p><p> if(Clock.week==8)</p><p> Clock.week=1;</p>
85、<p><b> }</b></p><p> if((Clock.month == 2) && (Clock.day == 29))//2月29日進(jìn)位 </p><p><b> {</b></p><p> Clock.month++;</p><p> Cl
86、ock.day = 1;</p><p><b> }</b></p><p> if((flag == 1) && (Clock.day == 31))</p><p><b> {</b></p><p> Clock.month++;</p><
87、p> Clock.day = 1;</p><p><b> }</b></p><p> if((flag == 0) && (Clock.day == 32))</p><p><b> {</b></p><p> Clock.month++;</p>
88、;<p> Clock.day = 1;</p><p><b> }</b></p><p> if(Clock.month == 13)//13月進(jìn)位 </p><p><b> {</b></p><p> Clock.year++;</p><p&
89、gt; Clock.month = 1;</p><p><b> }</b></p><p><b> }</b></p><p> void Disp_Time()</p><p><b> {</b></p><p><b>
90、 int temp;</b></p><p> *P_Watchdog_Clear = 0x0001 ;</p><p> temp = Clock.year/1000;</p><p> LCD501_PutChar(0,16,temp+0x30);//年千位 </p><p> temp = Clock.year/1
91、00;</p><p> temp %= 10;</p><p> LCD501_PutChar(8,16,temp+0x30);//年百位 </p><p> temp = Clock.year/10;</p><p> temp %= 10;</p><p> LCD501_PutChar(16,16,t
92、emp+0x30);//年十位 </p><p> temp = Clock.year%10;</p><p> LCD501_PutChar(24,16,temp+0x30);//年個(gè)位 </p><p> temp = Clock.month/10;</p><p> LCD501_PutChar(48,16,temp+0x30)
93、;//月十位 </p><p> temp = Clock.month%10;</p><p> LCD501_PutChar(56,16,temp+0x30);//月個(gè)位 </p><p> temp = Clock.day/10;</p><p> LCD501_PutChar(80,16,temp+0x30);//日十位 <
94、;/p><p> temp = Clock.day%10;</p><p> LCD501_PutChar(88,16,temp+0x30);//日個(gè)位 </p><p> temp = Clock.hour/10;</p><p> LCD501_PutChar(56,32,temp+0x30);//時(shí)十位 </p>&l
95、t;p> temp = Clock.hour%10;</p><p> LCD501_PutChar(64,32,temp+0x30);//時(shí)個(gè)位 </p><p> temp = Clock.minute/10;</p><p> LCD501_PutChar(80,32,temp+0x30);//分十位 </p><p>
96、 temp = Clock.minute%10;</p><p> LCD501_PutChar(88,32,temp+0x30);//分個(gè)位 </p><p> temp = Clock.second/10;</p><p> LCD501_PutChar(104,32,temp+0x30);//秒十位 </p><p> temp
97、 = Clock.second%10;</p><p> LCD501_PutChar(112,32,temp+0x30);//秒個(gè)位 </p><p> temp = Clock.week%7;</p><p> LCD501_PutChar(40,48,temp+0x31);//星期位 </p><p> //更新顯示結(jié)束 &
98、lt;/p><p><b> }</b></p><p> 2.2.2.2LCD驅(qū)動(dòng)程序:</p><p> F_SPLC501_Initial_IO://LCD對應(yīng)IO口設(shè)置程序,作用是把LCD對應(yīng)的IO口設(shè)置為輸出</p><p> pushr1 to [sp]</p><p> r1
99、 = [P_IO_Data_Di]</p><p> r1 |= M_IO_DATA_MASK</p><p> [P_IO_Data_Di] = r1//設(shè)置對應(yīng)的數(shù)據(jù)口為輸出</p><p> r1 = [P_IO_Data_A]</p><p> r1 |= M_IO_DATA_MASK</p><p>
100、 [P_IO_Data_A] = r1//設(shè)置對應(yīng)的數(shù)據(jù)口為懸浮輸出</p><p> r1 = [P_IO_Data_B]</p><p> r1 |= M_IO_DATA_MASK</p><p> [P_IO_Data_D] = r1</p><p> r1 = [P_IO_Ctrl_Di]</p><p&
101、gt; r1 |= (M_IO_EP+M_IO_AO+M_IO_RW+M_IO_CS)</p><p> [P_IO_Ctrl_Di] = r1//設(shè)置對應(yīng)的控制口為輸出</p><p> r1 = [P_IO_Ctrl_A]</p><p> r1 |= (M_IO_EP+M_IO_AO+M_IO_RW+M_IO_CS)</p><p&
102、gt; [P_IO_Ctrl_A] = r1//設(shè)置對應(yīng)的控制口為懸浮輸出</p><p> r1 = [P_IO_Ctrl_B]</p><p> r1 |= ~(M_IO_EP+M_IO_AO+M_IO_RW+M_IO_CS)</p><p> [P_IO_Ctrl_D] = r1</p><p> popr1 from [
103、sp]</p><p><b> retf</b></p><p> F_SPLC501_Write_Com://單片機(jī)向LCD寫指令</p><p> pushr2,r3 to [sp]//入棧保護(hù)</p><p> pushr5 to [sp]</p><p> r2 = [P_
104、IO_Ctrl_B]//得到IOB口的狀態(tài)</p><p> r2 &= ~(M_IO_EP+M_IO_CS)//EP、CS變低電平</p><p> [P_IO_Ctrl_B] = r2</p><p> r2 = [P_IO_Ctrl_B]</p><p> r2 &= ~(M_IO_AO+M_IO
105、_RW)</p><p> [P_IO_Ctrl_B] = r2//AO、RW變低電平</p><p> .ifdef DATA_PORT_HIGHT</p><p> r1 = r1 lsl 4</p><p> r1 = r1 lsl 4</p><p><b> .endif<
106、/b></p><p> r3 = [P_IO_Data_B]</p><p> r3 &= ~M_IO_DATA_MASK </p><p> r1 &= M_IO_DATA_MASK</p><p> r1 = r1+r3</p><p> [P_IO_Data]= r1/
107、/往數(shù)據(jù)口送數(shù)據(jù)</p><p><b> nop</b></p><p> r2 |= M_IO_EP//EP變高電平</p><p> [P_IO_Ctrl]= r2</p><p><b> nop</b></p><p> r2 &= ~
108、M_IO_EP//EP變低電平</p><p> r2 |= M_IO_CS//CS變低電平</p><p> [P_IO_Ctrl] = r2</p><p> popr5 from [sp]//出棧</p><p> popr2,r3 from [sp]</p><p><
109、b> retf</b></p><p> F_SPLC501_Write_Data:/*單片機(jī)向LCD寫數(shù)據(jù),該函數(shù)與F_SPLC501_Write_Com類似只是A0設(shè)置為高電平,在此不多加描述*/</p><p> void LCD501_Init(unsigned int InitialData)//初始化LCD,參數(shù)為LCD的初始化時(shí)顯示的數(shù)據(jù)</p&
110、gt;<p><b> {</b></p><p> unsigned int i,j;</p><p> F_SPLC501_Initial_IO();//Initial LCD IO</p><p> F_SPLC501_Write_Com(M_LCD_ON); //LCD On</p><p&g
111、t; F_SPLC501_Write_Com(M_LCD_POWER_ALL); //設(shè)置上電控制模式</p><p> F_SPLC501_Write_Com(M_LCD_ELE_VOL); //電量設(shè)置模式(顯示亮度)</p><p> F_SPLC501_Write_Com(0x0012); //指令數(shù)據(jù)0x0000~0x003f</p><p> F
112、_SPLC501_Write_Com(M_LCD_VDD_SET); //V5內(nèi)部電壓調(diào)節(jié)電阻設(shè)置</p><p> F_SPLC501_Write_Com(M_LCD_COM_NOR); //Com 掃描方式設(shè)置</p><p> F_SPLC501_Write_Com(M_LCD_SEG_REV); //Segment方向選擇</p><p> F_SPL
113、C501_Write_Com(M_LCD_ALL_LOW); //全屏點(diǎn)亮/變暗指令</p><p> F_SPLC501_Write_Com(M_LCD_ALL_NOR); //正向反向顯示控制指令</p><p> F_SPLC501_Write_Com(M_LCD_STATIC_OFF); //關(guān)閉靜態(tài)指示器</p><p> F_SPLC501_Wri
114、te_Com(0x0000); //指令數(shù)據(jù)</p><p> F_SPLC501_Write_Com(M_LCD_BEGIN_LINE+0);//設(shè)置顯示起始行對應(yīng)RAM</p><p> for(i=0;i<8;i++)//往LCD中填充初始化的顯示數(shù)據(jù)</p><p><b> {</b></p><p&
115、gt; F_SPLC501_Write_Com(M_LCD_COL_PAGE+i);</p><p> F_SPLC501_Write_Com(M_LCD_COL_LINE_LOW);</p><p> F_SPLC501_Write_Com(M_LCD_COL_LINE_HIG);</p><p> for(j=0;j<128;j++)</p&
116、gt;<p><b> {</b></p><p> F_SPLC501_Write_Data(InitialData);</p><p><b> }</b></p><p><b> }</b></p><p> CurPaintMode = 0;&
117、lt;/p><p> CurPowerMode = 1;</p><p> CurLCDSet = 8;</p><p> CurScroll = 0;</p><p> CurScrMode = 1;</p><p> CurASCIIFont = 1;</p><p><b>
118、; }</b></p><p> void LCD501_Bitmap(unsigned int x,unsigned int y,unsigned int *word)/*讓LCD在指定位置畫出位圖和文字*/</p><p><b> {</b></p><p> unsigned int untype,Shift_Num
119、,Read_Back;</p><p> int i,j,m,n;</p><p> unsigned int x_low,x_hight;</p><p> unsigned int y_whide,y_Number,y_Number_8;</p><p> Shift_Num = y&0x07;</p>&l
120、t;p> untype = *(word++);</p><p> i = untype>>8;</p><p> j = (untype&0xff);</p><p> if((x+j)>128||(y+i)>64||y>64)</p><p><b> return;<
121、/b></p><p> y = (y>>3)+M_LCD_COL_PAGE;</p><p><b> x = x+4;</b></p><p> y_whide = i>>4;</p><p> if(i&0x000f)y_whide+=1;</p><
122、;p><b> //test</b></p><p> F_Cover_Initial(i,Shift_Num);</p><p><b> //test</b></p><p> y_Number = i+Shift_Num;</p><p> y_Number_8 = y_Num
123、ber;</p><p> i = y_Number&0x0f;</p><p> y_Number = y_Number>>4;</p><p> if(i)y_Number++;</p><p> i = i&0x07;</p><p> y_Number_8 = y_Numb
124、er_8>>3;</p><p> if(i&&y_Number_8!=8)y_Number_8++;</p><p> for(n=0;n<j;n++)</p><p><b> {</b></p><p> x_low = (x&0x000f); //定位列地址設(shè)置的
125、低位指令</p><p> x_hight = ((x>>4)&0x000f)+0x10; //定位列地址設(shè)置的高位指令</p><p><b> x++;</b></p><p> for(m=0;m<4;m++)Shift_Data_buf[m] = 0;</p><p> for(
126、m=0;m<y_Number_8;m++)</p><p><b> {</b></p><p> F_SPLC501_Write_Com(y+m);</p><p> F_SPLC501_Write_Com(x_low); //設(shè)置初始地址 </p><p> F_SPLC501_Write_Com(x_
127、hight);</p><p> Read_Back = F_SPLC501_Read_Data();</p><p> untype = m>>1;</p><p> if(m&0x01)</p><p> Shift_Buff[3-untype] = Shift_Buff[3-untype]|(Read_Bac
128、k<<8);</p><p><b> else</b></p><p> Shift_Buff[3-untype] = Read_Back;</p><p><b> }</b></p><p> F_Data_Cover(word,Shift_Num,y_Number,(y_
129、whide<<4));</p><p> for(m=0;m<y_Number_8;m++)</p><p><b> {</b></p><p> F_SPLC501_Write_Com(y+m);</p><p> F_SPLC501_Write_Com(x_low); //設(shè)置初始地址 &
130、lt;/p><p> F_SPLC501_Write_Com(x_hight);</p><p> untype = m>>1;</p><p> if(m&0x01)</p><p> Read_Back = Shift_Data_buf[3-untype]>>8;</p><p>
131、;<b> else</b></p><p> Read_Back = Shift_Data_buf[3-untype];</p><p><b> }</b></p><p> word = word+y_whide;</p><p><b> }</b></
132、p><p><b> }</b></p><p> void LCD501_PutString(int x,int y,unsigned int * string)//讓LCD在指定位置顯示字符串</p><p><b> {</b></p><p> unsigned int x_err=6,
133、y_err=8;</p><p> if(CurASCIIFont)</p><p><b> {</b></p><p> x_err = 8;</p><p> y_err = 16;</p><p><b> }</b></p><p>
134、; while(*string!=0)</p><p><b> {</b></p><p> if((x+x_err)>127)</p><p><b> {</b></p><p><b> x = 0;</b></p><p>
135、y = y+y_err;</p><p><b> }</b></p><p> if(y>63) y =0;</p><p> LCD501_PutChar(x,y,*string);</p><p><b> string++;</b></p><p>&l
136、t;b> x+=x_err;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> 四、調(diào)試說明</b></p><p> 程序開始運(yùn)行后,會(huì)顯示兩個(gè)界面,第一個(gè)界面顯示出“課程設(shè)計(jì) 計(jì)算機(jī)接口
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字電子時(shí)鐘設(shè)計(jì)
- 基于fpga的數(shù)字電子時(shí)鐘設(shè)計(jì)
- 電子時(shí)鐘課程設(shè)計(jì)--數(shù)字電子時(shí)鐘焊接調(diào)試報(bào)告
- 數(shù)字電子課程設(shè)計(jì)--數(shù)字電子時(shí)鐘
- 基于fpga的數(shù)字電子時(shí)鐘設(shè)計(jì)-vhdl
- 數(shù)字電子時(shí)鐘課程設(shè)計(jì)
- 數(shù)字電子時(shí)鐘課程設(shè)計(jì)
- 數(shù)字電子時(shí)鐘畢業(yè)設(shè)計(jì)
- 數(shù)字電子時(shí)鐘實(shí)驗(yàn)
- 數(shù)字電子時(shí)鐘課程設(shè)計(jì)
- 數(shù)字電子時(shí)鐘課程設(shè)計(jì)
- 課程設(shè)計(jì)--數(shù)字電子時(shí)鐘設(shè)計(jì)
- 電子課程設(shè)計(jì)總結(jié)--數(shù)字電子時(shí)鐘
- 基于時(shí)鐘芯片的電子時(shí)鐘設(shè)計(jì)
- 數(shù)字電子時(shí)鐘 課程設(shè)計(jì)報(bào)告
- 基于vhdl電子時(shí)鐘設(shè)計(jì)
- 數(shù)字電子時(shí)鐘課程設(shè)計(jì)報(bào)告
- 數(shù)字電子時(shí)鐘課程設(shè)計(jì)報(bào)告
- 數(shù)字電子時(shí)鐘課程設(shè)計(jì)報(bào)告
- 數(shù)字電子時(shí)鐘課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論