找回密码
 立即注册

QQ登录

只需一步,快速开始

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

lcd12864液晶驱动 画点 画线 写入7*5像素数字 汉字

  [复制链接]
跳转到指定楼层
楼主

下载:
12864b-资料.zip (2.75 MB, 下载次数: 74)





主程序:
  1. #include <reg52.h>
  2. #include <math.h>
  3. #include <INTRINS.H>

  4. #define  uchar unsigned char
  5. #define  uint unsigned int

  6. #define          DataPort P0
  7. #define         DELAYMS 80

  8. sbit RS_Port        =        P1^0;
  9. sbit RW_Port        =        P1^1;
  10. sbit E_Port            =   P2^5;
  11. sbit PSB_Port        =        P1^2;
  12. sbit RST_Port        =        P1^4;

  13. xchar CorpInf[]=
  14. {
  15.         "自定义的汉字数组"
  16.         "自定义的汉字数组"
  17.         "自定义的汉字数组"
  18.         "自定义的汉字数组"
  19. };

  20. //用来显示数字0-9,每个数字7行*5列,将一竖排储存为一个字节,最高位为0
  21. unsigned char xdata ucxFigure[10][5]=
  22. {
  23.         {0x3E,0x51,0x49,0x45,0x3E},//0
  24.         {0x00,0x42,0x7F,0x40,0x00},//1
  25.         {0x42,0x61,0x51,0x49,0x46},//2
  26.         {0x21,0x41,0x45,0x2B,0x31},//3
  27.         {0x18,0x14,0x12,0x7F,0x10},//4
  28.         {0x27,0x45,0x45,0x45,0x39},//5
  29.         {0x3C,0x4A,0x49,0x49,0x30},//6
  30.         {0x01,0x71,0x09,0x05,0x03},//7
  31.         {0x36,0x49,0x49,0x49,0x36},//8
  32.         {0x06,0x49,0x49,0x29,0x1E},//9
  33. };

  34. /*******************************************************
  35. * 函 数 名:void delay(uchar uc_dly)
  36. * 功能描述:短延时函数
  37. * 函数说明:用于弥补MPU和单片机在执行时序上的差异
  38. * 输入参数:(1)uchar ui_dly
  39. * 返 回 值:无
  40. *******************************************************/
  41. #pragma disable  //在函数前声明,只对一个函数有效,该函数在调用过程中将不可被中断。
  42. void delay(uint ui_dly)
  43. {
  44.         while (ui_dly--);
  45. }

  46. /*******************************************************
  47. * 函 数 名:void delays()
  48. * 功能描述:长延时函数
  49. * 函数说明:测试时两画面之间的延时
  50. * 输入参数:无
  51. * 返 回 值:无
  52. *******************************************************/
  53. #pragma disable
  54. void delays()
  55. {
  56.         uchar uc_dly,uc_dly1,uc_dly2;

  57.         uc_dly =DELAYMS;
  58.        
  59.         while (uc_dly --)
  60.         {
  61.                 for (uc_dly1=0;uc_dly1<50;uc_dly1++)
  62.                         for (uc_dly2=0;uc_dly2<50;uc_dly2++);
  63.         };
  64. }
  65. /*******************************************************
  66. * 函 数 名:void rdbf(void)
  67. * 功能描述:读忙状态
  68. * 函数说明:读忙状态
  69. * 输入参数:无
  70. * 返 回 值:无
  71. *******************************************************/
  72. void rdbf(void)        
  73. {
  74.         unsigned int nTimeOut = 0 ;
  75.     RS_Port=0;
  76.     RW_Port=1;
  77.     E_Port=0;
  78.     E_Port=1;
  79.     while( ( DataPort & 0x80 ) && ( ++nTimeOut != 0 ) ) ;
  80.     E_Port=0;
  81.     RS_Port=0;
  82.     RW_Port=1;
  83. }

  84. /*******************************************************
  85. * 函 数 名:void wr_cmd(uchar cmd)
  86. * 功能描述:写指令
  87. * 函数说明:往12864b写指令
  88. * 输入参数:uchar cmd
  89. * 返 回 值:无
  90. *******************************************************/
  91. #pragma disable
  92. void wr_cmd(uchar cmd)
  93. {
  94.         rdbf();
  95.         RS_Port=0;
  96.         RW_Port=0;
  97.         E_Port=1;
  98.         DataPort=cmd;
  99.         E_Port=0;
  100. }

  101. /*******************************************************
  102. * 函 数 名:void wr_dat(uchar dat)
  103. * 功能描述:写数据
  104. * 函数说明:往12864b写数据
  105. * 输入参数:uchar dat
  106. * 返 回 值:无
  107. *******************************************************/
  108. #pragma disable
  109. void wr_dat(uchar dat)
  110. {       
  111.         rdbf();
  112.         RS_Port=1;
  113.         RW_Port=0;
  114.         E_Port=1;
  115.         DataPort=dat;
  116.         E_Port=0;
  117. }

  118. /*******************************************************
  119. * 函 数 名:unsigned char rd_dat( void )
  120. * 功能描述:读数据
  121. * 函数说明:从12864b读数据
  122. * 输入参数:无
  123. * 返 回 值:unsigned char byReturnValue
  124. *******************************************************/
  125. #pragma disable
  126. unsigned char rd_dat( void )  
  127. {
  128.     unsigned char byReturnValue ;
  129.     DataPort = 0xff ;
  130.         rdbf();
  131.         RS_Port=1;
  132.         RW_Port=1;
  133.         E_Port=0;
  134.         E_Port=1;
  135.     byReturnValue = DataPort ;
  136.         E_Port=0;
  137.     return byReturnValue ;   
  138. }

  139. /*******************************************************
  140. * 函 数 名:void DrawPoint( unsigned char X, unsigned char Y, unsigned char Color )
  141. * 功能描述:画点
  142. * 函数说明:在制定位置画一个像素的点
  143. * 输入参数:unsigned char X, unsigned char Y, unsigned char Color
  144. *          X为列,Y为行,COLOR为不显示、显示或者翻转(0、1、2)
  145. * 返 回 值:无
  146. *******************************************************/
  147. void DrawPoint( unsigned char X, unsigned char Y, unsigned char Color )
  148. {
  149.     unsigned char Row , Tier , Tier_bit    ;
  150.     unsigned char ReadOldH, ReadOldL ;
  151.         Tier = X >> 4 ;   
  152.     Tier_bit = X & 0x0f ;
  153.     if( Y < 32 )
  154.     {
  155.         Row = Y ;
  156.     }
  157.     else
  158.     {
  159.         Row = Y - 32 ;
  160.         Tier += 8 ;
  161.     }
  162.         wr_cmd(Row + 0x80);                //写入行坐标
  163.         wr_cmd(Tier + 0x80);        //写入列坐标
  164.         rd_dat();
  165.     ReadOldH = rd_dat() ;         //读出原始数据
  166.     ReadOldL = rd_dat() ;
  167.         wr_cmd(Row + 0x80);
  168.         wr_cmd(Tier + 0x80);
  169.     if( Tier_bit < 8 )
  170.     {
  171.         switch( Color)
  172.         {
  173.             case 0 : ReadOldH &=( ~( 0x01 << ( 7 - Tier_bit ))) ; break ;        //不显示
  174.             case 1 : ReadOldH |= ( 0x01 << ( 7 - Tier_bit )) ; break ;                //显示
  175.             case 2 : ReadOldH ^= ( 0x01 << ( 7 - Tier_bit ))    ; break ;   //翻转
  176.             default : break ;   
  177.         }
  178.                 wr_dat(ReadOldH);  //写入新数据
  179.                 wr_dat(ReadOldL);
  180.     }
  181.     else
  182.     {
  183.         switch(Color)
  184.         {
  185.             case 0 : ReadOldL &= (~( 0x01 << ( 15 - Tier_bit ))) ; break ;
  186.             case 1 : ReadOldL |= ( 0x01 << ( 15 - Tier_bit ))    ; break ;
  187.             case 2 : ReadOldL ^= ( 0x01 << ( 15 - Tier_bit )) ; break ;
  188.             default : break ;
  189.         }
  190.                 wr_dat(ReadOldH);
  191.                 wr_dat(ReadOldL);
  192.     }
  193. }

  194. /*******************************************************
  195. * 函 数 名:void DrawFigure( unsigned char X, unsigned char Y, unsigned char Figure )
  196. * 功能描述:在制定位置画数字,7*5个像素点
  197. * 函数说明:在制定位置画数字
  198. * 输入参数:unsigned char X, unsigned char Y, unsigned char Color
  199. *          X为列,Y为行,Figure为待显示的数字
  200. * 返 回 值:无
  201. *******************************************************/
  202. void DrawFigure( unsigned char X, unsigned char Y, unsigned char Figure )
  203. {
  204.         unsigned char i=0,j=0;
  205.         for(j=0;j<5;j++)
  206.         {
  207.                 for(i=0;i<7;i++)
  208.                 {
  209.                         DrawPoint(X+i,Y-j,(ucxFigure[Figure][j]>>i)&0x01);
  210.                 }
  211.         }
  212. }
  213. /*******************************************************
  214. * 函 数 名:void DrawLineX( unsigned char X0, unsigned char X1, unsigned char Y, unsigned char Color )
  215. * 功能描述:画一条水平线
  216. * 函数说明:在制定位置画一条水平线
  217. * 输入参数:unsigned char X0, unsigned char X1, unsigned char Y, unsigned char Color
  218. *          X0列的起始位置,X1列的终止位置,Y行位置,COLOR
  219. * 返 回 值:无
  220. *******************************************************/
  221. void DrawLineX( unsigned char X0, unsigned char X1, unsigned char Y, unsigned char Color )
  222. {    unsigned char Temp ;
  223.     if( X0 > X1 )
  224.     {
  225.         Temp = X1 ;
  226.         X1 = X0 ;
  227.         X0 = Temp ;
  228.     }
  229.     for( ; X0 <= X1 ; X0++ )
  230.     DrawPoint( X0, Y, Color ) ;   
  231. }

  232. /*******************************************************
  233. * 函 数 名:void DrawLineY( unsigned char X, unsigned char Y0, unsigned char Y1, unsigned char Color )
  234. * 功能描述:画一条垂直线
  235. * 函数说明:在制定位置画一条垂直线
  236. * 输入参数:unsigned char X, unsigned char Y0, unsigned char Y1, unsigned char Color
  237. *          X列位置,Y0行的起始位置,Y1行的终止位置,COLOR
  238. * 返 回 值:无
  239. *******************************************************/
  240. void DrawLineY( unsigned char X, unsigned char Y0, unsigned char Y1, unsigned char Color )
  241. {
  242.     unsigned char Temp ;
  243.     if( Y0 > Y1 )
  244.     {
  245.         Temp = Y1 ;
  246.         Y1 = Y0 ;
  247.         Y0 = Temp ;
  248.     }
  249.     for(; Y0 <= Y1 ; Y0++)
  250.     DrawPoint( X, Y0, Color);
  251. }

  252. /*******************************************************
  253. * 函 数 名:void DrawLine( unsigned char StartX, unsigned char StartY, unsigned char EndX, unsigned char EndY, unsigned char Color )
  254. * 功能描述:画一条任意的线
  255. * 函数说明:在起点,终点之间画一条直线
  256. * 输入参数:unsigned char StartX, unsigned char StartY, unsigned char EndX, unsigned char EndY, unsigned char Color
  257. * 返 回 值:无
  258. *******************************************************/
  259. void DrawLine( unsigned char StartX, unsigned char StartY, unsigned char EndX, unsigned char EndY, unsigned char Color )
  260. {
  261.     int t, distance;      /*根据屏幕大小改变变量类型(如改为int型)*/
  262.     int x = 0 , y = 0 , delta_x, delta_y ;
  263.     char incx, incy ;
  264.     delta_x = EndX - StartX ;
  265.     delta_y = EndY - StartY ;
  266.     if( delta_x > 0 )
  267.     {
  268.         incx = 1;
  269.     }
  270.     else if( delta_x == 0 )
  271.     {
  272.         DrawLineY( StartX, StartY, EndY, Color ) ;
  273.         return ;
  274.     }
  275.     else
  276.     {
  277.         incx = -1 ;
  278.     }
  279.     if( delta_y > 0 )
  280.     {
  281.         incy = 1 ;
  282.     }
  283.     else if(delta_y == 0 )
  284.     {
  285.         DrawLineX( StartX, EndX, StartY, Color ) ;   
  286.         return ;
  287.     }
  288.     else
  289.     {
  290.         incy = -1 ;
  291.     }
  292.     delta_x = abs( delta_x );   
  293.     delta_y = abs( delta_y );
  294.     if( delta_x > delta_y )
  295.     {
  296.         distance = delta_x ;
  297.     }
  298.     else
  299.     {
  300.         distance = delta_y ;
  301.     }
  302.     DrawPoint( StartX, StartY, Color ) ;   
  303.     /* Draw Line*/
  304.     for( t = 0 ; t <= distance+1 ; t++ )
  305.     {
  306.         DrawPoint( StartX, StartY, Color ) ;
  307.         x += delta_x ;
  308.         y += delta_y ;
  309.         if( x > distance )
  310.         {
  311.             x -= distance ;
  312.             StartX += incx ;
  313.         }
  314.         if( y > distance )
  315.         {
  316.             y -= distance ;
  317.             StartY += incy ;
  318.         }
  319.     }
  320. }

  321. /*******************************************************
  322. * 函 数 名:void DisGBStr(xchar *CorpInf)
  323. * 功能描述:文本显示
  324. * 函数说明:写入汉字
  325. * 输入参数:xchar *CorpInf
  326. * 返 回 值:无
  327. *******************************************************/
  328. void DisGBStr(unsigned char code *CorpInf)
  329. {
  330.         uchar uc_GBCnt;

  331.         wr_cmd(0x30);         //DL=1:8-BIT interface
  332.         wr_cmd(0x30);         //RE=0:basic instruction
  333.         wr_cmd(0x0C);         //Display ON,Cursor OFF,Cursor position blink OFF 。整体显示开,光标及其设置关。

  334.         wr_cmd(0x80);

  335.         for (uc_GBCnt=0;uc_GBCnt<16;uc_GBCnt++)
  336.         {
  337.                 wr_dat(CorpInf[2 * uc_GBCnt]);
  338.                 wr_dat(CorpInf[2 * uc_GBCnt + 1]);
  339.         };
  340.         wr_cmd(0x90);
  341.         for (uc_GBCnt=0;uc_GBCnt<16;uc_GBCnt++)
  342.         {
  343.                 wr_dat(CorpInf[2 * uc_GBCnt + 32]);
  344.                 wr_dat(CorpInf[2 * uc_GBCnt + 33]);
  345.         };
  346.         delays();
  347. }

  348. /*******************************************************
  349. * 函 数 名:void Cram_Off()
  350. * 功能描述:清除文本显示
  351. * 函数说明:清除文本显示
  352. * 输入参数:无
  353. * 返 回 值:无
  354. *******************************************************/
  355. void Cram_Off(void)
  356. {
  357.         wr_cmd(0x30);         //DL=1:8-BIT interface
  358.         wr_cmd(0x30);         //RE=0:basic instruction
  359.         wr_cmd(0x08);        //Display OFF,Cursor OFF,Cursor position blink OFF
  360.         wr_cmd(0x01);         //CLEAR
  361.         delay(250);
  362. }

  363. /*******************************************************
  364. * 函 数 名:void Clr_GDRAM(void)
  365. * 功能描述:清除绘图显示
  366. * 函数说明:清除绘图显示
  367. * 输入参数:无
  368. * 返 回 值:无
  369. *******************************************************/
  370. void Clr_GDRAM(void)
  371. {
  372.         uchar x,y;
  373.         for(y=0;y<64;y++)
  374.                 for(x=0;x<16;x++)
  375.                 {
  376.                         wr_cmd(0x34);
  377.                         wr_cmd(0x36);//开显示
  378.                         wr_cmd(y+0x80);
  379.                         wr_cmd(x+0x80);
  380.                         wr_dat(0x00);
  381.                         wr_dat(0x00);
  382.                 }
  383. }

  384. /*******************************************************
  385. * 函 数 名:void Lcd_Init(void)
  386. * 功能描述:12864初始化
  387. * 函数说明:初始化
  388. * 输入参数:无
  389. * 返 回 值:无
  390. *******************************************************/
  391. void Lcd_Init(void)
  392. {
  393.         PSB_Port =1;//并行接口
  394.         _nop_();
  395.         _nop_();

  396.         RST_Port =0;
  397.         delay(250);
  398.         delay(250);
  399.         delay(250);
  400.         delay(250);
  401.        
  402.         RST_Port =1;
  403.         delay(250);
  404.         delay(250);
  405.         delay(250);
  406.         delay(250);


  407.         wr_cmd(0x30);         //DL=1:8-BIT interface。功能设定,RE=0,基本指令集
  408.         wr_cmd(0x30);         //RE=0:basic instruction
  409.         wr_cmd(0x06);         //Entire display shift right by 1。光标右移

  410.         Cram_Off();                //清空文本显示
  411.         Clr_GDRAM();        //清空绘图显示
  412.        
  413. }


