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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2083|回復: 0
收起左側

單片機LCD12864G帶字庫的獨立函數,可調用

[復制鏈接]
ID:282626 發表于 2020-8-18 17:41 | 顯示全部樓層 |閱讀模式
本人在使用LCD12864時,用到了JLX12864G-086-pc 也就是帶字庫的LCD12864屏,采用SPI串口方式,根據廠家提供的標準例程,進行了修改,做成了一個可被調用的獨立模塊,并可對顯示的文字進行反白顯示,并提供了相應的頭文件。
單片機源程序如下:
  1. //液晶屏型號:JLX12864G-086-PC-3S
  2. //接口:串行
  3. //中文字庫:帶中文字庫IC:JLX-GB2312,豎置橫排
  4. #include "JLX1286486PC.h"

  5. //延時
  6. void lcddelay(int n_ms)               
  7. {
  8.         int j,k;
  9.         for(j=0;j<n_ms;j++)
  10.         for(k=0;k<110;k++);
  11. }
  12. //短延時
  13. void lcddelay_us(int n_us)               
  14. {
  15.         int j,k;
  16.         for(j=0;j<n_us;j++)
  17.         for(k=0;k<1;k++);
  18. }

  19. //寫指令到LCD模塊
  20. void transfer_command_lcd(int data1)   
  21. {
  22.         char i;
  23.         lcd_cs1=0;
  24.         lcd_rs=0;
  25.         for(i=0;i<8;i++)
  26.    {
  27.                 lcd_sclk=0;
  28.                 lcddelay_us(10);         //加少量延時
  29.                 if(data1&0x80) lcd_sid=1;
  30.                 else lcd_sid=0;
  31.                 lcd_sclk=1;
  32.                 lcddelay_us(10);         //加少量延時
  33.                  data1=data1<<=1;
  34.    }
  35.         lcd_cs1=1;
  36. }

  37. //寫數據到LCD模塊
  38. void transfer_data_lcd(int data1)
  39. {
  40.         char i;
  41.         lcd_cs1=0;
  42.         lcd_rs=1;
  43.         for(i=0;i<8;i++)
  44.         {
  45.                 lcd_sclk=0;
  46.                 if(data1&0x80) lcd_sid=1;
  47.                 else lcd_sid=0;
  48.                 lcd_sclk=1;
  49.                 data1=data1<<=1;
  50.         }
  51.         lcd_cs1=1;
  52. }




  53. //LCD模塊初始化
  54. void initial_lcd()
  55. {
  56.         lcd_reset=0;                        //低電平復位
  57.         lcddelay(100);
  58.         lcd_reset=1;                            //復位完畢
  59.         lcddelay(100);        
  60.         transfer_command_lcd(0xe2);         //軟復位
  61.         lcddelay(50);
  62.         transfer_command_lcd(0x2c);  //升壓步聚1
  63.         lcddelay(50);       
  64.         transfer_command_lcd(0x2e);  //升壓步聚2
  65.         lcddelay(50);
  66.         transfer_command_lcd(0x2f);  //升壓步聚3
  67.         lcddelay(50);
  68.         transfer_command_lcd(0x23);  //粗調對比度,可設置范圍0x20~0x27
  69.         transfer_command_lcd(0x81);  //微調對比度
  70.         transfer_command_lcd(0x28);  //微調對比度的值,可設置范圍0x00~0x3f
  71.         transfer_command_lcd(0xa2);  //1/9偏壓比(bias)
  72.         transfer_command_lcd(0xc8);  //行掃描順序:從上到下
  73.         transfer_command_lcd(0xa0);  //列掃描順序:從左到右
  74.         transfer_command_lcd(0x40);  //起始行:第一行開始
  75.         transfer_command_lcd(0xaf);  //開顯示
  76.         lcddelay(50);
  77. }

  78. void lcd_address(uint page,uint column)
  79. {
  80.         column=column-0x01;
  81.         transfer_command_lcd(0xb0+page-1);   //設置頁地址,每8行為一頁,全屏共64行,被分成8頁
  82.         transfer_command_lcd(0x10+(column>>4&0x0f));        //設置列地址的高4位
  83.         transfer_command_lcd(column&0x0f);        //設置列地址的低4位       
  84. }

  85. //全屏清屏
  86. void clear_screen()
  87. {
  88.         unsigned char i,j;
  89.                
  90.         for(i=0;i<9;i++)
  91.         {
  92.                 transfer_command_lcd(0xb0+i);
  93.                 transfer_command_lcd(0x10);
  94.                 transfer_command_lcd(0x00);
  95.                 for(j=0;j<132;j++)
  96.                 {
  97.                           transfer_data_lcd(0x00);
  98.                 }
  99.         }
  100. }

  101. //顯示128x64點陣圖像
  102. void display_128x64(uchar *dp)
  103. {
  104.         uint i,j;
  105.        
  106.         for(j=0;j<8;j++)
  107.         {
  108.                 lcd_address(j+1,1);
  109.                 for (i=0;i<128;i++)
  110.                 {       
  111.                         transfer_data_lcd(*dp);                                        //寫數據到LCD,每寫完一個8位的數據后列地址自動加1
  112.                         dp++;
  113.                 }
  114.         }
  115. }


  116. //顯示16x16點陣圖像、漢字、生僻字或16x16點陣的其他圖標
  117. void display_graphic_16x16(uchar page,uchar column,uchar *dp)
  118. {
  119.         uint i,j;
  120.         for(j=0;j<2;j++)
  121.         {
  122.                 lcd_address(page+j,column);
  123.                 for (i=0;i<16;i++)
  124.                 {       
  125.                         transfer_data_lcd(*dp);                                        //寫數據到LCD,每寫完一個8位的數據后列地址自動加1
  126.                         dp++;
  127.                 }
  128.         }
  129. }

  130. //顯示8x16點陣圖像、ASCII, 或8x16點陣的自造字符、其他圖標
  131. void display_graphic_8x16(uchar page,uchar column,uchar *dp)
  132. {
  133.         uint i,j;
  134.         for(j=0;j<2;j++)
  135.         {
  136.                 lcd_address(page+j,column);
  137.                 for (i=0;i<8;i++)
  138.                 {       
  139.                         transfer_data_lcd(*dp);                                        //寫數據到LCD,每寫完一個8位的數據后列地址自動加1
  140.                         dp++;
  141.                 }
  142.         }
  143. }


  144. //顯示5X8點陣圖像、ASCII, 或5x8點陣的自造字符、其他圖標
  145. void display_graphic_5x8(uchar page,uchar column,uchar *dp)
  146. {
  147.         uint i;
  148.         lcd_address(page,column);
  149.         for (i=0;i<6;i++)
  150.         {       
  151.                 transfer_data_lcd(*dp);
  152.                 dp++;
  153.         }
  154.        
  155. }

  156. //送指令到晶聯訊字庫IC
  157. void send_command_to_ROM( uchar datu )
  158. {
  159.         uchar i;
  160.         for(i=0;i<8;i++ )
  161.         {
  162.                 Rom_SCK=0;
  163.                 lcddelay_us(10);
  164.                 if(datu&0x80)Rom_IN = 1;
  165.                 else Rom_IN = 0;
  166.                 datu = datu<<1;
  167.                   lcddelay_us(10);          //加一個延時
  168.                 Rom_SCK=1;
  169.                 lcddelay_us(10);
  170.         }
  171. }

  172. //從晶聯訊字庫IC中取漢字或字符數據(1個字節)
  173. static uchar get_data_from_ROM( )
  174. {
  175.         uchar i;
  176.         uchar ret_data=0;
  177.         for(i=0;i<8;i++)
  178.         {
  179.                 Rom_OUT=1;
  180.                 Rom_SCK=0;
  181.                 lcddelay_us(10);
  182.                 ret_data=ret_data<<1;
  183.                 if( Rom_OUT )
  184.                         ret_data=ret_data+1;
  185.                 else
  186.                         ret_data=ret_data+0;
  187.                 Rom_SCK=1;
  188.                 lcddelay_us(10);
  189.         }
  190.         return(ret_data);
  191. }


  192. //從指定地址讀出數據寫到液晶屏指定(page,column)座標中
  193. void get_and_write_16x16(ulong fontaddr,uchar page,uchar column,uchar fb)
  194. {
  195.         uchar i,j,disp_data;
  196.         Rom_CS = 0;
  197.         send_command_to_ROM(0x03);
  198.         send_command_to_ROM((fontaddr&0xff0000)>>16);         //地址的高8位,共24位
  199.         send_command_to_ROM((fontaddr&0xff00)>>8);                 //地址的中8位,共24位
  200.         send_command_to_ROM(fontaddr&0xff);                                 //地址的低8位,共24位
  201.         for(j=0;j<2;j++)
  202.         {
  203.                 lcd_address(page+j,column);
  204.                 for(i=0; i<16; i++ )
  205.             {
  206.                         disp_data=get_data_from_ROM();
  207.                   lcddelay_us(4);                   //加了一個延時
  208.        if(fb==1)                 
  209.                                 transfer_data_lcd(~disp_data);        //寫數據到LCD,每寫完1字節的數據后列地址自動加1 反白,對數據取反
  210.                     else
  211.                                 transfer_data_lcd(disp_data);        //  寫數據到LCD,每寫完1字節的數據后列地址自動加1
  212.                 }
  213.         }
  214.         Rom_CS=1;
  215. }

  216. //從指定地址讀出數據寫到液晶屏指定(page,column)座標中
  217. void get_and_write_8x16(ulong fontaddr,uchar page,uchar column,uchar fb)
  218. {
  219.         uchar i,j,disp_data;
  220.         Rom_CS = 0;
  221.         send_command_to_ROM(0x03);
  222.         send_command_to_ROM((fontaddr&0xff0000)>>16);         //地址的高8位,共24位
  223.         send_command_to_ROM((fontaddr&0xff00)>>8);                 //地址的中8位,共24位
  224.         send_command_to_ROM(fontaddr&0xff);                                 //地址的低8位,共24位
  225.         for(j=0;j<2;j++)
  226.         {
  227.                 lcd_address(page+j,column);
  228.                 for(i=0; i<8; i++ )
  229.             {
  230.                         disp_data=get_data_from_ROM();
  231.                         lcddelay_us(4);                                                                 //加了一個延時
  232.                         if(fb==1)
  233.                                 transfer_data_lcd(~disp_data);        //寫數據到LCD,每寫完1字節的數據后列地址自動加1
  234.                     else
  235.                                 transfer_data_lcd(disp_data);        //寫數據到LCD,每寫完1字節的數據后列地址自動加1
  236.                         }
  237.         }
  238.         Rom_CS=1;
  239. }

  240. //從指定地址讀出數據寫到液晶屏指定(page,column)座標中
  241. void get_and_write_5x8(ulong fontaddr,uchar page,uchar column,uchar fb)
  242. {
  243.         uchar i,disp_data;
  244.         Rom_CS = 0;
  245.         send_command_to_ROM(0x03);
  246.         send_command_to_ROM((fontaddr&0xff0000)>>16);         //地址的高8位,共24位
  247.         send_command_to_ROM((fontaddr&0xff00)>>8);                 //地址的中8位,共24位
  248.         send_command_to_ROM(fontaddr&0xff);                                 //地址的低8位,共24位
  249.         lcd_address(page,column);
  250.         for(i=0; i<5; i++ )
  251.         {
  252.                 disp_data=get_data_from_ROM();
  253.                 lcddelay_us(4);                                                                 //加了一個延時
  254.                 if(fb==1)
  255.                         transfer_data_lcd(~disp_data);        //寫數據到LCD,每寫完1字節的數據后列地址自動加1
  256.       else
  257.                 transfer_data_lcd(disp_data);        //寫數據到LCD,每寫完1字節的數據后列地址自動加1
  258.         }
  259.                         if(fb==1)
  260.                         {disp_data=0xff;
  261.                                 transfer_data_lcd(disp_data);        //寫數據到LCD,每寫完1字節的數據后列地址自動加1
  262.                         }
  263.                         Rom_CS=1;
  264. }


  265. //****************************************************************

  266. ulong  fontaddr=0;
  267. void display_GB2312_string(uchar page,uchar column,uchar *text,uchar fb)
  268. {
  269.         uchar i= 0;                       
  270.         while((text[i]>0x00))
  271.         {
  272.                 if(((text[i]>=0xb0) &&(text[i]<=0xf7))&&(text[i+1]>=0xa1))
  273.                 {                                               
  274.                         //國標簡體(GB2312)漢字在晶聯訊字庫IC中的地址由以下公式來計算:
  275.                         //Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0
  276.                         //由于擔心8位單片機有乘法溢出問題,所以分三部取地址
  277.                         fontaddr = (text[i]- 0xb0)*94;
  278.                         fontaddr += (text[i+1]-0xa1)+846;
  279.                         fontaddr = (ulong)(fontaddr*32);

  280.                         get_and_write_16x16(fontaddr,page,column,fb);         //從指定地址讀出數據寫到液晶屏指定(page,column)座標中
  281.                         i+=2;
  282.                         column+=16;
  283.                 }
  284.                 else if(((text[i]>=0xa1) &&(text[i]<=0xa3))&&(text[i+1]>=0xa1))
  285.                 {                                               
  286.                         //國標簡體(GB2312)15x16點的字符在晶聯訊字庫IC中的地址由以下公式來計算:
  287.                         //Address = ((MSB - 0xa1) * 94 + (LSB - 0xA1))*32+ BaseAdd;BaseAdd=0
  288.                         //由于擔心8位單片機有乘法溢出問題,所以分三部取地址
  289.                         fontaddr = (text[i]- 0xa1)*94;
  290.                         fontaddr += (text[i+1]-0xa1);
  291.                         fontaddr = (ulong)(fontaddr*32);
  292.        
  293.                         get_and_write_16x16(fontaddr,page,column,fb);         //從指定地址讀出數據寫到液晶屏指定(page,column)座標中
  294.                         i+=2;
  295.                         column+=16;
  296. ……………………

  297. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


lcd12864.rar (3.63 KB, 下載次數: 39)

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一级a毛片 | 国内精品久久久久久 | 日日草夜夜草 | 国产日韩精品一区 | 爱草在线 | 天天色天天射天天干 | www.毛片 | 99热碰 | 久久国产精品精品 | 久久午夜国产精品www忘忧草 | 在线免费亚洲视频 | 久久99精品久久久久久国产越南 | 亚洲毛片在线 | 国产一在线观看 | 亚洲精品电影网在线观看 | 日韩三级 | 成人午夜精品 | 69av网| 91精品国产色综合久久不卡98口 | 国产欧美在线视频 | 国产综合一区二区 | 国产精品成人在线播放 | 亚洲综合日韩精品欧美综合区 | 欧美日韩久久精品 | 蜜桃免费一区二区三区 | 天天综合日日夜夜 | 欧美激情网站 | 日韩在线不卡 | 日韩超碰| 精精国产xxxx视频在线播放 | 欧美日本韩国一区二区 | 精品久久久久一区二区国产 | 精品国产一区二区三区观看不卡 | 久久69精品久久久久久久电影好 | 国产成人精品久久二区二区 | 国产伦精品一区二区三毛 | 日本一区二区在线视频 | 色噜噜色综合 | 午夜影院在线观看版 | 亚洲国产精品视频一区 | 国产精品久久久久aaaa九色 |