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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于STM單片機I2C的JLX19296 LCD驅動程序

[復制鏈接]
跳轉到指定樓層
樓主
晶聯訊官方不提供JLX19296,官方提供的C51驅動也有很多問題. stm32驅動,為了減少連線數量,使用i2c接口,使用通用字庫文件.



單片機源程序如下:
  1. #include "st75256.h"
  2. #include "LCMfont.h"           
  3. #include "delay.h"
  4. #include "myiic.h"
  5. //LCM的顯存
  6. //-----------------虛擬顯存定義----------------
  7. u8 LCM_GRAM[192][12];
  8. /**********************************************
  9. // IIC Write Command
  10. **********************************************/
  11. void Write_IIC_Command(u8 IIC_Command)
  12. {
  13.         IIC_Start();
  14.         IIC_Send_Byte (0x78);            //Slave address,SA0=0
  15.         IIC_NAck ();
  16.         IIC_Send_Byte (0x80);                        //write command
  17.         IIC_NAck ();
  18.         IIC_Send_Byte(IIC_Command);
  19.         IIC_NAck ();
  20.         IIC_Stop();
  21. }
  22. /**********************************************
  23. // IIC Write Data
  24. **********************************************/
  25. void Write_IIC_Data(u8 IIC_Data)
  26. {
  27.         IIC_Start();
  28.         IIC_Send_Byte (0x78);                        //D/C#=0; R/W#=0
  29.         IIC_NAck ();
  30.         IIC_Send_Byte(0xC0);                        //write data
  31.         IIC_NAck ();
  32.         IIC_Send_Byte (IIC_Data);
  33.         IIC_NAck ();
  34.         IIC_Stop ();
  35. }
  36. void LCM_WR_Byte(u8 dat,u8 cmd)
  37. {
  38.         if(cmd)
  39.                 {

  40.    Write_IIC_Data(dat);
  41.    
  42.                 }
  43.         else {
  44.    Write_IIC_Command(dat);
  45.                
  46.         }
  47. }

  48. void LCM_Set_Pos(u8 x, u8 y)
  49. {         
  50.         LCM_WR_Byte(0x15,LCM_CMD);        //set Column
  51.         LCM_WR_Byte(0X00,LCM_DATA);
  52.         LCM_WR_Byte(x,LCM_DATA);
  53.         
  54.         LCM_WR_Byte(0x75,LCM_CMD);
  55.         LCM_WR_Byte(0,LCM_DATA);
  56.         LCM_WR_Byte(y,LCM_DATA);
  57.         LCM_WR_Byte(0x30,LCM_CMD);
  58.         LCM_WR_Byte(0x5C,LCM_CMD);                //寫數據到顯存
  59. }
  60. u8 test_ddr(void)
  61. {
  62.         u8 vol;
  63.         Write_IIC_Command(0x30);   //EXT=0
  64.         LCM_Set_Pos(0,0);
  65.         LCM_WR_Byte(0x01,LCM_DATA);
  66.         LCM_Set_Pos(0,0);
  67.         LCM_WR_Byte(0x5d,LCM_CMD);
  68.         vol = IIC_Read_Byte(1);
  69.         return vol;
  70. }
  71.         

  72. //更新顯存到LCM        
  73. void LCM_Refresh(void)
  74. {
  75.         u8 i,j;
  76.         LCM_WR_Byte(0x15,LCM_CMD);
  77.         LCM_WR_Byte(0X00,LCM_DATA);
  78.         LCM_WR_Byte(Max_Column-1,LCM_DATA);
  79.         
  80.         LCM_WR_Byte(0x75,LCM_CMD);
  81.         LCM_WR_Byte(0X08,LCM_DATA);                                        //        頁地址偏移8
  82.         LCM_WR_Byte((Max_Page-1)+8,LCM_DATA);
  83.         LCM_WR_Byte(0x30,LCM_CMD);
  84.         LCM_WR_Byte(0x5C,LCM_CMD);                //寫數據到顯存
  85.         
  86.         for(i=0;i<Max_Page;i++)
  87.         {
  88.                 for(j=0;j<Max_Column;j++)
  89.                 {
  90.                         LCM_WR_Byte(LCM_GRAM[j][i],LCM_DATA);
  91.                 }        
  92.   }
  93. }
  94. //清屏函數
  95. void LCM_Clear(void)
  96. {
  97.         u8 i,j;
  98.         for(i=0;i<Max_Page;i++)
  99.         {
  100.            for(j=0;j<Max_Column;j++)
  101.                         {
  102.                          LCM_GRAM[j][i]=0x00;//清除所有數據
  103.                         }
  104.   }
  105.         LCM_Refresh();//更新顯示
  106. }
  107. //畫點
  108. //x:0~255
  109. //y:0~96
  110. //t:1 填充 0,清空        
  111. void LCM_DrawPoint(u8 x,u8 y,u8 t)
  112. {
  113.         u8 i,m,n;
  114.         i=y/8;
  115.         m=y%8;
  116.         n=1<<m;
  117.         if(t){LCM_GRAM[x][i]|=n;}
  118.         else
  119.         {
  120.                 LCM_GRAM[x][i]=~LCM_GRAM[x][i];
  121.                 LCM_GRAM[x][i]|=n;
  122.                 LCM_GRAM[x][i]=~LCM_GRAM[x][i];
  123.         }
  124. }

  125. //畫線
  126. //x1,y1:起點坐標
  127. //x2,y2:結束坐標
  128. void LCM_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode)
  129. {
  130.         u16 t;
  131.         int xerr=0,yerr=0,delta_x,delta_y,distance;
  132.         int incx,incy,uRow,uCol;
  133.         delta_x=x2-x1; //計算坐標增量
  134.         delta_y=y2-y1;
  135.         uRow=x1;//畫線起點坐標
  136.         uCol=y1;
  137.         if(delta_x>0)incx=1; //設置單步方向
  138.         else if (delta_x==0)incx=0;//垂直線
  139.         else {incx=-1;delta_x=-delta_x;}
  140.         if(delta_y>0)incy=1;
  141.         else if (delta_y==0)incy=0;//水平線
  142.         else {incy=-1;delta_y=-delta_x;}
  143.         if(delta_x>delta_y)distance=delta_x; //選取基本增量坐標軸
  144.         else distance=delta_y;
  145.         for(t=0;t<distance+1;t++)
  146.         {
  147.                 LCM_DrawPoint(uRow,uCol,mode);//畫點
  148.                 xerr+=delta_x;
  149.                 yerr+=delta_y;
  150.                 if(xerr>distance)
  151.                 {
  152.                         xerr-=distance;
  153.                         uRow+=incx;
  154.                 }
  155.                 if(yerr>distance)
  156.                 {
  157.                         yerr-=distance;
  158.                         uCol+=incy;
  159.                 }
  160.         }
  161. }
  162. //x,y:圓心坐標
  163. //r:圓的半徑
  164. void LCM_DrawCircle(u8 x,u8 y,u8 r)
  165. {
  166.         int a, b,num;
  167.     a = 0;
  168.     b = r;
  169.     while(2 * b * b >= r * r)      
  170.     {
  171.         LCM_DrawPoint(x + a, y - b,1);
  172.         LCM_DrawPoint(x - a, y - b,1);
  173.         LCM_DrawPoint(x - a, y + b,1);
  174.         LCM_DrawPoint(x + a, y + b,1);

  175.         LCM_DrawPoint(x + b, y + a,1);
  176.         LCM_DrawPoint(x + b, y - a,1);
  177.         LCM_DrawPoint(x - b, y - a,1);
  178.         LCM_DrawPoint(x - b, y + a,1);
  179.         
  180.         a++;
  181.         num = (a * a + b * b) - r*r;//計算畫的點離圓心的距離
  182.         if(num > 0)
  183.         {
  184.             b--;
  185.             a--;
  186.         }
  187.     }
  188. }



  189. //在指定位置顯示一個字符,包括部分字符
  190. //x:0~255
  191. //y:0~96
  192. //size1:選擇字體 6x8/6x12/8x16/12x24
  193. //mode:0,反色顯示;1,正常顯示
  194. void LCM_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode)
  195. {
  196.         u8 i,m,temp,size2,chr1;
  197.         u8 x0=x,y0=y;
  198.         if(size1==8)size2=6;
  199.         else size2=(size1/8+((size1%8)?1:0))*(size1/2);  //得到字體一個字符對應點陣集所占的字節數
  200.         chr1=chr-' ';  //計算偏移后的值
  201.         for(i=0;i<size2;i++)
  202.         {
  203.                 if(size1==8)
  204.                           {temp=asc2_0806[chr1][i];} //調用0806字體
  205.                 else if(size1==12)
  206.         {temp=asc2_1206[chr1][i];} //調用1206字體
  207.                 else if(size1==16)
  208.         {temp=asc2_1608[chr1][i];} //調用1608字體
  209.                 else if(size1==24)
  210.         {temp=asc2_2412[chr1][i];} //調用2412字體
  211.                 else return;
  212.                 for(m=0;m<8;m++)
  213.                 {
  214.                         if(temp&0x01)LCM_DrawPoint(x,y,mode);
  215.                         else LCM_DrawPoint(x,y,!mode);
  216.                         temp>>=1;
  217.                         y++;
  218.                 }
  219.                 x++;
  220.                 if((size1!=8)&&((x-x0)==size1/2))
  221.                 {x=x0;y0=y0+8;}
  222.                 y=y0;
  223.   }
  224. }


  225. //顯示字符串
  226. //x,y:起點坐標  
  227. //size1:字體大小
  228. //*chr:字符串起始地址
  229. //mode:0,反色顯示;1,正常顯示
  230. void LCM_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode)
  231. {
  232.         while((*chr>=' ')&&(*chr<='~'))//判斷是不是非法字符!
  233.         {
  234.                 LCM_ShowChar(x,y,*chr,size1,mode);
  235.                 if(size1==8)x+=6;
  236.                 else x+=size1/2;
  237.                 chr++;
  238.   }
  239. }

  240. //m^n
  241. u32 LCM_Pow(u8 m,u8 n)
  242. {
  243.         u32 result=1;
  244.         while(n--)
  245.         {
  246.           result*=m;
  247.         }
  248.         return result;
  249. }

  250. //顯示數字
  251. //x,y :起點坐標
  252. //num :要顯示的數字
  253. //len :數字的位數
  254. //size:字體大小
  255. //mode:0,反色顯示;1,正常顯示
  256. void LCM_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode)
  257. {
  258.         u8 t,temp,m=0;
  259.         if(size1==8)m=2;
  260.         for(t=0;t<len;t++)
  261.         {
  262.                 temp=(num/LCM_Pow(10,len-t-1))%10;
  263.                         if(temp==0)
  264.                         {
  265.                                 LCM_ShowChar(x+(size1/2+m)*t,y,'0',size1,mode);
  266.       }
  267.                         else
  268.                         {
  269.                           LCM_ShowChar(x+(size1/2+m)*t,y,temp+'0',size1,mode);
  270.                         }
  271.   }
  272. }

  273. //顯示漢字
  274. //x,y:起點坐標
  275. //num:漢字對應的序號
  276. //mode:0,反色顯示;1,正常顯示
  277. void LCM_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode)
  278. {
  279.         u8 m,temp;
  280.         u8 x0=x,y0=y;
  281.         u16 i,size3=(size1/8+((size1%8)?1:0))*size1;  //得到字體一個字符對應點陣集所占的字節數
  282.         for(i=0;i<size3;i++)
  283.         {
  284.                 if(size1==16)
  285.                                 {temp=Hzk1[num][i];}//調用16*16字體
  286.                 else if(size1==24)
  287.                                 {temp=Hzk2[num][i];}//調用24*24字體
  288.                 else if(size1==32)      
  289.                                 {temp=Hzk3[num][i];}//調用32*32字體
  290.                 else if(size1==64)
  291.                                 {temp=Hzk4[num][i];}//調用64*64字體
  292.                 else return;
  293.                 for(m=0;m<8;m++)
  294.                 {
  295.                         if(temp&0x01)LCM_DrawPoint(x,y,mode);
  296.                         else LCM_DrawPoint(x,y,!mode);
  297.                         temp>>=1;
  298.                         y++;
  299.                 }
  300.                 x++;
  301.                 if((x-x0)==size1)
  302.                 {x=x0;y0=y0+8;}
  303.                 y=y0;
  304.         }
  305. }

  306. //num 顯示漢字的個數
  307. //space 每一遍顯示的間隔
  308. //mode:0,反色顯示;1,正常顯示
  309. void LCM_ScrollDisplay(u8 num,u8 space,u8 mode)
  310. {
  311.         u8 i,n,t=0,m=0,r;
  312.         while(1)
  313.         {
  314.                 if(m==0)
  315.                 {
  316.             LCM_ShowChinese(128,24,t,16,mode); //寫入一個漢字保存在LCM_GRAM[][]數組中
  317.                         t++;
  318.                 }
  319.                 if(t==num)
  320.                         {
  321.                                 for(r=0;r<Max_Page*space;r++)      //顯示間隔
  322. ……………………

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

以上3個文件下載
JLX19296G.rar (10.3 KB, 下載次數: 43)

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

使用道具 舉報

沙發
ID:1012918 發表于 2022-3-29 15:55 | 只看該作者
初始化后LCD背景可能有發黑現象,是因為LCD 偏置電壓過高引起的,需要根據ST75256 手冊做出微調,
回復

使用道具 舉報

板凳
ID:1131936 發表于 2024-9-13 16:18 | 只看該作者
請問單片機只要接i2c引腳到屏上就可以了嗎?不用接字庫IC的引腳是因為使用通用字庫嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区久久久 | 99久久亚洲| 91午夜在线| 激情婷婷成人 | 黄色免费av | 国产精品久久久久不卡 | 免费a大片 | 国产一区视频在线 | 在线三级网址 | 一级做a毛片 | 国产一级片网站 | 色影视| 亚洲精品第一国产综合野 | 99国产精品视频免费观看一公开 | 久久精品国产v日韩v亚洲 | 99精品久久久久久 | 毛片大全 | 中文字幕亚洲一区二区三区 | 99爱视频| 精精国产xxxx视频在线播放 | 精品久久久久香蕉网 | 国产福利二区 | 噜噜噜噜狠狠狠7777视频 | 亚洲黄色av | 久久久高清 | 国产精品一区免费 | 国产精品日韩在线观看一区二区 | 亚洲精品一区二区网址 | 成人中文字幕在线 | 亚洲男人天堂网 | 日韩免费成人av | 欧美video | 91高清视频在线观看 | 小早川怜子xxxxaⅴ在线 | 欧美三级久久久 | 黄频视频 | 国产传媒在线播放 | 免费在线一区二区 | 午夜精品久久久久久久久久久久久 | 黑人一级黄色大片 | 成人国产在线视频 |