复制代码

     为大家提供一份12864的程序,是我花了很长时间根据网上程序精简而成,比网上的版本运行速度快了很多,并增加部分功能及注释,很稳定好用,希望能帮到大家。       包含了如下功能:   
    ①在任意位置画一个像素点
    ②画一条任意长度的水平/垂直线
    ③画一条任意线
    ④写入汉字
    ⑤在任意位置写入7*5个像素点的数字(0-9)

    用12864时,需要了解一点,写汉字和绘图是两个分开的功能!在说明文档里一个叫文本显示,一个叫绘图,它俩使用的RAM也不一样,一个是DDRAM,一个是GDRAM,使用时的相关命令及地址也都是不同的,包括清屏,也得分开清除。再有一点是,不知道是不是我的12864有些问题,个别汉字显示错误,比如我写的“过”,它显示的就是“梗”。

评分

参与人数 1黑币 +5 收起 理由
zhaok2013 + 5 很给力!

查看全部评分

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

使用道具 举报

沙发
ID:96326 发表于 2017-3-6 08:04 | 只看该作者
感谢分享!
回复

使用道具 举报

板凳
ID:168525 发表于 2017-3-6 13:15 | 只看该作者
谢谢分享
回复

使用道具 举报

地板
ID:68356 发表于 2017-3-6 13:52 | 只看该作者
感谢楼主分享
回复

使用道具 举报

5#
ID:61876 发表于 2017-3-6 14:49 | 只看该作者
非常感谢!!!!
回复

使用道具 举报

6#
ID:151348 发表于 2017-3-6 15:38 | 只看该作者
谢谢分享,有值得借鉴的地方,不过DrawLine函数似乎不太好,推荐用Bresenham法来生成直线
回复

使用道具 举报

7#
ID:64765 发表于 2017-5-17 10:11 | 只看该作者
好资料,下载学习了,谢谢分享。
回复

使用道具 举报

8#
ID:220385 发表于 2017-7-17 19:59 | 只看该作者
请问楼主,为什么,在高八位写哪一点,第八位就会写哪一点,高低是连体的吗
回复

使用道具 举报

9#
ID:324286 发表于 2018-5-7 16:09 | 只看该作者
很好,谢谢楼主,最近正在找这个资料呢,希望有帮助
回复

使用道具 举报

10#
ID:320230 发表于 2018-5-8 14:29 | 只看该作者
感谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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