<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 第78節(jié):多個(gè)窗口里移動光標(biāo)設(shè)置參數(shù)的液晶屏菜單程序

          第78節(jié):多個(gè)窗口里移動光標(biāo)設(shè)置參數(shù)的液晶屏菜單程序

          作者: 時(shí)間:2016-11-22 來源:網(wǎng)絡(luò) 收藏
          開場白:
          上一節(jié)講了1個(gè)窗口下如何設(shè)置參數(shù)的菜單程序,這一節(jié)多增加1個(gè)窗口變成2個(gè)窗口,看看它們兩個(gè)窗口之間是如何通過按鍵程序進(jìn)行切換的。繼續(xù)鞏固上一節(jié)教給大家的兩個(gè)知識點(diǎn):
          第一個(gè)知識點(diǎn):我在前面講數(shù)碼管顯示的時(shí)候就提出了一個(gè) “一二級菜單顯示理論”:凡是人機(jī)界面顯示,不管是數(shù)碼管還是液晶屏,都可以把顯示的內(nèi)容分成不同的窗口來顯示,每個(gè)顯示的窗口中又可以分成不同的局部顯示。其中窗口就是一級菜單,用ucWd變量表示。局部就是二級菜單,用ucPart來表示。不同的窗口,會有不同的更新顯示變量ucWdXUpdate來對應(yīng),表示整屏全部更新顯示。不同的局部,也會有不同的更新顯示變量ucWdXPartYUpdate來對應(yīng),表示局部更新顯示。把每一個(gè)窗口的內(nèi)容分為兩種類型,一種類型是那些不用經(jīng)常刷新顯示的內(nèi)容,只有在切換窗口的時(shí)候才需要更新的,這種內(nèi)容放在整屏更新顯示的括號里,比如清屏操作等內(nèi)容。另外一種是那些經(jīng)常需要刷新顯示的內(nèi)容,這種內(nèi)容放在局部更新顯示的括號里。
          第二個(gè)知識點(diǎn):按鍵如何跟液晶屏顯示有機(jī)的結(jié)合起來?只要遵循鴻哥總結(jié)出來的一個(gè)規(guī)律“在不同的窗口下,根據(jù)不同的局部變量來操作不同的參數(shù)”,這樣再復(fù)雜的人機(jī)交互程序都會顯得很簡單清晰。

          具體內(nèi)容,請看源代碼講解。

          (1)硬件平臺:基于朱兆祺51單片機(jī)學(xué)習(xí)板。加按鍵對應(yīng)S1鍵,減按鍵對應(yīng)S5鍵,切換“光標(biāo)”移動按鍵對應(yīng)S9鍵,設(shè)置參數(shù)按鍵對應(yīng)S13鍵。

          (2)實(shí)現(xiàn)功能:
          通過按鍵設(shè)置8個(gè)不同的參數(shù)。
          有2個(gè)窗口。每個(gè)窗口顯示4個(gè)參數(shù)。每個(gè)參數(shù)的范圍是從0到99。
          有4個(gè)按鍵:
          (a) 一個(gè)是設(shè)置參數(shù)S13按鍵,按下此按鍵,液晶屏的第1個(gè)窗口第一行會出現(xiàn)反顯的光標(biāo),表示進(jìn)入設(shè)置參數(shù)模式,再次按下此按鍵,反顯光標(biāo)會消失,并且強(qiáng)行切換到第1個(gè)窗口,表示退出設(shè)置參數(shù)模式。
          (b) 一個(gè)是移動光標(biāo)S9按鍵,在進(jìn)入設(shè)置參數(shù)的模式下,依次按下此按鍵,液晶屏上的光標(biāo)會從上往下移動,表示選中不同的參數(shù)。當(dāng)移動到每個(gè)窗口最下邊那一行時(shí),再按下此按鍵會進(jìn)行切換窗口的操作。
          (c) 一個(gè)是減數(shù)S5按鍵,在設(shè)置參數(shù)模式下,依次按下此按鍵,被選中的參數(shù)會逐漸減小。
          (d) 一個(gè)是加數(shù)S1按鍵,在設(shè)置參數(shù)模式下,依次按下此按鍵,被選中的參數(shù)會逐漸加大。
          (3)源代碼講解如下:
          1. #include "REG52.H"
          2. /* 注釋一:
          3. * 本程序用到的變量比較多,所以在keil編譯模式里要設(shè)置一下編譯模式memory model,
          4. * 否則編譯會出錯(cuò).右鍵單擊Target選擇“Options for TargetTarget1”就會出來一個(gè)框
          5. * 在memory model中選擇compact:variables in pdata 就可以了。
          6. */
          7. #define const_voice_short40 //蜂鳴器短叫的持續(xù)時(shí)間
          8. #define const_key_time120 //按鍵去抖動延時(shí)的時(shí)間
          9. #define const_key_time220 //按鍵去抖動延時(shí)的時(shí)間
          10. #define const_key_time320 //按鍵去抖動延時(shí)的時(shí)間
          11. #define const_key_time420 //按鍵去抖動延時(shí)的時(shí)間
          12. sbit key_sr1=P0^0; //對應(yīng)朱兆祺學(xué)習(xí)板的S1鍵
          13. sbit key_sr2=P0^1; //對應(yīng)朱兆祺學(xué)習(xí)板的S5鍵
          14. sbit key_sr3=P0^2; //對應(yīng)朱兆祺學(xué)習(xí)板的S9鍵
          15. sbit key_sr4=P0^3; //對應(yīng)朱兆祺學(xué)習(xí)板的S13鍵
          16. sbit key_gnd_dr=P0^4; //模擬獨(dú)立按鍵的地GND,因此必須一直輸出低電平
          17. sbit beep_dr=P2^7; //蜂鳴器的驅(qū)動IO口
          18. sbitLCDCS_dr= P1^6;//片選線
          19. sbitLCDSID_dr = P1^7;//串行數(shù)據(jù)線
          20. sbitLCDCLK_dr = P3^2;//串行時(shí)鐘線
          21. sbitLCDRST_dr = P3^4;//復(fù)位線
          22. void SendByteToLcd(unsigned char ucData);//發(fā)送一個(gè)字節(jié)數(shù)據(jù)到液晶模塊
          23. void SPIWrite(unsigned char ucWData, unsigned char ucWRS); //模擬SPI發(fā)送一個(gè)字節(jié)的命令或者數(shù)據(jù)給液晶模塊的底層驅(qū)動
          24. void WriteCommand(unsigned char ucCommand); //發(fā)送一個(gè)字節(jié)的命令給液晶模塊
          25. void LCDWriteData(unsigned char ucData); //發(fā)送一個(gè)字節(jié)的數(shù)據(jù)給液晶模塊
          26. void LCDInit(void);//初始化函數(shù)內(nèi)部包括液晶模塊的復(fù)位
          27. void display_clear(unsigned char ucFillDate); // 清屏 全部顯示空填充0x00 全部顯示點(diǎn)陣用0xff
          28. void insert_buffer_to_canvas(unsigned int x,unsigned int y,const unsigned char*ucArray,unsigned char ucFbFlag,unsigned int x_amount,unsigned int y_amount);//把字模插入畫布.
          29. void display_lattice(unsigned int x,unsigned int y,const unsigned char*ucArray,unsigned char ucFbFlag,unsigned int x_amount,unsigned int y_amount,unsigned int uiOffSetAddr); //顯示任意點(diǎn)陣函數(shù)
          30. unsigned char *number_to_matrix(unsigned charucBitNumber); //把一位數(shù)字轉(zhuǎn)換成字模首地址的函數(shù)
          31. void delay_short(unsigned int uiDelayshort); //延時(shí)
          32. void delay_long(unsigned int uiDelayLong);
          33. void T0_time(); //定時(shí)中斷函數(shù)
          34. void key_service(void); //按鍵服務(wù)的應(yīng)用程序
          35. void key_scan(void);//按鍵掃描函數(shù) 放在定時(shí)中斷里
          36. void initial_myself();
          37. void initial_peripheral();
          38. void lcd_display_service(void); //應(yīng)用層面的液晶屏顯示程序
          39. void clear_all_canvas(void);//把畫布全部清零
          40. void wd1(void);//窗口1顯示的內(nèi)容
          41. void wd2(void);//窗口2顯示的內(nèi)容
          42. code unsigned char Zf816_0[]=
          43. {
          44. /*--文字:0--*/
          45. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=8x16 --*/
          46. 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,
          47. };
          48. code unsigned char Zf816_1[]=
          49. {
          50. /*--文字:1--*/
          51. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=8x16 --*/
          52. 0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,
          53. };
          54. code unsigned char Zf816_2[]=
          55. {
          56. /*--文字:2--*/
          57. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=8x16 --*/
          58. 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,
          59. };
          60. code unsigned char Zf816_3[]=
          61. {
          62. /*--文字:3--*/
          63. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=8x16 --*/
          64. 0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,
          65. };
          66. code unsigned char Zf816_4[]=
          67. {
          68. /*--文字:4--*/
          69. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=8x16 --*/
          70. 0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,
          71. };
          72. code unsigned char Zf816_5[]=
          73. {
          74. /*--文字:5--*/
          75. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=8x16 --*/
          76. 0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,
          77. };
          78. code unsigned char Zf816_6[]=
          79. {
          80. /*--文字:6--*/
          81. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=8x16 --*/
          82. 0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00,
          83. };
          84. code unsigned char Zf816_7[]=
          85. {
          86. /*--文字:7--*/
          87. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=8x16 --*/
          88. 0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
          89. };
          90. code unsigned char Zf816_8[]=
          91. {
          92. /*--文字:8--*/
          93. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=8x16 --*/
          94. 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,
          95. };
          96. code unsigned char Zf816_9[]=
          97. {
          98. /*--文字:9--*/
          99. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=8x16 --*/
          100. 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00,0x00,
          101. };
          102. code unsigned char Zf816_nc[]=//空字模
          103. {
          104. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
          105. };
          106. code unsigned char Zf816_mao_hao[]=//冒號
          107. {
          108. /*--文字::--*/
          109. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=8x16 --*/
          110. 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,
          111. };
          112. code unsigned char Hz1616_yi[]=
          113. {
          114. /*--文字:一--*/
          115. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
          116. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x7F,0xFE,
          117. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
          118. };
          119. code unsigned char Hz1616_er[]=
          120. {
          121. /*--文字:二--*/
          122. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
          123. 0x00,0x00,0x00,0x10,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
          124. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
          125. };
          126. code unsigned char Hz1616_san[]=
          127. {
          128. /*--文字:三--*/
          129. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
          130. 0x00,0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,
          131. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFE,0x00,0x00,0x00,0x00,
          132. };
          133. code unsigned char Hz1616_si[]=
          134. {
          135. /*--文字:四--*/
          136. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
          137. 0x00,0x00,0x7F,0xFC,0x44,0x84,0x44,0x84,0x44,0x84,0x44,0x84,0x44,0x84,0x44,0x84,
          138. 0x48,0x84,0x48,0x7C,0x50,0x04,0x60,0x04,0x40,0x04,0x7F,0xFC,0x40,0x04,0x00,0x00,
          139. };
          140. code unsigned char Hz1616_chuang[]=
          141. {
          142. /*--文字:窗--*/
          143. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
          144. 0x01,0x00,0x00,0x80,0x7F,0xFE,0x40,0x22,0x09,0x18,0x12,0x06,0x7F,0xF8,0x11,0x08,
          145. 0x13,0xE8,0x14,0x48,0x1A,0x88,0x11,0x08,0x12,0x88,0x14,0x08,0x1F,0xF8,0x10,0x08,
          146. };
          147. code unsigned char Hz1616_kou[]=
          148. {
          149. /*--文字:口--*/
          150. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
          151. 0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,
          152. 0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x20,0x08,0x20,0x08,0x00,0x00,0x00,0x00,
          153. };
          154. code unsigned char Hz1616_hang[]=
          155. {
          156. /*--文字:行--*/
          157. /*--宋體12;此字體下對應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
          158. 0x08,0x00,0x1C,0x00,0x31,0xFC,0x40,0x00,0x88,0x00,0x0C,0x00,0x1B,0xFE,0x30,0x20,
          159. 0x50,0x20,0x90,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0xA0,0x10,0x40,
          160. };
          161. unsigned char ucCanvasBuffer[]= //畫布顯示數(shù)組。注意,這里沒有code關(guān)鍵字,是全局變量。初始化全部填充0x00
          162. {
          163. 0x00,0x00,0x00,0x00,//上半屏
          164. 0x00,0x00,0x00,0x00,
          165. 0x00,0x00,0x00,0x00,
          166. 0x00,0x00,0x00,0x00,
          167. 0x00,0x00,0x00,0x00,
          168. 0x00,0x00,0x00,0x00,
          169. 0x00,0x00,0x00,0x00,
          170. 0x00,0x00,0x00,0x00,
          171. //------------上半屏和下半屏的分割線-----------
          172. 0x00,0x00,0x00,0x00,//下半屏
          173. 0x00,0x00,0x00,0x00,
          174. 0x00,0x00,0x00,0x00,
          175. 0x00,0x00,0x00,0x00,
          176. 0x00,0x00,0x00,0x00,
          177. 0x00,0x00,0x00,0x00,
          178. 0x00,0x00,0x00,0x00,
          179. 0x00,0x00,0x00,0x00,
          180. };
          181. unsigned char ucKeySec=0; //被觸發(fā)的按鍵編號
          182. unsigned intuiVoiceCnt=0;//蜂鳴器鳴叫的持續(xù)時(shí)間計(jì)數(shù)器
          183. unsigned char ucWd=1; //窗口變量
          184. unsigned char ucPart=0; //局部變量 0代表沒有選中任何一行,其它數(shù)值1到4代表選中某一行
          185. unsigned char ucWd1Update=1; //窗口1的整屏更新顯示變量 1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          186. unsigned char ucWd1Part1Update=0; //窗口1的第1行局部更新顯示變量1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          187. unsigned char ucWd1Part2Update=0; //窗口1的第2行局部更新顯示變量1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          188. unsigned char ucWd1Part3Update=0; //窗口1的第3行局部更新顯示變量1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          189. unsigned char ucWd1Part4Update=0; //窗口1的第4行局部更新顯示變量1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          190. unsigned char ucWd2Update=0; //窗口2的整屏更新顯示變量 1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          191. unsigned char ucWd2Part1Update=0; //窗口2的第1行局部更新顯示變量1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          192. unsigned char ucWd2Part2Update=0; //窗口2的第2行局部更新顯示變量1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          193. unsigned char ucWd2Part3Update=0; //窗口2的第3行局部更新顯示變量1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          194. unsigned char ucWd2Part4Update=0; //窗口2的第4行局部更新顯示變量1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          195. unsigned char ucData_1_1=8;//第1個(gè)窗口第1行的被設(shè)置數(shù)據(jù)
          196. unsigned char ucData_1_2=9;//第1個(gè)窗口第2行的被設(shè)置數(shù)據(jù)
          197. unsigned char ucData_1_3=10;//第1個(gè)窗口第3行的被設(shè)置數(shù)據(jù)
          198. unsigned char ucData_1_4=11;//第1個(gè)窗口第4行的被設(shè)置數(shù)據(jù)
          199. unsigned char ucData_2_1=12;//第2個(gè)窗口第1行的被設(shè)置數(shù)據(jù)
          200. unsigned char ucData_2_2=13;//第2個(gè)窗口第2行的被設(shè)置數(shù)據(jù)
          201. unsigned char ucData_2_3=14;//第2個(gè)窗口第3行的被設(shè)置數(shù)據(jù)
          202. unsigned char ucData_2_4=15;//第2個(gè)窗口第4行的被設(shè)置數(shù)據(jù)
          203. void main()
          204. {
          205. initial_myself(); //第一區(qū),上電后馬上初始化
          206. delay_long(100); //一線,延時(shí)線。延時(shí)一段時(shí)間
          207. initial_peripheral();//第二區(qū),上電后延時(shí)一段時(shí)間再初始化
          208. while(1) //第三區(qū)
          209. {
          210. key_service(); //按鍵服務(wù)的應(yīng)用程序
          211. lcd_display_service(); //應(yīng)用層面的液晶屏顯示程序
          212. }
          213. }
          214. void initial_myself()//第一區(qū) 上電后馬上初始化
          215. {
          216. /* 注釋二:
          217. * 矩陣鍵盤也可以做獨(dú)立按鍵,前提是把某一根公共輸出線輸出低電平,
          218. * 模擬獨(dú)立按鍵的觸發(fā)地,本程序中,把key_gnd_dr輸出低電平。
          219. * 朱兆祺51學(xué)習(xí)板的S1和S5兩個(gè)按鍵就是本程序中用到的兩個(gè)獨(dú)立按鍵。
          220. */
          221. key_gnd_dr=0; //模擬獨(dú)立按鍵的地GND,因此必須一直輸出低電平
          222. beep_dr=1; //用PNP三極管控制蜂鳴器,輸出高電平時(shí)不叫。
          223. TMOD=0x01;//設(shè)置定時(shí)器0為工作方式1
          224. TH0=0xf8; //重裝初始值(65535-2000)=63535=0xf82f
          225. TL0=0x2f;
          226. }
          227. void initial_peripheral() //第二區(qū) 上電后延時(shí)一段時(shí)間再初始化
          228. {
          229. LCDInit(); //初始化12864 內(nèi)部包含液晶模塊的復(fù)位
          230. EA=1; //開總中斷
          231. ET0=1; //允許定時(shí)中斷
          232. TR0=1; //啟動定時(shí)中斷
          233. }
          234. void T0_time() interrupt 1
          235. {
          236. TF0=0;//清除中斷標(biāo)志
          237. TR0=0; //關(guān)中斷
          238. key_scan(); //按鍵掃描函數(shù)
          239. if(uiVoiceCnt!=0)
          240. {
          241. uiVoiceCnt--; //每次進(jìn)入定時(shí)中斷都自減1,直到等于零為止。才停止鳴叫
          242. beep_dr=0;//蜂鳴器是PNP三極管控制,低電平就開始鳴叫。
          243. }
          244. else
          245. {
          246. ; //此處多加一個(gè)空指令,想維持跟if括號語句的數(shù)量對稱,都是兩條指令。不加也可以。
          247. beep_dr=1;//蜂鳴器是PNP三極管控制,高電平就停止鳴叫。
          248. }
          249. TH0=0xf8; //重裝初始值(65535-2000)=63535=0xf82f
          250. TL0=0x2f;
          251. TR0=1;//開中斷
          252. }
          253. void key_scan(void)//按鍵掃描函數(shù) 放在定時(shí)中斷里
          254. {
          255. static unsigned intuiKeyTimeCnt1=0; //按鍵去抖動延時(shí)計(jì)數(shù)器
          256. static unsigned char ucKeyLock1=0; //按鍵觸發(fā)后自鎖的變量標(biāo)志
          257. static unsigned intuiKeyTimeCnt2=0; //按鍵去抖動延時(shí)計(jì)數(shù)器
          258. static unsigned char ucKeyLock2=0; //按鍵觸發(fā)后自鎖的變量標(biāo)志
          259. static unsigned intuiKeyTimeCnt3=0; //按鍵去抖動延時(shí)計(jì)數(shù)器
          260. static unsigned char ucKeyLock3=0; //按鍵觸發(fā)后自鎖的變量標(biāo)志
          261. static unsigned intuiKeyTimeCnt4=0; //按鍵去抖動延時(shí)計(jì)數(shù)器
          262. static unsigned char ucKeyLock4=0; //按鍵觸發(fā)后自鎖的變量標(biāo)志
          263. if(key_sr1==1)//IO是高電平,說明按鍵沒有被按下,這時(shí)要及時(shí)清零一些標(biāo)志位
          264. {
          265. ucKeyLock1=0; //按鍵自鎖標(biāo)志清零
          266. uiKeyTimeCnt1=0;//按鍵去抖動延時(shí)計(jì)數(shù)器清零,此行非常巧妙,是我實(shí)戰(zhàn)中摸索出來的。
          267. }
          268. else if(ucKeyLock1==0)//有按鍵按下,且是第一次被按下
          269. {
          270. uiKeyTimeCnt1++; //累加定時(shí)中斷次數(shù)
          271. if(uiKeyTimeCnt1>const_key_time1)
          272. {
          273. uiKeyTimeCnt1=0;
          274. ucKeyLock1=1;//自鎖按鍵置位,避免一直觸發(fā)
          275. ucKeySec=1; //觸發(fā)1號鍵
          276. }
          277. }
          278. if(key_sr2==1)//IO是高電平,說明按鍵沒有被按下,這時(shí)要及時(shí)清零一些標(biāo)志位
          279. {
          280. ucKeyLock2=0; //按鍵自鎖標(biāo)志清零
          281. uiKeyTimeCnt2=0;//按鍵去抖動延時(shí)計(jì)數(shù)器清零,此行非常巧妙,是我實(shí)戰(zhàn)中摸索出來的。
          282. }
          283. else if(ucKeyLock2==0)//有按鍵按下,且是第一次被按下
          284. {
          285. uiKeyTimeCnt2++; //累加定時(shí)中斷次數(shù)
          286. if(uiKeyTimeCnt2>const_key_time2)
          287. {
          288. uiKeyTimeCnt2=0;
          289. ucKeyLock2=1;//自鎖按鍵置位,避免一直觸發(fā)
          290. ucKeySec=2; //觸發(fā)2號鍵
          291. }
          292. }
          293. if(key_sr3==1)//IO是高電平,說明按鍵沒有被按下,這時(shí)要及時(shí)清零一些標(biāo)志位
          294. {
          295. ucKeyLock3=0; //按鍵自鎖標(biāo)志清零
          296. uiKeyTimeCnt3=0;//按鍵去抖動延時(shí)計(jì)數(shù)器清零,此行非常巧妙,是我實(shí)戰(zhàn)中摸索出來的。
          297. }
          298. else if(ucKeyLock3==0)//有按鍵按下,且是第一次被按下
          299. {
          300. uiKeyTimeCnt3++; //累加定時(shí)中斷次數(shù)
          301. if(uiKeyTimeCnt3>const_key_time3)
          302. {
          303. uiKeyTimeCnt3=0;
          304. ucKeyLock3=1;//自鎖按鍵置位,避免一直觸發(fā)
          305. ucKeySec=3; //觸發(fā)3號鍵
          306. }
          307. }
          308. if(key_sr4==1)//IO是高電平,說明按鍵沒有被按下,這時(shí)要及時(shí)清零一些標(biāo)志位
          309. {
          310. ucKeyLock4=0; //按鍵自鎖標(biāo)志清零
          311. uiKeyTimeCnt4=0;//按鍵去抖動延時(shí)計(jì)數(shù)器清零,此行非常巧妙,是我實(shí)戰(zhàn)中摸索出來的。
          312. }
          313. else if(ucKeyLock4==0)//有按鍵按下,且是第一次被按下
          314. {
          315. uiKeyTimeCnt4++; //累加定時(shí)中斷次數(shù)
          316. if(uiKeyTimeCnt4>const_key_time4)
          317. {
          318. uiKeyTimeCnt4=0;
          319. ucKeyLock4=1;//自鎖按鍵置位,避免一直觸發(fā)
          320. ucKeySec=4; //觸發(fā)4號鍵
          321. }
          322. }
          323. }
          324. void key_service(void) //按鍵服務(wù)的應(yīng)用程序
          325. {
          326. switch(ucKeySec) //按鍵服務(wù)狀態(tài)切換
          327. {
          328. case 1:// 加按鍵 對應(yīng)朱兆祺學(xué)習(xí)板的S1鍵
          329. switch(ucWd)//在不同的窗口下,設(shè)置不同的參數(shù)
          330. {
          331. case 1://窗口1
          332. switch(ucPart)//在窗口1下,根據(jù)不同的局部變量來設(shè)置不同的參數(shù)
          333. {
          334. case 0: //無光標(biāo)顯示的狀態(tài) 此處的case 0可以省略
          335. break;
          336. case 1: //設(shè)置第1行參數(shù)
          337. ucData_1_1++;
          338. if(ucData_1_1>99)
          339. {
          340. ucData_1_1=99;
          341. }
          342. ucWd1Part1Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          343. break;
          344. case 2: //設(shè)置第2行參數(shù)
          345. ucData_1_2++;
          346. if(ucData_1_2>99)
          347. {
          348. ucData_1_2=99;
          349. }
          350. ucWd1Part2Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          351. break;
          352. case 3: //設(shè)置第3行參數(shù)
          353. ucData_1_3++;
          354. if(ucData_1_3>99)
          355. {
          356. ucData_1_3=99;
          357. }
          358. ucWd1Part3Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          359. break;
          360. case 4: //設(shè)置第4行參數(shù)
          361. ucData_1_4++;
          362. if(ucData_1_4>99)
          363. {
          364. ucData_1_4=99;
          365. }
          366. ucWd1Part4Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          367. break;
          368. }
          369. break;
          370. case 2://窗口2
          371. switch(ucPart)//在窗口2下,根據(jù)不同的局部變量來設(shè)置不同的參數(shù)
          372. {
          373. case 0: //無光標(biāo)顯示的狀態(tài) 此處的case 0可以省略
          374. break;
          375. case 1: //設(shè)置第1行參數(shù)
          376. ucData_2_1++;
          377. if(ucData_2_1>99)
          378. {
          379. ucData_2_1=99;
          380. }
          381. ucWd2Part1Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          382. break;
          383. case 2: //設(shè)置第2行參數(shù)
          384. ucData_2_2++;
          385. if(ucData_2_2>99)
          386. {
          387. ucData_2_2=99;
          388. }
          389. ucWd2Part2Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          390. break;
          391. case 3: //設(shè)置第3行參數(shù)
          392. ucData_2_3++;
          393. if(ucData_2_3>99)
          394. {
          395. ucData_2_3=99;
          396. }
          397. ucWd2Part3Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          398. break;
          399. case 4: //設(shè)置第4行參數(shù)
          400. ucData_2_4++;
          401. if(ucData_2_4>99)
          402. {
          403. ucData_2_4=99;
          404. }
          405. ucWd2Part4Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          406. break;
          407. }
          408. break;
          409. }
          410. uiVoiceCnt=const_voice_short; //按鍵聲音觸發(fā),滴一聲就停。
          411. ucKeySec=0;//響應(yīng)按鍵服務(wù)處理程序后,按鍵編號清零,避免一致觸發(fā)
          412. break;
          413. case 2:// 減按鍵 對應(yīng)朱兆祺學(xué)習(xí)板的S5鍵
          414. switch(ucWd)//在不同的窗口下,設(shè)置不同的參數(shù)
          415. {
          416. case 1://窗口1
          417. switch(ucPart)//在窗口1下,根據(jù)不同的局部變量來設(shè)置不同的參數(shù)
          418. {
          419. case 0: //無光標(biāo)顯示的狀態(tài) 此處的case 0可以省略
          420. break;
          421. case 1: //設(shè)置第1行參數(shù)
          422. ucData_1_1--;
          423. if(ucData_1_1>99) //一直減到最后,單片機(jī)C語言編譯器有一個(gè)特征,0減去1會溢出變成255(0xff)
          424. {
          425. ucData_1_1=0;
          426. }
          427. ucWd1Part1Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          428. break;
          429. case 2: //設(shè)置第2行參數(shù)
          430. ucData_1_2--;
          431. if(ucData_1_2>99) //一直減到最后,單片機(jī)C語言編譯器有一個(gè)特征,0減去1會溢出變成255(0xff)
          432. {
          433. ucData_1_2=0;
          434. }
          435. ucWd1Part2Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          436. break;
          437. case 3: //設(shè)置第3行參數(shù)
          438. ucData_1_3--;
          439. if(ucData_1_3>99) //一直減到最后,單片機(jī)C語言編譯器有一個(gè)特征,0減去1會溢出變成255(0xff)
          440. {
          441. ucData_1_3=0;
          442. }
          443. ucWd1Part3Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          444. break;
          445. case 4: //設(shè)置第4行參數(shù)
          446. ucData_1_4--;
          447. if(ucData_1_4>99) //一直減到最后,單片機(jī)C語言編譯器有一個(gè)特征,0減去1會溢出變成255(0xff)
          448. {
          449. ucData_1_4=0;
          450. }
          451. ucWd1Part4Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          452. break;
          453. }
          454. break;
          455. case 2://窗口2
          456. switch(ucPart)//在窗口2下,根據(jù)不同的局部變量來設(shè)置不同的參數(shù)
          457. {
          458. case 0: //無光標(biāo)顯示的狀態(tài) 此處的case 0可以省略
          459. break;
          460. case 1: //設(shè)置第1行參數(shù)
          461. ucData_2_1--;
          462. if(ucData_2_1>99) //一直減到最后,單片機(jī)C語言編譯器有一個(gè)特征,0減去1會溢出變成255(0xff)
          463. {
          464. ucData_2_1=0;
          465. }
          466. ucWd2Part1Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          467. break;
          468. case 2: //設(shè)置第2行參數(shù)
          469. ucData_2_2--;
          470. if(ucData_2_2>99) //一直減到最后,單片機(jī)C語言編譯器有一個(gè)特征,0減去1會溢出變成255(0xff)
          471. {
          472. ucData_2_2=0;
          473. }
          474. ucWd2Part2Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          475. break;
          476. case 3: //設(shè)置第3行參數(shù)
          477. ucData_2_3--;
          478. if(ucData_2_3>99) //一直減到最后,單片機(jī)C語言編譯器有一個(gè)特征,0減去1會溢出變成255(0xff)
          479. {
          480. ucData_2_3=0;
          481. }
          482. ucWd2Part3Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          483. break;
          484. case 4: //設(shè)置第4行參數(shù)
          485. ucData_2_4--;
          486. if(ucData_2_4>99) //一直減到最后,單片機(jī)C語言編譯器有一個(gè)特征,0減去1會溢出變成255(0xff)
          487. {
          488. ucData_2_4=0;
          489. }
          490. ucWd2Part4Update=1; //1代表更新顯示,響應(yīng)函數(shù)內(nèi)部會清零
          491. break;
          492. }
          493. break;
          494. }
          495. uiVoiceCnt=const_voice_short; //按鍵聲音觸發(fā),滴一聲就停。
          496. ucKeySec=0;//響應(yīng)按鍵服務(wù)處理程序后,按鍵編號清零,避免一致觸發(fā)
          497. break;
          498. case 3:// 切換"光標(biāo)"移動按鍵 對應(yīng)朱兆祺學(xué)習(xí)板的S9鍵
          499. switch(ucWd)//在不同的窗口下,設(shè)置不同的參數(shù)
          500. {
          501. case 1: //窗口1
          502. switch(ucPart)//在窗口1下,根據(jù)不同的局部變量來設(shè)置不同的參數(shù)
          503. {
          504. case 0: //無光標(biāo)顯示的狀態(tài) 此處的case 0可以省略
          505. break;
          506. case 1: //設(shè)置第1行參數(shù)
          507. ucPart=2; //光標(biāo)切換到下一行
          508. ucWd1Part1Update=1; //更新顯示原來那一行,目的是更新反顯光標(biāo)的狀態(tài)
          509. ucWd1Part2Update=1; //更新顯示下一行, 目的是更新反顯光標(biāo)的狀態(tài)
          510. break;
          511. case 2: //設(shè)置第2行參數(shù)
          512. ucPart=3; //光標(biāo)切換到下一行
          513. ucWd1Part2Update=1; //更新顯示原來那一行,目的是更新反顯光標(biāo)的狀態(tài)
          514. ucWd1Part3Update=1; //更新顯示下一行, 目的是更新反顯光標(biāo)的狀態(tài)
          515. break;
          516. case 3: //設(shè)置第3行參數(shù)
          517. ucPart=4; //光標(biāo)切換到下一行
          518. ucWd1Part3Update=1; //更新顯示原來那一行,目的是更新反顯光標(biāo)的狀態(tài)
          519. ucWd1Part4Update=1; //更新顯示下一行, 目的是更新反顯光標(biāo)的狀態(tài)
          520. break;
          521. case 4: //設(shè)置第4行參數(shù)
          522. ucWd=2;//切換到第2個(gè)窗口
          523. ucPart=1; //光標(biāo)返回到最上面第一行
          524. ucWd2Update=1; //窗口2整屏更新
          525. break;
          526. }
          527. break;
          528. case 2: //窗口2
          529. switch(ucPart)//在窗口2下,根據(jù)不同的局部變量來設(shè)置不同的參數(shù)
          530. {
          531. case 0: //無光標(biāo)顯示的狀態(tài) 此處的case 0可以省略
          532. break;
          533. case 1: //設(shè)置第1行參數(shù)
          534. ucPart=2; //光標(biāo)切換到下一行
          535. ucWd2Part1Update=1; //更新顯示原來那一行,目的是更新反顯光標(biāo)的狀態(tài)
          536. ucWd2Part2Update=1; //更新顯示下一行, 目的是更新反顯光標(biāo)的狀態(tài)
          537. break;
          538. case 2: //設(shè)置第2行參數(shù)
          539. ucPart=3; //光標(biāo)切換到下一行
          540. ucWd2Part2Update=1; //更新顯示原來那一行,目的是更新反顯光標(biāo)的狀態(tài)
          541. ucWd2Part3Update=1; //更新顯示下一行, 目的是更新反顯光標(biāo)的狀態(tài)
          542. break;
          543. case 3: //設(shè)置第3行參數(shù)
          544. ucPart=4; //光標(biāo)切換到下一行
          545. ucWd2Part3Update=1; //更新顯示原來那一行,目的是更新反顯光標(biāo)的狀態(tài)
          546. ucWd2Part4Update=1; //更新顯示下一行, 目的是更新反顯光標(biāo)的狀態(tài)
          547. break;
          548. case 4: //設(shè)置第4行參數(shù)
          549. ucWd=1;//切換到第1個(gè)窗口
          550. ucPart=1; //光標(biāo)返回到最上面第一行
          551. ucWd1Update=1; //窗口1整屏更新
          552. break;
          553. }
          554. break;
          555. }
          556. uiVoiceCnt=const_voice_short; //按鍵聲音觸發(fā),滴一聲就停。
          557. ucKeySec=0;//響應(yīng)按鍵服務(wù)處理程序后,按鍵編號清零,避免一致觸發(fā)
          558. break;
          559. case 4: // 設(shè)置按鍵對應(yīng)朱兆祺學(xué)習(xí)板的S13鍵,按一次進(jìn)入設(shè)置狀態(tài),出現(xiàn)反顯光標(biāo)。再按一次推出設(shè)置狀態(tài),消除反顯光標(biāo),并且強(qiáng)行切換到第1個(gè)窗口
          560. switch(ucWd)//在不同的窗口下,設(shè)置不同的參數(shù)
          561. {
          562. case 1://窗口1
          563. switch(ucPart)//在窗口1下,根據(jù)不同的局部變量來設(shè)置不同的參數(shù)
          564. {
          565. case 0: //無光標(biāo)顯示的狀態(tài)
          566. ucPart=1; //光標(biāo)顯示第一行,進(jìn)入設(shè)置模式
          567. ucWd1Part1Update=1; //更新顯示
          568. break;
          569. case 1: //設(shè)置第1行參數(shù)
          570. ucPart=0; //無光標(biāo)顯示,退出設(shè)置模式
          571. ucWd1Part1Update=1; //更新顯示
          572. break;
          573. case 2: //設(shè)置第2行參數(shù)
          574. ucPart=0; //無光標(biāo)顯示,退出設(shè)置模式
          575. ucWd1Part2Update=1; //更新顯示
          576. break;
          577. case 3: //設(shè)置第3行參數(shù)
          578. ucPart=0; //無光標(biāo)顯示,退出設(shè)置模式
          579. ucWd1Part3Update=1; //更新顯示
          580. break;
          581. case 4: //設(shè)置第4行參數(shù)
          582. ucPart=0; //無光標(biāo)顯示,退出設(shè)置模式
          583. ucWd1Part4Update=1; //更新顯示
          584. break;
          585. }
          586. break;
          587. case 2://窗口2
          588. switch(ucPart)//在窗口2下,根據(jù)不同的局部變量來設(shè)置不同的參數(shù)
          589. {
          590. case 0: //無光標(biāo)顯示的狀態(tài)
          591. ucWd=1; //強(qiáng)行切換到第1個(gè)窗口
          592. ucPart=1; //光標(biāo)顯示第一行,進(jìn)入設(shè)置模式
          593. ucWd1Update=1; //窗口1整屏更新
          594. break;
          595. case 1: //設(shè)置第1行參數(shù)
          596. ucWd=1; //強(qiáng)行切換到第1個(gè)窗口
          597. ucPart=0; //無光標(biāo)顯示,退出設(shè)置模式
          598. ucWd1Update=1; //窗口1整屏更新
          599. break;
          600. case 2: //設(shè)置第2行參數(shù)
          601. ucWd=1; //強(qiáng)行切換到第1個(gè)窗口
          602. ucPart=0; //無光標(biāo)顯示,退出設(shè)置模式
          603. ucWd1Update=1; //窗口1整屏更新
          604. break;
          605. case 3: //設(shè)置第3行參數(shù)
          606. ucWd=1; //強(qiáng)行切換到第1個(gè)窗口
          607. ucPart=0; //無光標(biāo)顯示,退出設(shè)置模式
          608. ucWd1Update=1; //窗口1整屏更新
          609. break;
          610. case 4: //設(shè)置第4行參數(shù)
          611. ucWd=1; //強(qiáng)行切換到第1個(gè)窗口
          612. ucPart=0; //無光標(biāo)顯示,退出設(shè)置模式
          613. ucWd1Update=1; //窗口1整屏更新
          614. break;
          615. }
          616. break;
          617. }
          618. uiVoiceCnt=const_voice_short; //按鍵聲音觸發(fā),滴一聲就停。
          619. ucKeySec=0;//響應(yīng)按鍵服務(wù)處理程序后,按鍵編號清零,避免一致觸發(fā)
          620. break;
          621. }
          622. }
          623. unsigned char *number_to_matrix(unsigned charucBitNumber)
          624. {
          625. unsigned char *p_ucAnyNumber;//此指針根據(jù)ucBitNumber數(shù)值的大小,分別調(diào)用不同的字庫。
          626. switch(ucBitNumber)//根據(jù)ucBitNumber數(shù)值的大小,分別調(diào)用不同的字庫。
          627. {
          628. case 0:
          629. p_ucAnyNumber=Zf816_0;
          630. break;
          631. case 1:
          632. p_ucAnyNumber=Zf816_1;
          633. break;
          634. case 2:
          635. p_ucAnyNumber=Zf816_2;
          636. break;
          637. case 3:
          638. p_ucAnyNumber=Zf816_3;
          639. break;
          640. case 4:
          641. p_ucAnyNumber=Zf816_4;
          642. break;
          643. case 5:
          644. p_ucAnyNumber=Zf816_5;
          645. break;
          646. case 6:
          647. p_ucAnyNumber=Zf816_6;
          648. break;
          649. case 7:
          650. p_ucAnyNumber=Zf816_7;
          651. break;
          652. case 8:
          653. p_ucAnyNumber=Zf816_8;
          654. break;
          655. case 9:
          656. p_ucAnyNumber=Zf816_9;
          657. break;
          658. case 10:
          659. p_ucAnyNumber=Zf816_nc;
          660. break;
          661. default: //如果上面的條件都不符合,那么默認(rèn)指向空字模
          662. p_ucAnyNumber=Zf816_nc;
          663. break;
          664. }
          665. return p_ucAnyNumber;//返回轉(zhuǎn)換結(jié)束后的指針
          666. }
          667. void lcd_display_service(void) //應(yīng)用層面的液晶屏顯示程序
          668. {
          669. switch(ucWd)//本程序的核心變量,窗口顯示變量。類似于一級菜單的變量。代表顯示不同的窗口。
          670. {
          671. case 1:
          672. wd1();//窗口1顯示的內(nèi)容
          673. break;
          674. case 2:
          675. wd2();//窗口2顯示的內(nèi)容
          676. break;
          677. //本程序只有2個(gè)窗口,所以只有一個(gè)case 1,如果要增加窗口,就直接增加 case 2, case 3...
          678. }
          679. }
          680. void wd1(void)//窗口1顯示的內(nèi)容
          681. {
          682. unsigned char ucAnyNumber_1; //分解變量的個(gè)位
          683. unsigned char ucAnyNumber_10; //分解變量的十位
          684. unsigned char *p_ucAnyNumber_1; //經(jīng)過數(shù)字轉(zhuǎn)換成字模后,分解變量的個(gè)位字模首地址
          685. unsigned char *p_ucAnyNumber_10; //經(jīng)過數(shù)字轉(zhuǎn)換成字模后,分解變量的十位字模首地址
          686. unsigned char ucCursorFlag;//光標(biāo)標(biāo)志,也就是反顯的標(biāo)志,它是根據(jù)局部變量ucPart來定的
          687. /* 注釋三:
          688. * 把每一個(gè)窗口的內(nèi)容分為兩種類型,一種類型是那些不用經(jīng)常刷新顯示的內(nèi)容,只有在切換窗口的時(shí)候
          689. * 才需要更新,這種內(nèi)容放在整屏更新顯示的括號里,比如清屏操作等內(nèi)容。另外一種是那些經(jīng)常需要
          690. * 刷新顯示的內(nèi)容,這種內(nèi)容放在局部更新顯示的括號里。
          691. */
          692. if(ucWd1Update==1)//窗口1整屏更新,里面只放那些不用經(jīng)常刷新顯示的內(nèi)容
          693. {
          694. ucWd1Update=0;//及時(shí)清零,避免一直更新
          695. ucWd1Part1Update=1; //激活窗口1的第1行局部更新顯示變量,這里在前面數(shù)碼管顯示框架上有所改進(jìn)
          696. ucWd1Part2Update=1; //激活窗口1的第2行局部更新顯示變量,這里在前面數(shù)碼管顯示框架上有所改進(jìn)
          697. ucWd1Part3Update=1; //激活窗口1的第3行局部更新顯示變量,這里在前面數(shù)碼管顯示框架上有所改進(jìn)
          698. ucWd1Part4Update=1; //激活窗口1的第4行局部更新顯示變量,這里在前面數(shù)碼管顯示框架上有所改進(jìn)
          699. display_clear(0x00); // 清屏操作, 全部顯示空填充0x00,全部顯示點(diǎn)陣用0xff。
          700. clear_all_canvas();//把畫布全部清零
          701. insert_buffer_to_canvas(0,0,Zf816_mao_hao,0,1,16);//把冒號的字模插入畫布
          702. display_lattice(0,0,Hz1616_yi,0,2,16,0); //一窗口一行,這些內(nèi)容不用經(jīng)常更新,只有在切換窗口的時(shí)候才更新顯示
          703. display_lattice(1,0,Hz1616_chuang,0,2,16,0);
          704. display_lattice(2,0,Hz1616_kou,0,2,16,0);
          705. display_lattice(3,0,Hz1616_yi,0,2,16,0);
          706. display_lattice(4,0,Hz1616_hang,0,2,16,0);
          707. display_lattice(0,16,Hz1616_yi,0,2,16,0); //一窗口二行
          708. display_lattice(1,16,Hz1616_chuang,0,2,16,0);
          709. display_lattice(2,16,Hz1616_kou,0,2,16,0);
          710. display_lattice(3,16,Hz1616_er,0,2,16,0);
          711. display_lattice(4,16,Hz1616_hang,0,2,16,0);
          712. display_lattice(8,0,Hz1616_yi,0,2,16,0); //一窗口三行
          713. display_lattice(9,0,Hz1616_chuang,0,2,16,0);
          714. display_lattice(10,0,Hz1616_kou,0,2,16,0);
          715. display_lattice(11,0,Hz1616_san,0,2,16,0);
          716. display_lattice(12,0,Hz1616_hang,0,2,16,0);
          717. display_lattice(8,16,Hz1616_yi,0,2,16,0); //一窗口四行
          718. display_lattice(9,16,Hz1616_chuang,0,2,16,0);
          719. display_lattice(10,16,Hz1616_kou,0,2,16,0);
          720. display_lattice(11,16,Hz1616_si,0,2,16,0);
          721. display_lattice(12,16,Hz1616_hang,0,2,16,0);
          722. }
          723. /* 注釋四:
          724. * 注意!我前面講數(shù)碼管顯示的時(shí)候有一句話講錯(cuò)了,我那時(shí)說<局部更新應(yīng)該寫在整屏更新之前>,這是不對的。
          725. * 按照現(xiàn)在的顯示程序框架<即整屏顯示更新括號里包含了所有局部變量的激活>,應(yīng)該是<整屏更新應(yīng)該寫在局部更新之前>
          726. * 這樣才對。
          727. */
          728. if(ucWd1Part1Update==1) //窗口1的第1行局部更新顯示變量,里面放一些經(jīng)常需要刷新顯示的內(nèi)容
          729. {
          730. ucWd1Part1Update=0; //及時(shí)清零,避免一直更新
          731. if(ucPart==1) //被選中
          732. {
          733. ucCursorFlag=1; //反顯 顯示
          734. }
          735. else //沒被選中
          736. {
          737. ucCursorFlag=0; //正常 顯示
          738. }
          739. if(ucData_1_1>=10) //有2位數(shù)以上
          740. {
          741. ucAnyNumber_10=ucData_1_1/10;//十位
          742. }
          743. else //否則顯示空
          744. {
          745. ucAnyNumber_10=10;//在下面的轉(zhuǎn)換函數(shù)中,代碼10表示空字模
          746. }
          747. ucAnyNumber_1=ucData_1_1%10/1;//個(gè)位
          748. p_ucAnyNumber_10=number_to_matrix(ucAnyNumber_10); //把數(shù)字轉(zhuǎn)換成字模首地址
          749. p_ucAnyNumber_1=number_to_matrix(ucAnyNumber_1); //把數(shù)字轉(zhuǎn)換成字模首地址
          750. insert_buffer_to_canvas(2,0,p_ucAnyNumber_10,ucCursorFlag,1,16);//把十的字模插入畫布
          751. insert_buffer_to_canvas(3,0,p_ucAnyNumber_1,ucCursorFlag,1,16);//把個(gè)的字模插入畫布
          752. display_lattice(5,0,ucCanvasBuffer,0,4,16,0); //顯示整屏的畫布,最后的參數(shù)0是偏移量
          753. }
          754. if(ucWd1Part2Update==1) //窗口1的第2行局部更新顯示變量,里面放一些經(jīng)常需要刷新顯示的內(nèi)容
          755. {
          756. ucWd1Part2Update=0; //及時(shí)清零,避免一直更新
          757. if(ucPart==2) //被選中
          758. {
          759. ucCursorFlag=1; //反顯 顯示
          760. }
          761. else //沒被選中
          762. {
          763. ucCursorFlag=0; //正常 顯示
          764. }
          765. if(ucData_1_2>=10) //有2位數(shù)以上
          766. {
          767. ucAnyNumber_10=ucData_1_2/10;//十位
          768. }
          769. else //否則顯示空
          770. {
          771. ucAnyNumber_10=10;//在下面的轉(zhuǎn)換函數(shù)中,代碼10表示空字模
          772. }
          773. ucAnyNumber_1=ucData_1_2%10/1;//個(gè)位
          774. p_ucAnyNumber_10=number_to_matrix(ucAnyNumber_10); //把數(shù)字轉(zhuǎn)換成字模首地址
          775. p_ucAnyNumber_1=number_to_matrix(ucAnyNumber_1); //把數(shù)字轉(zhuǎn)換成字模首地址
          776. insert_buffer_to_canvas(2,0,p_ucAnyNumber_10,ucCursorFlag,1,16);//把十的字模插入畫布
          777. insert_buffer_to_canvas(3,0,p_ucAnyNumber_1,ucCursorFlag,1,16);//把個(gè)的字模插入畫布
          778. display_lattice(5,16,ucCanvasBuffer,0,4,16,0); //顯示整屏的畫布,最后的參數(shù)0是偏移量
          779. }
          780. if(ucWd1Part3Update==1) //窗口1的第3行局部更新顯示變量,里面放一些經(jīng)常需要刷新顯示的內(nèi)容
          781. {
          782. ucWd1Part3Update=0; //及時(shí)清零,避免一直更新
          783. if(ucPart==3) //被選中
          784. {
          785. ucCursorFlag=1; //反顯 顯示
          786. }
          787. else //沒被選中
          788. {
          789. ucCursorFlag=0; //正常 顯示
          790. }
          791. if(ucData_1_3>=10) //有2位數(shù)以上
          792. {
          793. ucAnyNumber_10=ucData_1_3/10;//十位
          794. }
          795. else //否則顯示空
          796. {
          797. ucAnyNumber_10=10;//在下面的轉(zhuǎn)換函數(shù)中,代碼10表示空字模
          798. }
          799. ucAnyNumber_1=ucData_1_3%10/1;//個(gè)位
          800. p_ucAnyNumber_10=number_to_matrix(ucAnyNumber_10); //把數(shù)字轉(zhuǎn)換成字模首地址
          801. p_ucAnyNumber_1=number_to_matrix(ucAnyNumber_1); //把數(shù)字轉(zhuǎn)換成字模首地址
          802. insert_buffer_to_canvas(2,0,p_ucAnyNumber_10,ucCursorFlag,1,16);//把十的字模插入畫布
          803. insert_buffer_to_canvas(3,0,p_ucAnyNumber_1,ucCursorFlag,1,16);//把個(gè)的字模插入畫布
          804. display_lattice(13,0,ucCanvasBuffer,0,4,16,0); //顯示整屏的畫布,最后的參數(shù)0是偏移量
          805. }
          806. if(ucWd1Part4Update==1) //窗口1的第4行局部更新顯示變量,里面放一些經(jīng)常需要刷新顯示的內(nèi)容
          807. {
          808. ucWd1Part4Update=0; //及時(shí)清零,避免一直更新
          809. if(ucPart==4) //被選中
          810. {
          811. ucCursorFlag=1; //反顯 顯示
          812. }
          813. else //沒被選中
          814. {
          815. ucCursorFlag=0; //正常 顯示
          816. }
          817. if(ucData_1_4>=10) //有2位數(shù)以上
          818. {
          819. ucAnyNumber_10=ucData_1_4/10;//十位
          820. }
          821. else //否則顯示空
          822. {
          823. ucAnyNumber_10=10;//在下面的轉(zhuǎn)換函數(shù)中,代碼10表示空字模
          824. }
          825. ucAnyNumber_1=ucData_1_4%10/1;//個(gè)位
          826. p_ucAnyNumber_10=number_to_matrix(ucAnyNumber_10); //把數(shù)字轉(zhuǎn)換成字模首地址
          827. p_ucAnyNumber_1=number_to_matrix(ucAnyNumber_1); //把數(shù)字轉(zhuǎn)換成字模首地址
          828. insert_buffer_to_canvas(2,0,p_ucAnyNumber_10,ucCursorFlag,1,16);//把十的字模插入畫布
          829. insert_buffer_to_canvas(3,0,p_ucAnyNumber_1,ucCursorFlag,1,16);//把個(gè)的字模插入畫布
          830. display_lattice(13,16,ucCanvasBuffer,0,4,16,0); //顯示整屏的畫布,最后的參數(shù)0是偏移量
          831. }
          832. }
          833. void wd2(void)//窗口2顯示的內(nèi)容
          834. {
          835. unsigned char ucAnyNumber_1; //分解變量的個(gè)位
          836. unsigned char ucAnyNumber_10; //分解變量的十位
          837. unsigned char *p_ucAnyNumber_1; //經(jīng)過數(shù)字轉(zhuǎn)換成字模后,分解變量的個(gè)位字模首地址
          838. unsigned char *p_ucAnyNumber_10; //經(jīng)過數(shù)字轉(zhuǎn)換成字模后,分解變量的十位字模首地址
          839. unsigned char ucCursorFlag;//光標(biāo)標(biāo)志,也就是反顯的標(biāo)志,它是根據(jù)局部變量ucPart來定的
          840. if(ucWd2Update==1)//窗口2整屏更新,里面只放那些不用經(jīng)常刷新顯示的內(nèi)容
          841. {
          842. ucWd2Update=0;//及時(shí)清零,避免一直更新
          843. ucWd2Part1Update=1; //激活窗口2的第1行局部更新顯示變量,這里在前面數(shù)碼管顯示框架上有所改進(jìn)
          844. ucWd2Part2Update=1; //激活窗口2的第2行局部更新顯示變量,這里在前面數(shù)碼管顯示框架上有所改進(jìn)
          845. ucWd2Part3Update=1; //激活窗口2的第3行局部更新顯示變量,這里在前面數(shù)碼管顯示框架上有所改進(jìn)
          846. ucWd2Part4Update=1; //激活窗口2的第4行局部更新顯示變量,這里在前面數(shù)碼管顯示框架上有所改進(jìn)
          847. display_clear(0x00); // 清屏操作, 全部顯示空填充0x00,全部顯示點(diǎn)陣用0xff。
          848. clear_all_canvas();//把畫布全部清零
          849. insert_buffer_to_canvas(0,0,Zf816_mao_hao,0,1,16);//把冒號的字模插入畫布
          850. display_lattice(0,0,Hz1616_er,0,2,16,0); //二窗口一行,這些內(nèi)容不用經(jīng)常更新,只有在切換窗口的時(shí)候才更新顯示
          851. display_lattice(1,0,Hz1616_chuang,0,2,16,0);
          852. display_lattice(2,0,Hz1616_kou,0,2,16,0);
          853. display_lattice(3,0,Hz1616_yi,0,2,16,0);
          854. display_lattice(4,0,Hz1616_hang,0,2,16,0);
          855. display_lattice(0,16,Hz1616_er,0,2,16,0); //二窗口二行
          856. display_lattice(1,16,Hz1616_chuang,0,2,16,0);
          857. display_lattice(2,16,Hz1616_kou,0,2,16,0);
          858. display_lattice(3,16,Hz1616_er,0,2,16,0);
          859. display_lattice(4,16,Hz1616_hang,0,2,16,0);
          860. display_lattice(8,0,Hz1616_er,0,2,16,0); //二窗口三行
          861. display_lattice(9,0,Hz1616_chuang,0,2,16,0);
          862. display_lattice(10,0,Hz1616_kou,0,2,16,0);
          863. display_lattice(11,0,Hz1616_san,0,2,16,0);
          864. display_lattice(12,0,Hz1616_hang,0,2,16,0);
          865. display_lattice(8,16,Hz1616_er,0,2,16,0); //二窗口四行
          866. display_lattice(9,16,Hz1616_chuang,0,2,16,0);
          867. display_lattice(10,16,Hz1616_kou,0,2,16,0);
          868. display_lattice(11,16,Hz1616_si,0,2,16,0);
          869. display_lattice(12,16,Hz1616_hang,0,2,16,0);
          870. }
          871. if(ucWd2Part1Update==1) //窗口2的第1行局部更新顯示變量,里面放一些經(jīng)常需要刷新顯示的內(nèi)容
          872. {
          873. ucWd2Part1Update=0; //及時(shí)清零,避免一直更新
          874. if(ucPart==1) //被選中
          875. {
          876. ucCursorFlag=1; //反顯 顯示
          877. }
          878. else //沒被選中
          879. {
          880. ucCursorFlag=0; //正常 顯示
          881. }
          882. if(ucData_2_1>=10) //有2位數(shù)以上
          883. {
          884. ucAnyNumber_10=ucData_2_1/10;//十位
          885. }
          886. else //否則顯示空
          887. {
          888. ucAnyNumber_10=10;//在下面的轉(zhuǎn)換函數(shù)中,代碼10表示空字模
          889. }
          890. ucAnyNumber_1=ucData_2_1%10/1;//個(gè)位
          891. p_ucAnyNumber_10=number_to_matrix(ucAnyNumber_10); //把數(shù)字轉(zhuǎn)換成字模首地址
          892. p_ucAnyNumber_1=number_to_matrix(ucAnyNumber_1); //把數(shù)字轉(zhuǎn)換成字模首地址
          893. insert_buffer_to_canvas(2,0,p_ucAnyNumber_10,ucCursorFlag,1,16);//把十的字模插入畫布
          894. insert_buffer_to_canvas(3,0,p_ucAnyNumber_1,ucCursorFlag,1,16);//把個(gè)的字模插入畫布
          895. display_lattice(5,0,ucCanvasBuffer,0,4,16,0); //顯示整屏的畫布,最后的參數(shù)0是偏移量
          896. }
          897. if(ucWd2Part2Update==1) //窗口2的第2行局部更新顯示變量,里面放一些經(jīng)常需要刷新顯示的內(nèi)容
          898. {
          899. ucWd2Part2Update=0; //及時(shí)清零,避免一直更新
          900. if(ucPart==2) //被選中
          901. {
          902. ucCursorFlag=1; //反顯 顯示
          903. }
          904. else //沒被選中
          905. {
          906. ucCursorFlag=0; //正常 顯示
          907. }
          908. if(ucData_2_2>=10) //有2位數(shù)以上
          909. {
          910. ucAnyNumber_10=ucData_2_2/10;//十位
          911. }
          912. else //否則顯示空
          913. {
          914. ucAnyNumber_10=10;//在下面的轉(zhuǎn)換函數(shù)中,代碼10表示空字模
          915. }
          916. ucAnyNumber_1=ucData_2_2%10/1;//個(gè)位
          917. p_ucAnyNumber_10=number_to_matrix(ucAnyNumber_10); //把數(shù)字轉(zhuǎn)換成字模首地址
          918. p_ucAnyNumber_1=number_to_matrix(ucAnyNumber_1); //把數(shù)字轉(zhuǎn)換成字模首地址
          919. insert_buffer_to_canvas(2,0,p_ucAnyNumber_10,ucCursorFlag,1,16);//把十的字模插入畫布
          920. insert_buffer_to_canvas(3,0,p_ucAnyNumber_1,ucCursorFlag,1,16);//把個(gè)的字模插入畫布
          921. display_lattice(5,16,ucCanvasBuffer,0,4,16,0); //顯示整屏的畫布,最后的參數(shù)0是偏移量
          922. }
          923. if(ucWd2Part3Update==1) //窗口2的第3行局部更新顯示變量,里面放一些經(jīng)常需要刷新顯示的內(nèi)容
          924. {
          925. ucWd2Part3Update=0; //及時(shí)清零,避免一直更新
          926. if(ucPart==3) //被選中
          927. {
          928. ucCursorFlag=1; //反顯 顯示
          929. }
          930. else //沒被選中
          931. {
          932. ucCursorFlag=0; //正常 顯示
          933. }
          934. if(ucData_2_3>=10) //有2位數(shù)以上
          935. {
          936. ucAnyNumber_10=ucData_2_3/10;//十位
          937. }
          938. else //否則顯示空
          939. {
          940. ucAnyNumber_10=10;//在下面的轉(zhuǎn)換函數(shù)中,代碼10表示空字模
          941. }
          942. ucAnyNumber_1=ucData_2_3%10/1;//個(gè)位
          943. p_ucAnyNumber_10=number_to_matrix(ucAnyNumber_10); //把數(shù)字轉(zhuǎn)換成字模首地址
          944. p_ucAnyNumber_1=number_to_matrix(ucAnyNumber_1); //把數(shù)字轉(zhuǎn)換成字模首地址
          945. insert_buffer_to_canvas(2,0,p_ucAnyNumber_10,ucCursorFlag,1,16);//把十的字模插入畫布
          946. insert_buffer_to_canvas(3,0,p_ucAnyNumber_1,ucCursorFlag,1,16);//把個(gè)的字模插入畫布
          947. display_lattice(13,0,ucCanvasBuffer,0,4,16,0); //顯示整屏的畫布,最后的參數(shù)0是偏移量
          948. }
          949. if(ucWd2Part4Update==1) //窗口2的第4行局部更新顯示變量,里面放一些經(jīng)常需要刷新顯示的內(nèi)容
          950. {
          951. ucWd2Part4Update=0; //及時(shí)清零,避免一直更新
          952. if(ucPart==4) //被選中
          953. {
          954. ucCursorFlag=1; //反顯 顯示
          955. }
          956. else //沒被選中
          957. {
          958. ucCursorFlag=0; //正常 顯示
          959. }
          960. if(ucData_2_4>=10) //有2位數(shù)以上
          961. {
          962. ucAnyNumber_10=ucData_2_4/10;//十位
          963. }
          964. else //否則顯示空
          965. {
          966. ucAnyNumber_10=10;//在下面的轉(zhuǎn)換函數(shù)中,代碼10表示空字模
          967. }
          968. ucAnyNumber_1=ucData_2_4%10/1;//個(gè)位
          969. p_ucAnyNumber_10=number_to_matrix(ucAnyNumber_10); //把數(shù)字轉(zhuǎn)換成字模首地址
          970. p_ucAnyNumber_1=number_to_matrix(ucAnyNumber_1); //把數(shù)字轉(zhuǎn)換成字模首地址
          971. insert_buffer_to_canvas(2,0,p_ucAnyNumber_10,ucCursorFlag,1,16);//把十的字模插入畫布
          972. insert_buffer_to_canvas(3,0,p_ucAnyNumber_1,ucCursorFlag,1,16);//把個(gè)的字模插入畫布
          973. display_lattice(13,16,ucCanvasBuffer,0,4,16,0); //顯示整屏的畫布,最后的參數(shù)0是偏移量
          974. }
          975. }
          976. void clear_all_canvas(void)//把畫布全部清零
          977. {
          978. unsigned int j=0;
          979. unsigned int i=0;
          980. for(j=0;j<16;j++)//這里的16表示畫布有16行
          981. {
          982. for(i=0;i<4;i++) //這里的4表示畫布每行有4個(gè)字節(jié)
          983. {
          984. ucCanvasBuffer[j*4+i]=0x00;
          985. }
          986. }
          987. }
          988. void display_clear(unsigned char ucFillDate) // 清屏全部顯示空填充0x00 全部顯示點(diǎn)陣用0xff
          989. {
          990. unsigned char x,y;
          991. WriteCommand(0x34);//關(guān)顯示緩沖指令
          992. WriteCommand(0x34);//關(guān)顯示緩沖指令故意寫2次,怕1次關(guān)不了 這個(gè)是因?yàn)槲覅⒖嫉侥硰S家的驅(qū)動程序也是這樣寫的
          993. y=0;
          994. while(y<32)//y軸的范圍0至31
          995. {
          996. WriteCommand(y+0x80); //垂直地址
          997. WriteCommand(0x80); //水平地址
          998. for(x=0;x<32;x++)//256個(gè)橫向點(diǎn),有32個(gè)字節(jié)
          999. {
          1000. LCDWriteData(ucFillDate);
          1001. }
          1002. y++;
          1003. }
          1004. WriteCommand(0x36); //開顯示緩沖指令
          1005. }
          1006. /* 注釋五:
          1007. * 把字模插入畫布的函數(shù).
          1008. * 這是本節(jié)的核心函數(shù),讀者尤其要搞懂x_amount和y_amount對應(yīng)的顯示關(guān)系。
          1009. * 第1,2個(gè)參數(shù)x,y是在畫布中的坐標(biāo)體系。
          1010. * x的范圍是0至3,因?yàn)楫嫴嫉臋M向只要4個(gè)字節(jié)。y的范圍是0至15,因?yàn)楫嫴嫉目v向只有16行。
          1011. * 第3個(gè)參數(shù)*ucArray是字模的數(shù)組。
          1012. * 第4個(gè)參數(shù)ucFbFlag是反白顯示標(biāo)志。0代表正常顯示,1代表反白顯示。
          1013. * 第5,6個(gè)參數(shù)x_amount,y_amount分別代表字模數(shù)組的橫向有多少個(gè)字節(jié),縱向有幾橫。
          1014. */
          1015. void insert_buffer_to_canvas(unsigned int x,unsigned int y,const unsigned char*ucArray,unsigned char ucFbFlag,unsigned int x_amount,unsigned int y_amount)
          1016. {
          1017. unsigned int j=0;
          1018. unsigned int i=0;
          1019. unsigned char ucTemp;
          1020. for(j=0;j
          1021. {
          1022. for(i=0;i
          1023. {
          1024. ucTemp=ucArray[j*x_amount+i];
          1025. if(ucFbFlag==0)
          1026. {
          1027. ucCanvasBuffer[(y+j)*4+x+i]=ucTemp; //這里的4代表畫布每一行只有4個(gè)字節(jié)
          1028. }
          1029. else
          1030. {
          1031. ucCanvasBuffer[(y+j)*4+x+i]=~ucTemp; //這里的4代表畫布每一行只有4個(gè)字節(jié)
          1032. }
          1033. }
          1034. }
          1035. }
          1036. /* 注釋六:
          1037. * 顯示任意點(diǎn)陣函數(shù).
          1038. * 注意,本函數(shù)在前幾節(jié)的基礎(chǔ)上多增加了第7個(gè)參數(shù)uiOffSetAddr,它是偏移地址。
          1039. * 對于這個(gè)函數(shù),讀者尤其要搞懂x_amount和y_amount對應(yīng)的顯示關(guān)系。
          1040. * 第1,2個(gè)參數(shù)x,y是坐標(biāo)體系。x的范圍是0至15,y的范圍是0至31.
          1041. * 第3個(gè)參數(shù)*ucArray是字模的數(shù)組。
          1042. * 第4個(gè)參數(shù)ucFbFlag是反白顯示標(biāo)志。0代表正常顯示,1代表反白顯示。
          1043. * 第5,6個(gè)參數(shù)x_amount,y_amount分別代表字模數(shù)組的橫向有多少個(gè)字節(jié),縱向有幾橫。
          1044. * 第7個(gè)參數(shù)uiOffSetAddr是偏移地址,代表字模數(shù)組的從第幾個(gè)數(shù)據(jù)開始顯示。
          1045. */
          1046. void display_lattice(unsigned int x,unsigned int y,const unsigned char*ucArray,unsigned char ucFbFlag,unsigned int x_amount,unsigned int y_amount,unsigned int uiOffSetAddr)
          1047. {
          1048. unsigned int j=0;
          1049. unsigned int i=0;
          1050. unsigned char ucTemp;
          1051. //注意,要把以下兩行指令屏蔽,否則屏幕在更新顯示時(shí)會整屏閃動
          1052. //WriteCommand(0x34);//關(guān)顯示緩沖指令
          1053. //WriteCommand(0x34);//關(guān)顯示緩沖指令故意寫2次,怕1次關(guān)不了 這個(gè)是因?yàn)槲覅⒖嫉侥硰S家的驅(qū)動程序也是這樣寫的
          1054. for(j=0;j
          1055. {
          1056. WriteCommand(y+j+0x80); //垂直地址
          1057. WriteCommand(x+0x80); //水平地址
          1058. for(i=0;i
          1059. {
          1060. ucTemp=ucArray[j*x_amount+i+uiOffSetAddr]; //uiOffSetAddr是字模數(shù)組的偏移地址
          1061. if(ucFbFlag==1)//反白顯示
          1062. {
          1063. ucTemp=~ucTemp;
          1064. }
          1065. LCDWriteData(ucTemp);
          1066. // delay_short(30000);//把上一節(jié)這個(gè)延時(shí)函數(shù)去掉,加快刷屏速度
          1067. }
          1068. }
          1069. WriteCommand(0x36); //開顯示緩沖指令
          1070. }
          1071. void SendByteToLcd(unsigned char ucData)//發(fā)送一個(gè)字節(jié)數(shù)據(jù)到液晶模塊
          1072. {
          1073. unsigned char i;
          1074. for ( i = 0; i < 8; i++ )
          1075. {
          1076. if ( (ucData << i) & 0x80 )
          1077. {
          1078. LCDSID_dr = 1;
          1079. }
          1080. else
          1081. {
          1082. LCDSID_dr = 0;
          1083. }
          1084. LCDCLK_dr = 0;
          1085. LCDCLK_dr = 1;
          1086. }
          1087. }
          1088. void SPIWrite(unsigned char ucWData, unsigned char ucWRS) //模擬SPI發(fā)送一個(gè)字節(jié)的命令或者數(shù)據(jù)給液晶模塊的底層驅(qū)動
          1089. {
          1090. SendByteToLcd( 0xf8 + (ucWRS << 1) );
          1091. SendByteToLcd( ucWData & 0xf0 );
          1092. SendByteToLcd( (ucWData << 4) & 0xf0);
          1093. }
          1094. void WriteCommand(unsigned char ucCommand) //發(fā)送一個(gè)字節(jié)的命令給液晶模塊
          1095. {
          1096. LCDCS_dr = 0;
          1097. LCDCS_dr = 1;
          1098. SPIWrite(ucCommand, 0);
          1099. delay_short(90);
          1100. }
          1101. void LCDWriteData(unsigned char ucData)//發(fā)送一個(gè)字節(jié)的數(shù)據(jù)給液晶模塊
          1102. {
          1103. LCDCS_dr = 0;
          1104. LCDCS_dr = 1;
          1105. SPIWrite(ucData, 1);
          1106. }
          1107. void LCDInit(void) //初始化函數(shù)內(nèi)部包括液晶模塊的復(fù)位
          1108. {
          1109. LCDRST_dr = 1;//復(fù)位
          1110. LCDRST_dr = 0;
          1111. LCDRST_dr = 1;
          1112. }
          1113. void delay_short(unsigned int uiDelayShort) //延時(shí)函數(shù)
          1114. {
          1115. unsigned int i;
          1116. for(i=0;i
          1117. {
          1118. ;
          1119. }
          1120. }
          1121. void delay_long(unsigned int uiDelayLong)
          1122. {
          1123. unsigned int i;
          1124. unsigned int j;
          1125. for(i=0;i
          1126. {
          1127. for(j=0;j<500;j++)//內(nèi)嵌循環(huán)的空指令數(shù)量
          1128. {
          1129. ; //一個(gè)分號相當(dāng)于執(zhí)行一條空語句
          1130. }
          1131. }
          1132. }

          總結(jié)陳詞:
          這一節(jié)講了在多個(gè)窗口里設(shè)置不同的參數(shù)。還有一種常見的項(xiàng)目,要求把第1窗口是用來作為主菜單,主菜單里面有3個(gè)子菜單,可以通過移動光標(biāo)進(jìn)入不同的子菜單窗口進(jìn)行參數(shù)設(shè)置,這類項(xiàng)目該如何編程?欲知詳情,請聽下回分解-----通過主菜單移動光標(biāo)來進(jìn)入子菜單窗口的液晶屏程序。


          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();