找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7777|回复: 19
打印 上一主题 下一主题
收起左侧

lcd12864驱动程序带字库版本ST7920,内含简单的画点、线、圆、矩形和三角形函数

  [复制链接]
跳转到指定楼层
楼主
ID:284075 发表于 2018-8-18 20:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  LCD12864驱动程序     带字库版本ST7920,内含简单的画点、线、圆、矩形和三角形函数以及任意尺寸图像显示。

单片机源程序如下:
  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,"爱你 ");
  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. /*--  调入了一幅图像:C:\Users\zhans\Pictures\Saved Pictures\我.bmp  --*/
  30. /*--  宽度x高度=71x64  --*/
  31. /*--  宽度不是8的倍数,现调整为:宽度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. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
  1. //--------------------------------------------------------//
  2. //功能 :LCD12864驱动程序(带字库)
  3. //
  4. //--------------------[ZSX];QQ:1543588107-----------------//
  5. //--------------------------------------------------------//
  6. #include "lcd12864.h"
  7. //#include <math.h>


  8. /*******************************************************************************
  9. * 函 数 名         : LCD12864_Init
  10. * 函数功能                     : 初始化LCD12864
  11. * 输    入         : 无
  12. * 输    出         : 无
  13. * 返 回 值         : 无
  14. *******************************************************************************/
  15. void LCD12864_Init()
  16. {
  17.   LCD12864_RST = 1;
  18.         LCD12864_RST = 0;          //复位
  19.   LCD12864_RST = 1;
  20.         
  21. //        LCD12864_WriteCmd(0x20);  //4位数据 选择基本指令操作 关绘图
  22.         LCD12864_WriteCmd(0x30);  //8位数据 选择基本指令操作 关绘图
  23.         
  24.         LCD12864_WriteCmd(0x0c);  //显示开 关光标 不允许游标位置反白
  25. //        LCD12864_WriteCmd(0x0e);  //显示开 开光标 不允许游标位置反白
  26. //        LCD12864_WriteCmd(0x0d);  //显示开 关光标 允许游标位置反白
  27. //        LCD12864_WriteCmd(0x0f);  //显示开 开光标 允许游标位置反白
  28.                
  29. //        LCD12864_WriteCmd(0x04);  //读取与写入时游标向左移 地址自减1 显示画面整体不位移
  30.         LCD12864_WriteCmd(0x06);  //读取与写入时游标向右移 地址自加1 显示画面整体不位移
  31.         
  32. //        LCD12864_WriteCmd(0x10);  //游标向左移动
  33. //        LCD12864_WriteCmd(0x14);  //游标向右移动
  34.         
  35.         LCD12864_GDRAMInit();
  36.         
  37.         LCD12864_WriteCmd(0x01);  //清屏且地址归位
  38. }


  39. /*******************************************************************************
  40. * 函 数 名         : LCD12864_Display
  41. * 函数功能                     : 在基本指令模式下设置显示坐标。注意:y是设置行,x是设置列
  42. * 输    入         : x[in]列0~8 , y[in]行0~3 , Dat[in] 显示数据
  43. * 输    出         : 无
  44. * 返 回 值         : 无
  45. *******************************************************************************/
  46. void LCD12864_Display(unsigned char x, unsigned char y, unsigned char *Dat)  //x[in]行0~3, y[in]列0~8, Dat[in] 显示数据
  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. //检测字符结束符('\0') 等同于 while(*Dat !='\0');   注:只有字符串才有结束符'\0',单个字符
  61.         while(*Dat) LCD12864_WriteData(*Dat++);
  62. }

  63. /*******************************************************************************
  64. * 函 数 名         : LCD12864_GDRAMInit
  65. * 函数功能                     : 初始化GDRAM
  66. * 输    入         : 无
  67. * 输    出         : 无
  68. * 返 回 值         : 无
  69. * 说    明         :
  70. *******************************************************************************/
  71. void LCD12864_GDRAMInit()   //初始化GDRAM
  72. {
  73.         unsigned char x,y;
  74.   for(y=0;y<64;y++)//64列 每行写16个8字节取模数据
  75.           for(x=0;x<16;x++)
  76.            {
  77.                          LCD12864_WriteCmd(0x34);          //开启拓展指令集 关绘图
  78.                          LCD12864_WriteCmd(0x80+y);        //先写列地址
  79.                          LCD12864_WriteCmd(0x80+x);        //再写行地址
  80.                          LCD12864_WriteCmd(0x30);          //开启基本指令集 关绘图
  81.                          LCD12864_WriteData(0x00);
  82.                          LCD12864_WriteData(0x00);
  83.            }
  84. }


  85. /*******************************************************************************
  86. * 函 数 名         : LCD12864_Drawing(画图)
  87. * 函数功能                     : 在任意位置显示任意比例图片
  88. * 输    入         : (x,y)[in] 显示起始点    *img[in] 图片显示数据
  89. * 输    出         : 无
  90. * 返 回 值         : 无
  91. * 说    明         :图像取模方式为横向取模,取模后的数据要在加上图像的显示比例
  92.                                                                                  例如:uchar a[]={128,64,图像数据};
  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,每行字节数
  99.         xa=x>>4;      //起始行地址
  100.         xb=x&0x0f;    //起始行偏移地址
  101.         
  102.         for(yi=y;yi<(img[1]+y);yi++) //确定图片的显示区域
  103.         {
  104.                 LCD12864_WriteCmd(0x34);//开启拓展指令集 关绘图
  105.                
  106.                 if(yi<32)   //显示图片上下半屏选择(地址调整)
  107.                  {
  108.                   LCD12864_WriteCmd(0x80+yi);        //先写列地址
  109.                         LCD12864_WriteCmd(0x80+xa);        //再写行地址
  110.                  }
  111.                 else
  112.                  {
  113.                         LCD12864_WriteCmd(0x80+yi-32);//先写列地址
  114.                         LCD12864_WriteCmd(0x88+xa);          //再写行地址
  115.                  }
  116.                
  117.                 LCD12864_WriteCmd(0x30);          //开启基本指令集 关绘图
  118.                
  119.                 if(xb>=8) //起始行偏移地址
  120.      {
  121.                   LCD12864_WriteData(0x00); //偏移超过8位时,则在第一字节位置补零
  122.                   LCD12864_WriteData(img[(yi-y)*xi+2]>>(xb-8)); //依据xb(起始行偏移地址)对图像重新编码
  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));//依据xb(起始行偏移地址)对图像重新编码
  126.                         
  127.                         LCD12864_WriteData((unsigned int)(img[(yi-y)*xi+xi+1])<<(16-xb));//依据xb(起始行偏移地址)对图像重新编码
  128.                  }
  129.                 else
  130.      {
  131.                   LCD12864_WriteData(img[(yi-y)*xi+2]>>xb);//依据xb(起始行偏移地址)对图像重新编码
  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);//依据xb(起始行偏移地址)对图像重新编码
  135.                         
  136.                         LCD12864_WriteData((unsigned int)(img[(yi-y)*xi+xi+1])<<(8-xb));//依据xb(起始行偏移地址)对图像重新编码
  137.                  }
  138.         }

  139.          LCD12864_WriteCmd(0x36);          //开启基本指令集 开绘图
  140. }


  141. /*******************************************************************************
  142. * 函 数 名         : LCD12864_DrawPoint(画,点)
  143. * 函数功能                     : 在任意位置描点
  144. * 输    入         : x[in] 0~127 水平坐标  y[in] 0~63 垂直坐标  color[in] 颜色 黑或白
  145. * 输    出         : 无
  146. * 返 回 值         : 无
  147. *******************************************************************************/
  148. void LCD12864_DrawPoint(unsigned char x,unsigned char y,bit color) //在任意位置描点   x[in] 0~128 水平坐标  y[in] 0~64 垂直坐标  color[in] 颜色 黑或白
  149. {
  150.         unsigned char seat,spot;  //位置,点
  151.         unsigned char Htmp,Ltmp;
  152.         
  153.         LCD12864_WriteCmd(0x36);  //开启基本指令集 开绘图
  154.         
  155.         seat = x >> 4;   //得出水平位置地址(高4位就是位置地址)
  156.         spot = x & 0x0f; //得出点在水平位置地址的哪个地址(低4位就是点的位置)
  157.         
  158.         if(y >= 32){y-=32;seat+=8;}  //大于32时,切换到下屏
  159.         
  160.         LCD12864_WriteCmd(0x80+y);      //先写垂直方向地址,指定在哪一行
  161.         LCD12864_WriteCmd(0x80+seat);   //再写水平方向地址,指定在某一行具体地址
  162.         
  163.         LCD12864_ReadData();  //空读一个数据,LCD必先假读一次后才能正确读出数据
  164.         
  165.         Htmp = LCD12864_ReadData();
  166.         Ltmp = LCD12864_ReadData();     //读完之后地址指针会改变,所以要重新写一次地址
  167.         
  168.         LCD12864_WriteCmd(0x80+y);      //先写垂直方向地址,指定在哪一行
  169.         LCD12864_WriteCmd(0x80+seat);   //再写水平方向地址,指定在某一行具体地址

  170.         if(color) //描黑点
  171.         {
  172.                 if(spot < 8) Htmp |= (1<<(7-spot));  //数据都是高位在前,即高位最靠近坐标(0,0)
  173.                 else Ltmp |= (1<<(15-spot));
  174.         }
  175.         else      //描白点
  176.         {
  177.                 if(spot < 8) Htmp &= ~(1<<(7-spot));  //数据都是高位在前,即高位最靠近坐标(0,0)
  178.                 else Ltmp &= ~(1<<(15-spot));
  179.         }
  180.         
  181.         LCD12864_WriteData(Htmp);  //写入数据
  182.         LCD12864_WriteData(Ltmp);
  183.         LCD12864_WriteCmd(0x30);  //开启基本指令集
  184. }


  185. /*******************************************************************************
  186. * 函 数 名         : LCD12864_DrawLine_X(画,线)
  187. * 函数功能                     : 在任意位置描水平线
  188. * 输    入         : (x0,y0) 起始坐标  x1[in] 垂直坐标  color[in] 颜色 黑或白
  189. * 输    出         : 无
  190. * 返 回 值         : 无
  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. * 函 数 名         : LCD12864_DrawLine_Y(画,线)
  211. * 函数功能                     : 在任意位置描竖线
  212. * 输    入         : (x0,y0) 起始坐标  y1[in] 垂直坐标  color[in] 颜色 黑或白
  213. * 输    出         : 无
  214. * 返 回 值         : 无
  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. * 函 数 名         : LCD12864_DrawLine(画,线)
  234. * 函数功能                     : 在任意位置描任意线(插值法)
  235. * 输    入         : (x0,y0) 起始坐标 (x1,y1) 终点坐标  color[in] 颜色 黑或白
  236. * 输    出         : 无
  237. * 返 回 值         : 无
  238. * 说    明         :有bug.只能画某些直线。
  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;        //求两点间的差值
  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 为零 表示画直线
  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 为零 表示画直线
  268.                         return;
  269.                 }
  270.         }
  271.         
  272.         dx= dx_sym*dx;  //dx,dy的取绝对值
  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;  //计算决策变量
  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;  //计算决策变量
  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. * 函 数 名         : LCD12864_DrawCircle(画,圆)
  313. * 函数功能                     : 在任意位置画圆(使用bresenhan算法画圆)
  314. * 输    入         : (x0,y0) 圆心坐标 r[in] 半径  color[in] 颜色 黑或白
  315. * 输    出         : 无
  316. * 返 回 值         : 无
  317. *******************************************************************************/
  318. void LCD12864_DrawCircle(unsigned char x0,unsigned char y0,unsigned char r ,bit color) //在任意位置画圆
  319. {
  320.         char a=0,b,di; //变量一定要初始化,否则会出错
  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; //画圆  //效果不好
  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);//在一系列零散的点上,两点两点之间连线从而得到一条曲线
  359. //               
  360. //                xn = xi;
  361. //                yn = yi;
  362. //        }
  363. }

  364. /*******************************************************************************
  365. * 函 数 名         : LCD12864_DrawRetic(画,正方形)
  366. * 函数功能                     : 画正方形
  367. * 输    入         : (x0,y0) 左上角坐标 (x1,y1) 右下角坐标  color[in] 颜色 黑或白
  368. * 输    出         : 无
  369. * 返 回 值         : 无
  370. *******************************************************************************/
  371. void LCD12864_DrawRetic(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit color) //在任意位置画正方形
  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. * 函 数 名         : LCD12864_DrawTrigle(画,三角形)
  380. * 函数功能                     : 画三角形
  381. * 输    入         : (x0,y0) 顶角坐标 (x1,y1) 1边角坐标  (x12,y2) 2边角坐标 color[in] 颜色 黑或白
  382. * 输    出         : 无
  383. * 返 回 值         : 无
  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) //在任意位置画三角形
  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. * 函 数 名         : LCD12864_ClearScreen
  393. * 函数功能                     : 在画图模式下,LCD12864的01H命令不能清屏,所以要自己写一个清
  394. *                  * 屏函数
  395. * 输    入         : 无
  396. * 输    出         : 无
  397. * 返 回 值         : 无
  398. *******************************************************************************/
  399. void LCD12864_ClearScreen()
  400. {
  401.         unsigned char i,j;

  402.         LCD12864_WriteCmd(0x34);          //开启拓展指令集

  403.         for(i=0;i<32;i++)                          //因为LCD有纵坐标32格所以写三十二次
  404.         {
  405.                 LCD12864_WriteCmd(0x80+i);                  //先写入纵坐标Y的值
  406.                 LCD12864_WriteCmd(0x80);                  //再写入横坐标X的值
  407.                 for(j=0;j<32;j++)                  //横坐标有16位,每位写入两个字节的的数据,也
  408.                 {                                                  //就写入32次以为当写入两个字节之后横坐标会自
  409.                         LCD12864_WriteData(0xFF);          //动加1,所以就不用再次写入地址了。
  410.                 }
  411.         }

  412.         LCD12864_WriteCmd(0x36);         //0x36扩展指令里面打开绘图显示
  413.         LCD12864_WriteCmd(0x30);         //恢复基本指令集
  414. }




  415. /*******************************************************************************
  416. * 函 数 名         : LCD12864_Delay1ms
  417. * 函数功能                   : 延时1MS
  418. * 输    入         : c
  419. * 输    出         : 无
  420. * 返 回 值         : 无
  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. * 函 数 名         : LCD12864_mang
  435. * 函数功能                     : 检测LCD是否忙
  436. * 输    入         : 无
  437. * 输    出         : 1或0(1表示不忙,0表示忙)
  438. * 返 回 值         : 无
  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. * 函 数 名         : LCD12864_WriteCmd
  457. * 函数功能                   : 写命令
  458. * 输    入         : cmd
  459. * 输    出         : 无
  460. * 返 回 值         : 无
  461. *******************************************************************************/

  462. void LCD12864_WriteCmd(unsigned char cmd)
  463. {
  464.   LCD12864_mang();           //检忙
  465.         LCD12864_RW = 0;     //选择写入
  466.         LCD12864_RS = 0;     //选择命令
  467.         LCD12864_IO = cmd;   //放置数据
  468.         LCD12864_EN = 1;                 //写时序
  469.         LCD12864_EN = 0;                                            
  470. }

  471. /*******************************************************************************
  472. * 函 数 名         : LCD12864_WriteData
  473. * 函数功能                   : 写数据
  474. * 输    入         : dat
  475. * 输    出         : 无
  476. * 返 回 值         : 无
  477. *******************************************************************************/
  478. void LCD12864_WriteData(unsigned char dat)
  479. {
  480.         LCD12864_mang();           //检忙

  481.         LCD12864_RW = 0;     //选择写入
  482.         LCD12864_RS = 1;     //选择数据
  483.         LCD12864_IO = dat;   //放置数据
  484.         LCD12864_EN = 1;                   //写时序
  485.         LCD12864_EN = 0;                                                                    
  486. }

  487. /*******************************************************************************
  488. * 函 数 名         : LCD12864_ReadData
  489. * 函数功能                   : 读取数据
  490. * 输    入         : 无
  491. * 输    出         : 读取到的8位数据
  492. * 返 回 值         : 无
  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. }



复制代码


所有资料51hei提供下载:
LCD12864驱动函数(并口通信).rar (86.29 KB, 下载次数: 312)
lcd12864驱动程序 st7920(带字库版本).pdf (306.93 KB, 下载次数: 200)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏14 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-8-18 23:35 | 只看该作者
楼主能补一下附件吗?
回复

使用道具 举报

板凳
ID:434779 发表于 2019-1-11 11:37 | 只看该作者
先拿来学习一下!
回复

使用道具 举报

地板
ID:617176 发表于 2019-12-12 10:09 | 只看该作者
不错,试试
回复

使用道具 举报

5#
ID:273778 发表于 2019-12-20 21:28 | 只看该作者
不错的资源,再有串口的就更完美了!!!
回复

使用道具 举报

6#
ID:273778 发表于 2019-12-20 21:29 | 只看该作者
不错的资源,再有串口的就更完美了
回复

使用道具 举报

7#
ID:235673 发表于 2020-2-17 22:44 | 只看该作者
不错啊,写的好详细
回复

使用道具 举报

8#
ID:94449 发表于 2020-2-19 18:02 | 只看该作者
12864版本怎么看?我这块背面写的是JHD529M1 12864F,能用楼主的程序吗?
回复

使用道具 举报

9#
ID:73758 发表于 2020-2-23 12:14 | 只看该作者
感谢分享
回复

使用道具 举报

10#
ID:284075 发表于 2020-3-30 19:37 来自手机 | 只看该作者
这是我 发表于 2020-2-19 18:02
12864版本怎么看?我这块背面写的是JHD529M1 12864F,能用楼主的程序吗?

应该可以的
回复

使用道具 举报

11#
ID:274536 发表于 2020-4-10 19:45 | 只看该作者
谢谢楼主,学习学习。
回复

使用道具 举报

12#
ID:726712 发表于 2020-4-11 08:36 来自手机 | 只看该作者
谢谢楼主,写的很好,不错
回复

使用道具 举报

13#
ID:622370 发表于 2020-4-25 12:41 | 只看该作者
学习学习,感谢分享
回复

使用道具 举报

14#
ID:224782 发表于 2020-5-23 00:26 | 只看该作者
这跟P几口有关系?P0口为啥不能用??我用P0口就可以啊,是没上拉吧。。。。。。
回复

使用道具 举报

15#
ID:628841 发表于 2020-5-29 01:36 | 只看该作者
太好看了
回复

使用道具 举报

16#
ID:149799 发表于 2020-5-29 09:33 | 只看该作者
感谢上传
回复

使用道具 举报

17#
ID:86450 发表于 2020-5-29 14:34 | 只看该作者
学习学习,感谢分享
回复

使用道具 举报

18#
ID:138443 发表于 2020-5-31 09:23 | 只看该作者
支持一下。谢谢
回复

使用道具 举报

19#
ID:796531 发表于 2021-8-4 16:31 | 只看该作者
好东西,正在学习这个屏幕的使用
回复

使用道具 举报

20#
ID:145357 发表于 2024-1-4 21:53 | 只看该作者
正在学习这个屏幕的使用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表