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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 第79節(jié):通過主菜單移動光標來進入子菜單窗口的液晶屏程序

          第79節(jié):通過主菜單移動光標來進入子菜單窗口的液晶屏程序

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

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

          (1)硬件平臺:基于朱兆祺51單片機學習板。加按鍵對應S1鍵,減按鍵對應S5鍵,切換“光標”移動按鍵對應S9鍵,設置參數(shù)按鍵對應S13鍵。

          (2)實現(xiàn)功能:
          通過按鍵設置6個不同的參數(shù)。
          有4個窗口。第1個窗口是主菜單界面,通過光標切換可以進去設置不同參數(shù)的子菜單界面。第2個窗口是設置時間范圍界面。第3個窗口是設置速度范圍界面。第4個窗口是設置頻率范圍界面。每個設置界面顯示2個參數(shù)。每個參數(shù)的范圍是從0到99。
          有4個按鍵:
          (a) 一個是進入和退出S13按鍵,按一次進入選中的子菜單。再按一次退出子菜單。
          (b) 一個是移動光標S9按鍵,依次按下此按鍵,液晶屏上的光標會從上往下移動,表示選中不同的參數(shù)。當移動到每個窗口最下邊那一行時,再按下此按鍵會把光標移動到第一個參數(shù)。
          (c) 一個是減數(shù)S5按鍵,在設置參數(shù)模式下,依次按下此按鍵,被選中的參數(shù)會逐漸減小。
          (d) 一個是加數(shù)S1按鍵,在設置參數(shù)模式下,依次按下此按鍵,被選中的參數(shù)會逐漸加大。

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

          總結(jié)陳詞:
          我前面幾節(jié)液晶屏程序的字模都是通過外圍工具軟件生成的,其實這款12864液晶模塊本身就是自帶字庫,編程的時候只要在源代碼里直接寫入所需要的漢字或者字符,就可以自動調(diào)用相對應的字庫了。但是細心的網(wǎng)友一定會問,為什么在源代碼上直接寫入某個漢字就可以調(diào)用到這個漢字的字庫?在這個過程中,C51編譯器到底還干了哪些鮮為人知的好事?欲知詳情,請聽下回分解-----液晶屏自帶字庫跟漢字機內(nèi)碼的關系。


          評論


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

          關閉
          看屁屁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); })();