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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 10057|回復(fù): 20
打印 上一主題 下一主題
收起左側(cè)

lcd12864驅(qū)動(dòng)程序帶字庫(kù)版本ST7920,內(nèi)含簡(jiǎn)單的畫(huà)點(diǎn)、線、圓、矩形和三角形函數(shù)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:284075 發(fā)表于 2018-8-18 20:06 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  LCD12864驅(qū)動(dòng)程序     帶字庫(kù)版本ST7920,內(nèi)含簡(jiǎn)單的畫(huà)點(diǎn)、線、圓、矩形和三角形函數(shù)以及任意尺寸圖像顯示。

單片機(jī)源程序如下:
  1. #include <reg51.h>
  2. #include "lcd12864.h"

  3. unsigned char code Photo2[];


  4. void main()
  5. {

  6.         LCD12864_Init();
  7.         LCD12864_WriteCmd(0x30);
  8.         LCD12864_Display(0,3,"愛(ài)你 ");
  9.         
  10.         LCD12864_Drawing(56,0,Photo2); //在任意位置顯示任意比例圖片
  11.         
  12.         LCD12864_DrawLine_X(0,0,128,1); //水平線
  13.         
  14.         LCD12864_DrawLine_Y(0,0,64,1); //豎線
  15.         
  16.         LCD12864_DrawLine(0,0,50,50,1); //任意斜線
  17.         
  18.         LCD12864_DrawCircle(25,25,20,1); //圓
  19.         
  20.         LCD12864_DrawRetic(13,13,30,30,1); //矩形
  21.                
  22.         
  23.         while(1)
  24.         {
  25.                
  26.         }        
  27. }


  28. unsigned char code Photo2[] ={
  29. /*--  調(diào)入了一幅圖像:C:\Users\zhans\Pictures\Saved Pictures\我.bmp  --*/
  30. /*--  寬度x高度=71x64  --*/
  31. /*--  寬度不是8的倍數(shù),現(xiàn)調(diào)整為:寬度x高度=72x64  --*/
  32.         72,64,
  33. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  34. 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3F,0x00,
  35. 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5F,0x8F,0xC0,0x00,0x00,0x01,0x00,0x00,0x00,
  36. 0x7F,0xDF,0xF0,0x00,0x00,0x01,0x00,0x00,0x00,0x7F,0xFF,0xFC,0x00,0x00,0x01,0x00,
  37. 0x00,0x03,0xFF,0xFF,0xFE,0x00,0x00,0x01,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0x00,0x00,
  38. 0x01,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0x00,0x00,0x01,0x00,0x00,0x3F,0xFF,0xFF,0xFF,
  39. 0x80,0x00,0x01,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xE0,0x00,0x01,0x00,0x00,0x7F,0xFF,
  40. 0xFF,0xFF,0xE0,0x00,0x01,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x01,0x00,0x00,
  41. 0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x01,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x03,
  42. 0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x03,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xF8,
  43. 0x00,0x03,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x13,0x00,0x01,0xFF,0xFF,0xFF,
  44. 0xFF,0xF8,0x00,0x03,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x01,0x00,0x01,0xFF,
  45. 0xFF,0xFF,0xFF,0xF8,0x00,0x01,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x01,0x00,
  46. 0x01,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x01,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,
  47. 0x01,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x01,0x00,0x00,0x7F,0xFF,0xFF,0xFF,
  48. 0xE0,0x00,0x01,0x00,0x00,0x3F,0xF9,0xDF,0xFF,0xE0,0x00,0x01,0x00,0x00,0x3F,0xFC,
  49. 0x0F,0xFF,0xC0,0x00,0x01,0x00,0x00,0x1F,0x8C,0x03,0xEE,0x80,0x00,0x01,0x00,0x00,
  50. 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0xF8,0x00,0xA0,0x00,0x00,0x01,
  51. 0x00,0x00,0x01,0x34,0x00,0x40,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  52. 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
  53. 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
  54. 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
  55. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  56. 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
  57. 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
  58. 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
  59. 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  60. ……………………

  61. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
  1. //--------------------------------------------------------//
  2. //功能 :LCD12864驅(qū)動(dòng)程序(帶字庫(kù))
  3. //
  4. //--------------------[ZSX];QQ:1543588107-----------------//
  5. //--------------------------------------------------------//
  6. #include "lcd12864.h"
  7. //#include <math.h>


  8. /*******************************************************************************
  9. * 函 數(shù) 名         : LCD12864_Init
  10. * 函數(shù)功能                     : 初始化LCD12864
  11. * 輸    入         : 無(wú)
  12. * 輸    出         : 無(wú)
  13. * 返 回 值         : 無(wú)
  14. *******************************************************************************/
  15. void LCD12864_Init()
  16. {
  17.   LCD12864_RST = 1;
  18.         LCD12864_RST = 0;          //復(fù)位
  19.   LCD12864_RST = 1;
  20.         
  21. //        LCD12864_WriteCmd(0x20);  //4位數(shù)據(jù) 選擇基本指令操作 關(guān)繪圖
  22.         LCD12864_WriteCmd(0x30);  //8位數(shù)據(jù) 選擇基本指令操作 關(guān)繪圖
  23.         
  24.         LCD12864_WriteCmd(0x0c);  //顯示開(kāi) 關(guān)光標(biāo) 不允許游標(biāo)位置反白
  25. //        LCD12864_WriteCmd(0x0e);  //顯示開(kāi) 開(kāi)光標(biāo) 不允許游標(biāo)位置反白
  26. //        LCD12864_WriteCmd(0x0d);  //顯示開(kāi) 關(guān)光標(biāo) 允許游標(biāo)位置反白
  27. //        LCD12864_WriteCmd(0x0f);  //顯示開(kāi) 開(kāi)光標(biāo) 允許游標(biāo)位置反白
  28.                
  29. //        LCD12864_WriteCmd(0x04);  //讀取與寫(xiě)入時(shí)游標(biāo)向左移 地址自減1 顯示畫(huà)面整體不位移
  30.         LCD12864_WriteCmd(0x06);  //讀取與寫(xiě)入時(shí)游標(biāo)向右移 地址自加1 顯示畫(huà)面整體不位移
  31.         
  32. //        LCD12864_WriteCmd(0x10);  //游標(biāo)向左移動(dòng)
  33. //        LCD12864_WriteCmd(0x14);  //游標(biāo)向右移動(dòng)
  34.         
  35.         LCD12864_GDRAMInit();
  36.         
  37.         LCD12864_WriteCmd(0x01);  //清屏且地址歸位
  38. }


  39. /*******************************************************************************
  40. * 函 數(shù) 名         : LCD12864_Display
  41. * 函數(shù)功能                     : 在基本指令模式下設(shè)置顯示坐標(biāo)。注意:y是設(shè)置行,x是設(shè)置列
  42. * 輸    入         : x[in]列0~8 , y[in]行0~3 , Dat[in] 顯示數(shù)據(jù)
  43. * 輸    出         : 無(wú)
  44. * 返 回 值         : 無(wú)
  45. *******************************************************************************/
  46. void LCD12864_Display(unsigned char x, unsigned char y, unsigned char *Dat)  //x[in]行0~3, y[in]列0~8, Dat[in] 顯示數(shù)據(jù)
  47. {
  48.         unsigned char Addr;

  49.         switch(y)
  50.         {
  51.                 case 0: y = 0x80;break;  //第一行的首地址是80H
  52.                 case 1: y = 0x90;break;  //第二行的首地址是90H
  53.                 case 2: y = 0x88;break;  //第三行的首地址是88H
  54.                 case 3: y = 0x98;break;  //第四行的首地址是98H
  55.                 default :break;
  56.         }
  57.         Addr = x + y;
  58.         LCD12864_WriteCmd(Addr);
  59.         
  60. //檢測(cè)字符結(jié)束符('\0') 等同于 while(*Dat !='\0');   注:只有字符串才有結(jié)束符'\0',單個(gè)字符
  61.         while(*Dat) LCD12864_WriteData(*Dat++);
  62. }

  63. /*******************************************************************************
  64. * 函 數(shù) 名         : LCD12864_GDRAMInit
  65. * 函數(shù)功能                     : 初始化GDRAM
  66. * 輸    入         : 無(wú)
  67. * 輸    出         : 無(wú)
  68. * 返 回 值         : 無(wú)
  69. * 說(shuō)    明         :
  70. *******************************************************************************/
  71. void LCD12864_GDRAMInit()   //初始化GDRAM
  72. {
  73.         unsigned char x,y;
  74.   for(y=0;y<64;y++)//64列 每行寫(xiě)16個(gè)8字節(jié)取模數(shù)據(jù)
  75.           for(x=0;x<16;x++)
  76.            {
  77.                          LCD12864_WriteCmd(0x34);          //開(kāi)啟拓展指令集 關(guān)繪圖
  78.                          LCD12864_WriteCmd(0x80+y);        //先寫(xiě)列地址
  79.                          LCD12864_WriteCmd(0x80+x);        //再寫(xiě)行地址
  80.                          LCD12864_WriteCmd(0x30);          //開(kāi)啟基本指令集 關(guān)繪圖
  81.                          LCD12864_WriteData(0x00);
  82.                          LCD12864_WriteData(0x00);
  83.            }
  84. }


  85. /*******************************************************************************
  86. * 函 數(shù) 名         : LCD12864_Drawing(畫(huà)圖)
  87. * 函數(shù)功能                     : 在任意位置顯示任意比例圖片
  88. * 輸    入         : (x,y)[in] 顯示起始點(diǎn)    *img[in] 圖片顯示數(shù)據(jù)
  89. * 輸    出         : 無(wú)
  90. * 返 回 值         : 無(wú)
  91. * 說(shuō)    明         :圖像取模方式為橫向取模,取模后的數(shù)據(jù)要在加上圖像的顯示比例
  92.                                                                                  例如:uchar a[]={128,64,圖像數(shù)據(jù)};
  93. *******************************************************************************/
  94. void LCD12864_Drawing(unsigned char x,unsigned char y,unsigned char *img)  //在任意位置顯示任意比例圖片
  95. {
  96.         unsigned char xi,yi,tmp,xa,xb;

  97.         
  98.         xi=img[0]>>3; //除以8,每行字節(jié)數(shù)
  99.         xa=x>>4;      //起始行地址
  100.         xb=x&0x0f;    //起始行偏移地址
  101.         
  102.         for(yi=y;yi<(img[1]+y);yi++) //確定圖片的顯示區(qū)域
  103.         {
  104.                 LCD12864_WriteCmd(0x34);//開(kāi)啟拓展指令集 關(guān)繪圖
  105.                
  106.                 if(yi<32)   //顯示圖片上下半屏選擇(地址調(diào)整)
  107.                  {
  108.                   LCD12864_WriteCmd(0x80+yi);        //先寫(xiě)列地址
  109.                         LCD12864_WriteCmd(0x80+xa);        //再寫(xiě)行地址
  110.                  }
  111.                 else
  112.                  {
  113.                         LCD12864_WriteCmd(0x80+yi-32);//先寫(xiě)列地址
  114.                         LCD12864_WriteCmd(0x88+xa);          //再寫(xiě)行地址
  115.                  }
  116.                
  117.                 LCD12864_WriteCmd(0x30);          //開(kāi)啟基本指令集 關(guān)繪圖
  118.                
  119.                 if(xb>=8) //起始行偏移地址
  120.      {
  121.                   LCD12864_WriteData(0x00); //偏移超過(guò)8位時(shí),則在第一字節(jié)位置補(bǔ)零
  122.                   LCD12864_WriteData(img[(yi-y)*xi+2]>>(xb-8)); //依據(jù)xb(起始行偏移地址)對(duì)圖像重新編碼
  123.                         
  124.                         for(tmp=0;tmp<xi-1;tmp++)
  125.                          LCD12864_WriteData((((unsigned int)(img[(yi-y)*xi+tmp+2])<<8)+img[(yi-y)*xi+tmp+3])>>(xb-8));//依據(jù)xb(起始行偏移地址)對(duì)圖像重新編碼
  126.                         
  127.                         LCD12864_WriteData((unsigned int)(img[(yi-y)*xi+xi+1])<<(16-xb));//依據(jù)xb(起始行偏移地址)對(duì)圖像重新編碼
  128.                  }
  129.                 else
  130.      {
  131.                   LCD12864_WriteData(img[(yi-y)*xi+2]>>xb);//依據(jù)xb(起始行偏移地址)對(duì)圖像重新編碼
  132.                         
  133.                         for(tmp=0;tmp<xi-1;tmp++)
  134.                          LCD12864_WriteData((((unsigned int)(img[(yi-y)*xi+tmp+2])<<8)+(img[(yi-y)*xi+tmp+3]))>>xb);//依據(jù)xb(起始行偏移地址)對(duì)圖像重新編碼
  135.                         
  136.                         LCD12864_WriteData((unsigned int)(img[(yi-y)*xi+xi+1])<<(8-xb));//依據(jù)xb(起始行偏移地址)對(duì)圖像重新編碼
  137.                  }
  138.         }

  139.          LCD12864_WriteCmd(0x36);          //開(kāi)啟基本指令集 開(kāi)繪圖
  140. }


  141. /*******************************************************************************
  142. * 函 數(shù) 名         : LCD12864_DrawPoint(畫(huà),點(diǎn))
  143. * 函數(shù)功能                     : 在任意位置描點(diǎn)
  144. * 輸    入         : x[in] 0~127 水平坐標(biāo)  y[in] 0~63 垂直坐標(biāo)  color[in] 顏色 黑或白
  145. * 輸    出         : 無(wú)
  146. * 返 回 值         : 無(wú)
  147. *******************************************************************************/
  148. void LCD12864_DrawPoint(unsigned char x,unsigned char y,bit color) //在任意位置描點(diǎn)   x[in] 0~128 水平坐標(biāo)  y[in] 0~64 垂直坐標(biāo)  color[in] 顏色 黑或白
  149. {
  150.         unsigned char seat,spot;  //位置,點(diǎn)
  151.         unsigned char Htmp,Ltmp;
  152.         
  153.         LCD12864_WriteCmd(0x36);  //開(kāi)啟基本指令集 開(kāi)繪圖
  154.         
  155.         seat = x >> 4;   //得出水平位置地址(高4位就是位置地址)
  156.         spot = x & 0x0f; //得出點(diǎn)在水平位置地址的哪個(gè)地址(低4位就是點(diǎn)的位置)
  157.         
  158.         if(y >= 32){y-=32;seat+=8;}  //大于32時(shí),切換到下屏
  159.         
  160.         LCD12864_WriteCmd(0x80+y);      //先寫(xiě)垂直方向地址,指定在哪一行
  161.         LCD12864_WriteCmd(0x80+seat);   //再寫(xiě)水平方向地址,指定在某一行具體地址
  162.         
  163.         LCD12864_ReadData();  //空讀一個(gè)數(shù)據(jù),LCD必先假讀一次后才能正確讀出數(shù)據(jù)
  164.         
  165.         Htmp = LCD12864_ReadData();
  166.         Ltmp = LCD12864_ReadData();     //讀完之后地址指針會(huì)改變,所以要重新寫(xiě)一次地址
  167.         
  168.         LCD12864_WriteCmd(0x80+y);      //先寫(xiě)垂直方向地址,指定在哪一行
  169.         LCD12864_WriteCmd(0x80+seat);   //再寫(xiě)水平方向地址,指定在某一行具體地址

  170.         if(color) //描黑點(diǎn)
  171.         {
  172.                 if(spot < 8) Htmp |= (1<<(7-spot));  //數(shù)據(jù)都是高位在前,即高位最靠近坐標(biāo)(0,0)
  173.                 else Ltmp |= (1<<(15-spot));
  174.         }
  175.         else      //描白點(diǎn)
  176.         {
  177.                 if(spot < 8) Htmp &= ~(1<<(7-spot));  //數(shù)據(jù)都是高位在前,即高位最靠近坐標(biāo)(0,0)
  178.                 else Ltmp &= ~(1<<(15-spot));
  179.         }
  180.         
  181.         LCD12864_WriteData(Htmp);  //寫(xiě)入數(shù)據(jù)
  182.         LCD12864_WriteData(Ltmp);
  183.         LCD12864_WriteCmd(0x30);  //開(kāi)啟基本指令集
  184. }


  185. /*******************************************************************************
  186. * 函 數(shù) 名         : LCD12864_DrawLine_X(畫(huà),線)
  187. * 函數(shù)功能                     : 在任意位置描水平線
  188. * 輸    入         : (x0,y0) 起始坐標(biāo)  x1[in] 垂直坐標(biāo)  color[in] 顏色 黑或白
  189. * 輸    出         : 無(wú)
  190. * 返 回 值         : 無(wú)
  191. *******************************************************************************/
  192. void LCD12864_DrawLine_X(unsigned char x0,unsigned char y0,unsigned char x1,bit color) //在任意位置描水平線
  193. {
  194.         unsigned char tmp;
  195.         
  196.         if(x0 > x1)  
  197.         {
  198.                 tmp = x1;
  199.                 x1 = x0;
  200.                 x0 = tmp;
  201.         }
  202.         do
  203.         {
  204.                 LCD12864_DrawPoint(x0,y0,color);
  205.                 x0++;
  206.         }
  207.         while(x1 >= x0);
  208. }


  209. /*******************************************************************************
  210. * 函 數(shù) 名         : LCD12864_DrawLine_Y(畫(huà),線)
  211. * 函數(shù)功能                     : 在任意位置描豎線
  212. * 輸    入         : (x0,y0) 起始坐標(biāo)  y1[in] 垂直坐標(biāo)  color[in] 顏色 黑或白
  213. * 輸    出         : 無(wú)
  214. * 返 回 值         : 無(wú)
  215. *******************************************************************************/
  216. void LCD12864_DrawLine_Y(unsigned char x0,unsigned char y0,unsigned char y1,bit color) //在任意位置描豎線
  217. {
  218.         unsigned char tmp;
  219.         
  220.         if(y0 > y1)  
  221.         {
  222.                 tmp = y0;
  223.                 y0 = y1;
  224.                 y1 = tmp;
  225.         }
  226.         while(y0 <= y1)
  227.         {
  228.                 LCD12864_DrawPoint(x0,y0,color);
  229.                 y0++;
  230.         }
  231. }

  232. /*******************************************************************************
  233. * 函 數(shù) 名         : LCD12864_DrawLine(畫(huà),線)
  234. * 函數(shù)功能                     : 在任意位置描任意線(插值法)
  235. * 輸    入         : (x0,y0) 起始坐標(biāo) (x1,y1) 終點(diǎn)坐標(biāo)  color[in] 顏色 黑或白
  236. * 輸    出         : 無(wú)
  237. * 返 回 值         : 無(wú)
  238. * 說(shuō)    明         :有bug.只能畫(huà)某些直線。
  239. *******************************************************************************/
  240. void LCD12864_DrawLine(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit color) //在任意位置描任意線
  241. {
  242.         char dx_sym,dy_sym;  //x,y軸的增值方向,-1,減;1,增
  243.         char dx,dy;                                         //x,y軸直線差值
  244.         int dx_2,dy_2;       //x,y軸直線差值的兩倍
  245.         int di;                                                         //決策變量
  246.         
  247.         dx= x1-x0;        //求兩點(diǎn)間的差值
  248.         dy= y1-y0;
  249.         
  250.         if(dx>0) dx_sym= 1;  //確定x軸增值方向
  251.         else
  252.         {
  253.                 if(dx<0) dx_sym= -1;
  254.                 else
  255.                 {
  256.                         LCD12864_DrawLine_Y(x0,y0,y1,color); //dx 為零 表示畫(huà)直線
  257.                         return;
  258.                 }
  259.         }
  260.         
  261.         if(dy > 0) dy_sym = 1;   //確定y軸增值方向
  262.         else
  263.         {
  264.                 if(dy < 0) dy_sym = -1;
  265.                 else
  266.                 {
  267.                         LCD12864_DrawLine_X(x0,y0,x1,color); //dy 為零 表示畫(huà)直線
  268.                         return;
  269.                 }
  270.         }
  271.         
  272.         dx= dx_sym*dx;  //dx,dy的取絕對(duì)值
  273.         dy= dy_sym*dy;
  274.         
  275.         dx_2= dx*2;
  276.         dy_2= dy*2;
  277.         
  278.         if(dx>=dy)        //判斷 dx,dy的大小
  279.         {
  280.                 di= dy_2-dx;  //計(jì)算決策變量
  281.                 while(x0!=x1)
  282.                 {
  283.                         LCD12864_DrawPoint(x0,y0,color);
  284.                         x0+= dx_sym;
  285.                         if(di<0) di+= dy_2;
  286.                         else
  287.                         {
  288.                                 di+= dy_2-dx_2;
  289.                                 y0+= dy_sym;
  290.                         }
  291.                 }
  292.                 LCD12864_DrawPoint(x0,y0,color);
  293.         }
  294.         else
  295.         {
  296.                 di= dx_2-dy;  //計(jì)算決策變量
  297.                 while(y0!=y1)
  298.                 {
  299.                         LCD12864_DrawPoint(x0,y0,color);
  300.                         y0+=dy_sym;
  301.                         if(di<0) di+= dx_2;
  302.                         else
  303.                         {
  304.                                 di+= dx_2-dy_2;
  305.                                 x0= dx_sym;
  306.                         }
  307.                 }
  308.                 LCD12864_DrawPoint(x0,y0,color);
  309.         }
  310. }

  311. /*******************************************************************************
  312. * 函 數(shù) 名         : LCD12864_DrawCircle(畫(huà),圓)
  313. * 函數(shù)功能                     : 在任意位置畫(huà)圓(使用bresenhan算法畫(huà)圓)
  314. * 輸    入         : (x0,y0) 圓心坐標(biāo) r[in] 半徑  color[in] 顏色 黑或白
  315. * 輸    出         : 無(wú)
  316. * 返 回 值         : 無(wú)
  317. *******************************************************************************/
  318. void LCD12864_DrawCircle(unsigned char x0,unsigned char y0,unsigned char r ,bit color) //在任意位置畫(huà)圓
  319. {
  320.         char a=0,b,di; //變量一定要初始化,否則會(huì)出錯(cuò)
  321.         
  322.         if(r > 31 || r==0) return;
  323.         
  324.         b = r;
  325.         di = 3 - 2*r;
  326.         while(a <= b)
  327.         {
  328.                 LCD12864_DrawPoint(x0 - b,y0 - a,color); //3
  329.                 LCD12864_DrawPoint(x0 + b,y0 - a,color); //0
  330.                 LCD12864_DrawPoint(x0 - a,y0 + b,color); //1
  331.                 LCD12864_DrawPoint(x0 - b,y0 - a,color); //7
  332.                 LCD12864_DrawPoint(x0 - a,y0 - b,color); //2
  333.                 LCD12864_DrawPoint(x0 + b,y0 + a,color); //4
  334.                 LCD12864_DrawPoint(x0 + a,y0 - b,color); //5
  335.     LCD12864_DrawPoint(x0 + a,y0 + b,color); //6
  336.                 LCD12864_DrawPoint(x0 - b,y0 + a,color); //8
  337.                
  338.                 a++;
  339.                 if(di < 0) di += 4*a+6;
  340.                 else
  341.                 {
  342.                         di += 10+4*(a-b);
  343.                   b--;
  344.                 }
  345.         LCD12864_DrawPoint(x0 + a,y0 + b,color);        
  346.         }
  347. //        unsigned char xn,yn,xi,yi; //畫(huà)圓  //效果不好
  348. //        unsigned int i;
  349. //        
  350. //        xn = cos(0)*r + x0;
  351. //        yn = sin(0)*r + y0;
  352. //               
  353. //        for(i=0;i<630;i++)
  354. //        {
  355. //                xi = (cos(i*0.01)*r) + x0;
  356. //                yi = (sin(i*0.01)*r) + y0;
  357. //               
  358. //                LCD12864_DrawLine(xn,yn,xi,yi,color);//在一系列零散的點(diǎn)上,兩點(diǎn)兩點(diǎn)之間連線從而得到一條曲線
  359. //               
  360. //                xn = xi;
  361. //                yn = yi;
  362. //        }
  363. }

  364. /*******************************************************************************
  365. * 函 數(shù) 名         : LCD12864_DrawRetic(畫(huà),正方形)
  366. * 函數(shù)功能                     : 畫(huà)正方形
  367. * 輸    入         : (x0,y0) 左上角坐標(biāo) (x1,y1) 右下角坐標(biāo)  color[in] 顏色 黑或白
  368. * 輸    出         : 無(wú)
  369. * 返 回 值         : 無(wú)
  370. *******************************************************************************/
  371. void LCD12864_DrawRetic(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit color) //在任意位置畫(huà)正方形
  372. {
  373.         LCD12864_DrawLine(x0,y0,x0,y1,color);//左豎
  374.         LCD12864_DrawLine(x0,y0,x1,y0,color);//上橫
  375.         LCD12864_DrawLine(x1,y0,x1,y1,color);//右豎
  376.         LCD12864_DrawLine(x0,y1,x1,y1,color);//下橫
  377. }

  378. /*******************************************************************************
  379. * 函 數(shù) 名         : LCD12864_DrawTrigle(畫(huà),三角形)
  380. * 函數(shù)功能                     : 畫(huà)三角形
  381. * 輸    入         : (x0,y0) 頂角坐標(biāo) (x1,y1) 1邊角坐標(biāo)  (x12,y2) 2邊角坐標(biāo) color[in] 顏色 黑或白
  382. * 輸    出         : 無(wú)
  383. * 返 回 值         : 無(wú)
  384. *******************************************************************************/
  385. void LCD12864_DrawTrigle(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,bit color) //在任意位置畫(huà)三角形
  386. {
  387.         LCD12864_DrawLine(x0,y0,x1,y1,color);
  388.         LCD12864_DrawLine(x1,y1,x2,y2,color);
  389.         LCD12864_DrawLine(x2,y2,x0,y0,color);
  390. }


  391. /*******************************************************************************
  392. * 函 數(shù) 名         : LCD12864_ClearScreen
  393. * 函數(shù)功能                     : 在畫(huà)圖模式下,LCD12864的01H命令不能清屏,所以要自己寫(xiě)一個(gè)清
  394. *                  * 屏函數(shù)
  395. * 輸    入         : 無(wú)
  396. * 輸    出         : 無(wú)
  397. * 返 回 值         : 無(wú)
  398. *******************************************************************************/
  399. void LCD12864_ClearScreen()
  400. {
  401.         unsigned char i,j;

  402.         LCD12864_WriteCmd(0x34);          //開(kāi)啟拓展指令集

  403.         for(i=0;i<32;i++)                          //因?yàn)長(zhǎng)CD有縱坐標(biāo)32格所以寫(xiě)三十二次
  404.         {
  405.                 LCD12864_WriteCmd(0x80+i);                  //先寫(xiě)入縱坐標(biāo)Y的值
  406.                 LCD12864_WriteCmd(0x80);                  //再寫(xiě)入橫坐標(biāo)X的值
  407.                 for(j=0;j<32;j++)                  //橫坐標(biāo)有16位,每位寫(xiě)入兩個(gè)字節(jié)的的數(shù)據(jù),也
  408.                 {                                                  //就寫(xiě)入32次以為當(dāng)寫(xiě)入兩個(gè)字節(jié)之后橫坐標(biāo)會(huì)自
  409.                         LCD12864_WriteData(0xFF);          //動(dòng)加1,所以就不用再次寫(xiě)入地址了。
  410.                 }
  411.         }

  412.         LCD12864_WriteCmd(0x36);         //0x36擴(kuò)展指令里面打開(kāi)繪圖顯示
  413.         LCD12864_WriteCmd(0x30);         //恢復(fù)基本指令集
  414. }




  415. /*******************************************************************************
  416. * 函 數(shù) 名         : LCD12864_Delay1ms
  417. * 函數(shù)功能                   : 延時(shí)1MS
  418. * 輸    入         : c
  419. * 輸    出         : 無(wú)
  420. * 返 回 值         : 無(wú)
  421. *******************************************************************************/
  422. void LCD12864_Delay1ms(unsigned int c)
  423. {
  424.     unsigned char a,b;
  425.         for(; c>0; c--)
  426.         {
  427.             for(b=199; b>0; b--)
  428.                 {
  429.                 for(a=1; a>0; a--);
  430.                 }
  431.         }
  432. }

  433. /*******************************************************************************
  434. * 函 數(shù) 名         : LCD12864_mang
  435. * 函數(shù)功能                     : 檢測(cè)LCD是否忙
  436. * 輸    入         : 無(wú)
  437. * 輸    出         : 1或0(1表示不忙,0表示忙)
  438. * 返 回 值         : 無(wú)
  439. *******************************************************************************/
  440. void LCD12864_mang()
  441. {
  442.         unsigned char dat=0,i=0xff;
  443.         
  444.         LCD12864_RW = 1;          //選擇讀取
  445.         LCD12864_RS = 0;           //選擇命令
  446.         LCD12864_IO=0xff;
  447.         do
  448.         {
  449.                 LCD12864_EN = 1;
  450.                 dat=LCD12864_IO;
  451.     LCD12864_EN = 0;
  452.         }
  453.         while((dat&0x80)&&(i--));
  454. }

  455. /*******************************************************************************
  456. * 函 數(shù) 名         : LCD12864_WriteCmd
  457. * 函數(shù)功能                   : 寫(xiě)命令
  458. * 輸    入         : cmd
  459. * 輸    出         : 無(wú)
  460. * 返 回 值         : 無(wú)
  461. *******************************************************************************/

  462. void LCD12864_WriteCmd(unsigned char cmd)
  463. {
  464.   LCD12864_mang();           //檢忙
  465.         LCD12864_RW = 0;     //選擇寫(xiě)入
  466.         LCD12864_RS = 0;     //選擇命令
  467.         LCD12864_IO = cmd;   //放置數(shù)據(jù)
  468.         LCD12864_EN = 1;                 //寫(xiě)時(shí)序
  469.         LCD12864_EN = 0;                                            
  470. }

  471. /*******************************************************************************
  472. * 函 數(shù) 名         : LCD12864_WriteData
  473. * 函數(shù)功能                   : 寫(xiě)數(shù)據(jù)
  474. * 輸    入         : dat
  475. * 輸    出         : 無(wú)
  476. * 返 回 值         : 無(wú)
  477. *******************************************************************************/
  478. void LCD12864_WriteData(unsigned char dat)
  479. {
  480.         LCD12864_mang();           //檢忙

  481.         LCD12864_RW = 0;     //選擇寫(xiě)入
  482.         LCD12864_RS = 1;     //選擇數(shù)據(jù)
  483.         LCD12864_IO = dat;   //放置數(shù)據(jù)
  484.         LCD12864_EN = 1;                   //寫(xiě)時(shí)序
  485.         LCD12864_EN = 0;                                                                    
  486. }

  487. /*******************************************************************************
  488. * 函 數(shù) 名         : LCD12864_ReadData
  489. * 函數(shù)功能                   : 讀取數(shù)據(jù)
  490. * 輸    入         : 無(wú)
  491. * 輸    出         : 讀取到的8位數(shù)據(jù)
  492. * 返 回 值         : 無(wú)
  493. *******************************************************************************/
  494. unsigned char LCD12864_ReadData()
  495. {
  496.         unsigned char dat;

  497.         LCD12864_mang();           //檢忙
  498.         LCD12864_RW = 1;                         //選擇讀取
  499.         LCD12864_RS = 1;       //選擇命令
  500.         LCD12864_EN = 1;
  501.         dat = LCD12864_IO;
  502.         LCD12864_EN = 0;

  503.         return dat;
  504. }



復(fù)制代碼


所有資料51hei提供下載:
LCD12864驅(qū)動(dòng)函數(shù)(并口通信).rar (86.29 KB, 下載次數(shù): 337)
lcd12864驅(qū)動(dòng)程序 st7920(帶字庫(kù)版本).pdf (306.93 KB, 下載次數(shù): 215)



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2018-8-18 23:35 | 只看該作者
樓主能補(bǔ)一下附件嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:434779 發(fā)表于 2019-1-11 11:37 | 只看該作者
先拿來(lái)學(xué)習(xí)一下!
回復(fù)

使用道具 舉報(bào)

地板
ID:617176 發(fā)表于 2019-12-12 10:09 | 只看該作者
不錯(cuò),試試
回復(fù)

使用道具 舉報(bào)

5#
ID:273778 發(fā)表于 2019-12-20 21:28 | 只看該作者
不錯(cuò)的資源,再有串口的就更完美了!!!
回復(fù)

使用道具 舉報(bào)

6#
ID:273778 發(fā)表于 2019-12-20 21:29 | 只看該作者
不錯(cuò)的資源,再有串口的就更完美了
回復(fù)

使用道具 舉報(bào)

7#
ID:235673 發(fā)表于 2020-2-17 22:44 | 只看該作者
不錯(cuò)啊,寫(xiě)的好詳細(xì)
回復(fù)

使用道具 舉報(bào)

8#
ID:94449 發(fā)表于 2020-2-19 18:02 | 只看該作者
12864版本怎么看?我這塊背面寫(xiě)的是JHD529M1 12864F,能用樓主的程序嗎?
回復(fù)

使用道具 舉報(bào)

9#
ID:73758 發(fā)表于 2020-2-23 12:14 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

10#
ID:284075 發(fā)表于 2020-3-30 19:37 來(lái)自手機(jī) | 只看該作者
這是我 發(fā)表于 2020-2-19 18:02
12864版本怎么看?我這塊背面寫(xiě)的是JHD529M1 12864F,能用樓主的程序嗎?

應(yīng)該可以的
回復(fù)

使用道具 舉報(bào)

11#
ID:274536 發(fā)表于 2020-4-10 19:45 | 只看該作者
謝謝樓主,學(xué)習(xí)學(xué)習(xí)。
回復(fù)

使用道具 舉報(bào)

12#
ID:726712 發(fā)表于 2020-4-11 08:36 來(lái)自手機(jī) | 只看該作者
謝謝樓主,寫(xiě)的很好,不錯(cuò)
回復(fù)

使用道具 舉報(bào)

13#
ID:622370 發(fā)表于 2020-4-25 12:41 | 只看該作者
學(xué)習(xí)學(xué)習(xí),感謝分享
回復(fù)

使用道具 舉報(bào)

14#
ID:224782 發(fā)表于 2020-5-23 00:26 | 只看該作者
這跟P幾口有關(guān)系?P0口為啥不能用??我用P0口就可以啊,是沒(méi)上拉吧。。。。。。
回復(fù)

使用道具 舉報(bào)

15#
ID:628841 發(fā)表于 2020-5-29 01:36 | 只看該作者
太好看了
回復(fù)

使用道具 舉報(bào)

16#
ID:149799 發(fā)表于 2020-5-29 09:33 | 只看該作者
感謝上傳
回復(fù)

使用道具 舉報(bào)

17#
ID:86450 發(fā)表于 2020-5-29 14:34 | 只看該作者
學(xué)習(xí)學(xué)習(xí),感謝分享
回復(fù)

使用道具 舉報(bào)

18#
ID:138443 發(fā)表于 2020-5-31 09:23 | 只看該作者
支持一下。謝謝
回復(fù)

使用道具 舉報(bào)

19#
ID:796531 發(fā)表于 2021-8-4 16:31 | 只看該作者
好東西,正在學(xué)習(xí)這個(gè)屏幕的使用
回復(fù)

使用道具 舉報(bào)

20#
ID:145357 發(fā)表于 2024-1-4 21:53 | 只看該作者
正在學(xué)習(xí)這個(gè)屏幕的使用
回復(fù)

使用道具 舉報(bào)

21#
ID:5485 發(fā)表于 2024-8-26 23:15 | 只看該作者
可以移植成串口吧
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 夜夜艹天天干 | 欧美日韩一区二区三区不卡视频 | 国产激情在线观看 | 日本高清视频在线播放 | 自拍偷拍3p | 欧美日韩一二三区 | 国产免费又色又爽又黄在线观看 | 久久久www成人免费无遮挡大片 | 奇米久久久 | 免费大黄视频 | 在线观看精品视频网站 | 黄色在线免费看 | 最新中文字幕在线 | 日本人做爰大片免费观看一老师 | 九九亚洲 | 在线视频91 | 欧美视频免费 | 国产精品自拍视频 | 久久r久久 | 中文字幕一区二区在线观看 | 午夜欧美一区二区三区在线播放 | 亚洲视频在线看 | 日韩中文字幕在线观看视频 | 成年人在线观看 | 日韩视频在线一区 | 女同久久另类99精品国产 | 久久亚洲精品国产精品紫薇 | 久久大全 | 精品一区二区视频 | 日本一区二区电影 | 日韩精品一区二区三区中文字幕 | 99热这里都是精品 | 日韩欧美黄色 | 亚洲国产69| 久久久成人动漫 | 精品在线99 | 欧美日韩中文字幕 | 天天爽夜夜操 | 丁香六月伊人 | 日韩国产一区 | av大片在线 |