2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論