久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2171|回復: 0
打印 上一主題 下一主題
收起左側

JLX12864G-290-PC-S液晶屏的單片機源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:384475 發表于 2021-4-15 17:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機源程序如下:
  1. /* Test program for JLX12864G-290-PC-S,串行接口,帶中文字庫 IC
  2. 驅動 IC 是:ST7567(or competible),字庫 IC:JLX-GB2312

  3. */
  4. #include <reg51.H>
  5. #include <intrins.h>
  6. sbit lcd_sclk=P3^2; //接口定義:lcd_sclk 就是 LCD 的 sclk
  7. sbit lcd_sid=P3^1; //接口定義:lcd_sid 就是 LCD 的 sid
  8. sbit lcd_rs=P3^0; //接口定義:lcd_rs 就是 LCD 的 rs
  9. sbit lcd_reset=P1^0; //接口定義:lcd_reset 就是 LCD 的 reset
  10. sbit lcd_cs1=P1^1; //接口定義:lcd_cs1 就是 LCD 的 cs1
  11. sbit Rom_IN=P1^2; //字庫 IC 接口定義:Rom_IN 就是字庫 IC 的 SI

  12. sbit Rom_OUT=P1^3; //字庫 IC 接口定義:Rom_OUT 就是字庫 IC 的 SO
  13. sbit Rom_SCK=P1^4; //字庫 IC 接口定義:Rom_SCK 就是字庫 IC 的 SCK
  14. sbit Rom_CS=P1^5; //字庫 IC 接口定義 Rom_CS 就是字庫 IC 的 CS#
  15. sbit key=P2^0; //定義一個按鍵
  16. #define uchar unsigned char
  17. #define uint unsigned int
  18. #define ulong unsigned long

  19. void delay_us(int i);

  20. /*寫指令到 LCD 模塊*/
  21. void transfer_command_lcd(int data1)
  22. {
  23. char i;
  24. lcd_cs1=0;
  25. lcd_rs=0;
  26. for(i=0;i<8;i++)
  27. {
  28. lcd_sclk=0;
  29. delay_us(1);
  30. if(data1&0x80) lcd_sid=1;
  31. else lcd_sid=0;
  32. lcd_sclk=1;
  33. delay_us(1);

  34. data1=data1<<=1;
  35. }
  36. lcd_cs1=1;
  37. }
  38. /*寫數據到 LCD 模塊*/
  39. void transfer_data_lcd(int data1)
  40. {
  41. char i;
  42. lcd_cs1=0;
  43. lcd_rs=1;
  44. for(i=0;i<8;i++)
  45. {
  46. lcd_sclk=0;
  47. if(data1&0x80) lcd_sid=1;
  48. else lcd_sid=0;
  49. lcd_sclk=1;
  50. data1=data1<<=1;
  51. }
  52. lcd_cs1=1;
  53. }
  54. /*延時*/
  55. void delay(int i)
  56. {
  57. int j,k;
  58. for(j=0;j<i;j++)
  59. for(k=0;k<500;k++);
  60. }
  61. /*短延時*/
  62. void delay_us(int i)
  63. {
  64. int j,k;
  65. for(j=0;j<i;j++)
  66. for(k=0;k<2;k++);
  67. }
  68. /*等待一個按鍵,我的主板是用 P2.0 與 GND 之間接一個按鍵*/
  69. void waitkey()
  70. {
  71. repeat:
  72. if (P2&0x01) goto repeat;
  73. else delay(60);
  74. if (P2&0x01) goto repeat;
  75. else
  76. delay(400);
  77. }
  78. /*LCD 模塊初始化*/
  79. void initial_lcd()
  80. {
  81. lcd_reset=0; /*低電平復位*/
  82. delay(20);
  83. lcd_reset=1; /*復位完畢*/
  84. delay(20);
  85. transfer_command_lcd(0xe2); /*軟復位*/
  86. delay(5);
  87. transfer_command_lcd(0x2c); /*升壓步聚 1*/
  88. delay(5);
  89. transfer_command_lcd(0x2e); /*升壓步聚 2*/
  90. delay(5);
  91. transfer_command_lcd(0x2f); /*升壓步聚 3*/
  92. delay(5);
  93. transfer_command_lcd(0x24); /*粗調對比度,可設置范圍 0x20~0x27*/
  94. transfer_command_lcd(0x81); /*微調對比度*/
  95. transfer_command_lcd(0x2a); /*0x1a,微調對比度的值,可設置范圍 0x00~0x3f*/
  96. transfer_command_lcd(0xa2); /*1/9 偏壓比(bias)*/
  97. transfer_command_lcd(0xc8); /*行掃描順序:從上到下*/
  98. transfer_command_lcd(0xa0); /*列掃描順序:從左到右*/
  99. transfer_command_lcd(0x40); /*起始行:第一行開始*/
  100. transfer_command_lcd(0xaf); /*開顯示*/
  101. }
  102. void lcd_address(uint page,uint column)
  103. {
  104. column=column-1;
  105. transfer_command_lcd(0xb0+page-1); /*設置頁地址*/
  106. transfer_command_lcd(0x10+(column>>4&0x0f)); /*設置列地址的高 4 位*/
  107. transfer_command_lcd(column&0x0f); /*設置列地址的低 4 位*/
  108. }
  109. /*全屏清屏*/
  110. void clear_screen()
  111. {
  112. unsigned char i,j;
  113. for(i=0;i<9;i++)
  114. {
  115. lcd_address(1+i,1);
  116. for(j=0;j<224;j++)
  117. {
  118. transfer_data_lcd(0x00);
  119. }

  120. }
  121. lcd_cs1=1;
  122. }
  123. //===顯示測試畫面:例如全顯示,隔行顯示,隔列顯示,雪花顯示=====
  124. void test_display(uchar data1,uchar data2)
  125. {
  126. int i,j;
  127. for(j=0;j<8;j++)
  128. {
  129. lcd_address(j+1,1);
  130. for(i=0;i<128;i++)
  131. {
  132. transfer_data_lcd(data1);
  133. transfer_data_lcd(data2);
  134. }
  135. }
  136. }


  137. /*顯示 16x16 點陣圖像、漢字、生僻字或 16x16 點陣的其他圖標,reverse=1 反顯*/
  138. void display_graphic_16x16(uint page,uint column,uchar reverse,uchar *dp)
  139. {
  140. uint i,j;
  141. for(j=0;j<2;j++)
  142. {
  143. lcd_address(page+j,column);
  144. for (i=0;i<16;i++)
  145. {
  146. if(reverse==1)
  147. transfer_data_lcd(~*dp); /*寫數據到 LCD,每寫完一個 8 位的數據后列地址自動加 1*/
  148. else
  149. transfer_data_lcd(*dp); /*寫數據到 LCD,每寫完一個 8 位的數據后列地址自動加 1*/
  150. dp++;
  151. }
  152. }
  153. }
  154. /*顯示 8x16 點陣圖像、ASCII, 或 8x16 點陣的自造字符、其他圖標,reverse=1 反顯*/
  155. void display_graphic_8x16(uint page,uchar column,uchar reverse,uchar *dp)
  156. {
  157. uint i,j;
  158. for(j=0;j<2;j++)
  159. {
  160. lcd_address(page+j,column);
  161. for (i=0;i<8;i++)
  162. {
  163. if(reverse==1)
  164. transfer_data_lcd(~*dp); /*寫數據到 LCD,每寫完一個 8 位的數據后列地址自動加 1*/
  165. else
  166. transfer_data_lcd(*dp); /*寫數據到 LCD,每寫完一個 8 位的數據后列地址自動加 1*/
  167. dp++;
  168. }
  169. }
  170. }

  171. /****送指令到晶聯訊字庫 IC***/
  172. void send_command_to_ROM( uchar datu )
  173. {
  174. uchar i;
  175. for(i=0;i<8;i++ )
  176. {
  177. if(datu&0x80)
  178. Rom_IN = 1;
  179. else
  180. Rom_IN = 0;
  181. datu = datu<<1;
  182. Rom_SCK=0;
  183. Rom_SCK=1;
  184. }
  185. }
  186. /****從晶聯訊字庫 IC 中取漢字或字符數據(1 個字節)***/
  187. static uchar get_data_from_ROM( )
  188. {
  189. uchar i;
  190. uchar ret_data=0;
  191. Rom_SCK=1;
  192. for(i=0;i<8;i++)
  193. {
  194. Rom_OUT=1;
  195. Rom_SCK=0;
  196. ret_data=ret_data<<1;
  197. if( Rom_OUT )
  198. ret_data=ret_data+1;
  199. else
  200. ret_data=ret_data+0;
  201. Rom_SCK=1;

  202. }
  203. return(ret_data);
  204. }
  205. /*從相關地址(addrHigh:地址高字節,addrMid:地址中字節,addrLow:地址低字節)中連續讀出 DataLen 個字節的數據到 pBuff 的地址*/
  206. /*連續讀取*/
  207. void get_n_bytes_data_from_ROM(uchar addrHigh,uchar addrMid,uchar addrLow,uchar *pBuff,uchar DataLen )
  208. {
  209. uchar i;
  210. Rom_CS = 0;
  211. lcd_cs1=1;
  212. Rom_SCK=0;
  213. send_command_to_ROM(0x03);
  214. send_command_to_ROM(addrHigh);
  215. send_command_to_ROM(addrMid);
  216. send_command_to_ROM(addrLow);
  217. for(i = 0; i < DataLen; i++ )
  218. *(pBuff+i) =get_data_from_ROM();
  219. Rom_CS = 1;
  220. }
  221. /******************************************************************/
  222. ulong fontaddr=0;
  223. void display_GB2312_string(uchar y,uchar x,uchar reverse,uchar *text)
  224. {
  225. uchar i= 0;
  226. uchar addrHigh,addrMid,addrLow ;
  227. uchar fontbuf[32];
  228. while((text[i]>0x00))
  229. {
  230. if(((text[i]>=0xb0) &&(text[i]<=0xf7))&&(text[i+1]>=0xa1))
  231. {
  232. /*國標簡體(GB2312)漢字在晶聯訊字庫 IC 中的地址由以下公式來計算:*/
  233. /*Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0*/
  234. /*由于擔心 8 位單片機有乘法溢出問題,所以分三部取地址*/
  235. fontaddr = (text[i]- 0xb0)*94;
  236. fontaddr += (text[i+1]-0xa1)+846;
  237. fontaddr = (ulong)(fontaddr*32);

  238. addrHigh = (fontaddr&0xff0000)>>16; /*地址的高 8 位,共 24 位*/
  239. addrMid = (fontaddr&0xff00)>>8; /*地址的中 8 位,共 24 位*/
  240. addrLow = fontaddr&0xff; /*地址的低 8 位,共 24 位*/
  241. get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );/*取 32 個字節的數據,存到"fontbuf[32]"*/
  242. display_graphic_16x16(y,x,reverse,fontbuf);/*顯示漢字到 LCD 上,y 為頁地址,x 為列地址,fontbuf[]為數據*/
  243. i+=2;
  244. x+=16;

  245. }
  246. else if(((text[i]>=0xa1) &&(text[i]<=0xa3))&&(text[i+1]>=0xa1))
  247. {
  248. /*國標簡體(GB2312)15x16 點的字符在晶聯訊字庫 IC 中的地址由以下公式來計算:*/
  249. /*Address = ((MSB - 0xa1) * 94 + (LSB - 0xA1))*32+ BaseAdd;BaseAdd=0*/
  250. /*由于擔心 8 位單片機有乘法溢出問題,所以分三部取地址*/
  251. fontaddr = (text[i]- 0xa1)*94;
  252. fontaddr += (text[i+1]-0xa1);
  253. fontaddr = (ulong)(fontaddr*32);

  254. addrHigh = (fontaddr&0xff0000)>>16; /*地址的高 8 位,共 24 位*/
  255. addrMid = (fontaddr&0xff00)>>8; /*地址的中 8 位,共 24 位*/
  256. addrLow = fontaddr&0xff; /*地址的低 8 位,共 24 位*/
  257. get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );/*取 32 個字節的數據,存到"fontbuf[32]"*/
  258. display_graphic_16x16(y,x,reverse,fontbuf);/*顯示漢字到 LCD 上,y 為頁地址,x 為列地址,fontbuf[]為數據*/
  259. i+=2;
  260. x+=16;
  261. }
  262. else if((text[i]>=0x20) &&(text[i]<=0x7e))
  263. {
  264. unsigned char fontbuf[16];
  265. fontaddr = (text[i]- 0x20);
  266. fontaddr = (unsigned long)(fontaddr*16);
  267. fontaddr = (unsigned long)(fontaddr+0x3cf80);
  268. addrHigh = (fontaddr&0xff0000)>>16;
  269. addrMid = (fontaddr&0xff00)>>8;
  270. addrLow = fontaddr&0xff;
  271. get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,16 );/*取 16 個字節的數據,存到"fontbuf[32]"*/

  272. display_graphic_8x16(y,x,reverse,fontbuf);/*顯示 8x16 的 ASCII 字到 LCD 上,y 為頁地址,x 為列地址,fontbuf[]為數據*/
  273. i+=1;
  274. x+=8;
  275. }
  276. else
  277. i++;
  278. }

  279. }

  280. //===============main program===================
  281. void main(void)
  282. {
  283. initial_lcd();
  284. while(1)
  285. {
  286. Rom_CS=1;
  287. lcd_cs1=0;
  288. clear_screen();  
  289. display_GB2312_string(1,1,0,"0123456789"); /*在第 1 頁,第 1 列,顯示一串 16x16 點陣漢字或 8x16 的 ASCII 字*/
  290. display_GB2312_string(4,1,1,"A B C D E F G");
  291. display_GB2312_string(7,1,0,"DIY興趣愛好者"); /*顯示一串 16x16 點陣漢字或 8x16 的 ASCII 字.以下雷同*/
  292. waitkey();         
  293. }
  294. }
復制代碼
下載以上代碼: 12864.rar (2.58 KB, 下載次數: 43)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品欧洲 | 日韩高清电影 | 欧美日韩三级在线观看 | 国产精品视频在线播放 | 成人黄色av | 久久久国产精品视频 | 日本在线综合 | 先锋资源亚洲 | 亚洲精品乱码久久久久久按摩 | 一区二区三区四区在线免费观看 | 精品国产区 | 国产精品美女久久久av超清 | 国产羞羞视频在线观看 | 精品视频久久久久久 | 亚洲欧美久久 | 在线色网| 欧美日韩一区二区三区在线观看 | 99综合| 午夜一区二区三区在线观看 | 一区二区三区中文字幕 | 永久www成人看片 | 国产成人精品一区二区 | 91伊人 | 国产激情在线观看 | 亚洲天堂免费在线 | 狠狠狠色丁香婷婷综合久久五月 | 国产精品日韩在线观看一区二区 | 欧美成人aaa级毛片在线视频 | 国产欧美一区二区精品忘忧草 | 亚洲aⅴ一区二区 | 爱爱爱av| 国产亚洲一区二区三区 | 欧美日韩专区 | 男人的天堂视频网站 | 免费视频久久 | 亚洲成人一区二区三区 | 久久999| 中文字幕国产视频 | 91精品麻豆日日躁夜夜躁 | 一区二区成人 | 欧美国产日韩在线观看 |