找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机驱动lcd12864液晶绘图功能程序+仿真

  [复制链接]
跳转到指定楼层
楼主
本帖最后由 jiujiu 于 2014-12-18 01:07 编辑

在连续多天拜读了 51hei论坛 多位前辈的程序下。这几天终于把12864绘图功能搞懂了,其中最让我迷惑的就是它XY坐标的确定,后来才知道12864规定先写入垂直Y坐标,再写入水平X坐标,具体的讲解我都写到word文档里面了,先秀图。。


  
液晶的背光我关掉了,所以看着有点暗,因为白天拍的,加上背光根本就看不清楚,祝大家学习愉快再补几张带背光的。。。。。

刚刚学会了用12864绘图,就随便整理一下,供大家参考。之前使用12864都是使用字库来显示东西,感觉太简单,相信很多人也是这么认为。决定学习绘图功能后,我就开始在网上找文档,找资料,遗憾的是上面都是一笔略过,特别是绘图时X,Y坐标的确定,让我一头雾水。。。。。


上面是我从网上一篇文档上截取的一段,前面说在确定坐标值时要连续写入两字节的数据,但是这里它说错一点——12864在绘图时,要先输入垂直坐标即Y轴坐标,再输入水平X坐标,这是12864本身规定的。下面还要明确一点就是12864屏幕显示与坐标地址的对应关系。。。
    0x80                                                 0x8f
X


Y
上半屏和下半屏的地址就是这样子,其中水平X以16位即两个字节为一个地址,垂直Y轴以一位(bit)为一个地址。
上面左半边的就是和12864显示屏上半屏对应的,右半边是和12864显示屏下半屏对应的,这样我们在确定XY坐标的时候就清楚多了。看一段程序:

在进行上下半屏地址转换的时候,垂直Y坐标都是从0x80开始加,而水平X坐标在上半屏是从0x80加,在下半屏从0x88开始加。我的图像显示处理程序:
//------------在任意位置开始显示图画------------------
void LCD12864_set_tu(uchar X,uchar Y,uchar *tu,uchar wide,uchar high)
{         //Y确定开始行,X确定列(0-7),tu是点阵字模数据
         uint hang,lie;
         write_12864cmd(extra_cmd);//打开扩展指令集
         write_12864cmd(tu_off);//绘图显示关
         if(wide%8==0) wide=wide/8;
         else wide=wide/8+1;
       for(hang=0;hang<high;hang++)
        {
                   if(Y+hang>31)                          //上下屏地址转换
                  {
                           write_12864cmd(0x80+Y+hang-32);//先写Y轴坐标
                         write_12864cmd(0x88+X);//再写X轴坐标  ,(0x88-0x8f)
                  }                                                        //这里X只需写(0-7)
                  else
                  {
                           write_12864cmd(0x80+Y+hang);//先写Y轴坐标
                         write_12864cmd(0x80+X);//再写X轴坐标  ,(0x80-0x87)
                  }
                  for(lie=0;lie<wide;lie++) 根据列宽逐行写入数据
                  {                                                                           //宽占几字节,就写几字节
                            write_12864dat(tu[hang*wide+lie]);//每行写入wide个字节数据
                  }                  
         
       }
         write_12864cmd(tu_on);//绘图显示开
         write_12864cmd(com_cmd);//回到基本指令集
}
上面的XY是自己设置图画显示的起始行和起始列,由于一个水平地址是占两个字节,所以X只能是0到7,所以要根据自己的图画宽度合理设置。
这些明白之后,大家就可以自己试着写程序,显示一些图画了。下面我再讲一下,液晶的取模软件

这个软件我一直是用在给点阵取模的,后来才知道它也可以取图片字模,供液晶显示。只需要点击“打开图像图标”,就可以选择bmp格式的图片打开。但是怎么获得bmp格式的图片呢,我在网上下了这个软件:
  装上这个软件之后,打开界面如下

在旁边设置成单色,像素设成128X64,输出格式设成bmp就行了,然后就可以随便把一张jpg图片保存成bmp格式的了。
等把绘图掌握了,大家也可以继续深究一下,写一些画曲线,直方图,椭圆等的绘图函数,就这么多了,祝大家学习愉快
            ^—^

临走之际秀一张图片....




12864仿真文件.rar

7.22 KB, 下载次数: 423, 下载积分: 黑币 -5

12864绘图程序.rar

1.2 MB, 下载次数: 402, 下载积分: 黑币 -5

评分

参与人数 4黑币 +18 收起 理由
大概发送到 + 5
ddwade3 + 3 很给力!
zhaok2013 + 5 很给力!
ssfc + 5 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:70650 发表于 2014-12-18 01:03 | 只看该作者
主程序文件:
  1. #include "LCD12864.h"
  2. sbit k1=P3^0;
  3. uchar xuanze;
  4. uchar tab1_zhen[]="甄";
  5. uchar tab1_zi[]="子";
  6. uchar tab1_dan[]="丹";                         
  7. uchar code tab2[]={
  8.                           0x00,0x00,0x18,0x30,0x24,0x48,0x02,0x80,
  9.                           0x07,0xC0,0x07,0xC0,0x1F,0xF0,0x1F,0xF0,
  10.               0x13,0x90,0x1F,0xF0,0x1F,0xF0,0x1E,0xF0,
  11.                           0x1F,0xF0,0x17,0xD0,0x17,0xD0,0x03,0x80
  12.                          };
  13. uchar code tab3[]={
  14. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  15. 0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  16. 0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x18,0x0C,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
  17. 0x01,0xFF,0x80,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x13,0x10,0x03,0xFE,0x00,
  18. 0x03,0xFF,0xC0,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x3F,0x30,0x1F,0xFF,0xC0,
  19. 0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,0x8C,0x03,0xF0,0x00,0x7F,0xE0,0x7C,0x01,0xE0,
  20. 0x03,0xFF,0xF0,0x00,0x00,0x00,0x01,0x36,0x06,0xC0,0x00,0x5F,0xC0,0xFF,0xFC,0x60,
  21. 0x01,0xFF,0xF0,0x00,0x00,0x00,0x02,0x1B,0x0F,0x80,0x00,0xFF,0x01,0xFE,0x0F,0x30,
  22. 0x00,0xEF,0xF0,0x00,0x00,0x00,0x02,0x6D,0x9F,0x00,0x00,0x3E,0x03,0xFF,0xF1,0x90,
  23. 0x00,0xFF,0xF8,0x00,0x00,0x00,0x04,0x36,0xFE,0x00,0x01,0xFF,0x07,0xFF,0xFC,0x90,
  24. 0x00,0xEF,0xFF,0xFF,0x80,0x00,0x04,0xDB,0x7E,0x00,0x03,0xFF,0x87,0xFF,0xFC,0xD0,
  25. 0x00,0x0F,0xFF,0xFF,0xC0,0x00,0x04,0x6D,0xFC,0x00,0x07,0xFF,0x8F,0xFF,0xFE,0x50,
  26. 0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x36,0xFC,0x10,0x07,0xFF,0x8F,0xFF,0xFE,0x90,
  27. 0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x1B,0xF8,0x10,0x07,0xFF,0xCF,0xFF,0xFE,0x80,
  28. 0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x04,0x0F,0xF8,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,
  29. 0x00,0x07,0xFF,0xFF,0xF0,0x00,0x04,0x07,0xF0,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,
  30. 0x00,0xFF,0xFF,0xFF,0xF8,0x00,0x02,0x03,0xF0,0x20,0x07,0xFF,0xFF,0xFF,0xBA,0x00,
  31. 0x00,0xFD,0xFF,0xFF,0xFC,0x00,0x02,0x03,0xF0,0x20,0x03,0xFF,0xFF,0xDF,0xB8,0x00,
  32. 0x00,0xC1,0xC0,0x3F,0xFC,0x00,0x01,0x01,0xE0,0x40,0x00,0xFF,0xFF,0xDF,0xB0,0x00,
  33. 0x00,0x81,0xC0,0x3F,0xCE,0x00,0x00,0x81,0xE0,0x80,0x00,0x7F,0xFF,0xDF,0xA0,0x00,
  34. 0x00,0x81,0x80,0x1D,0xCF,0x00,0x00,0x41,0xE1,0x00,0x00,0x3F,0xFF,0x9B,0x00,0x00,
  35. 0x01,0x83,0x80,0x1F,0xC7,0x80,0x00,0x21,0xE2,0x00,0x00,0x1F,0xFD,0xB6,0x00,0x00,
  36. 0x01,0xC3,0x00,0x0E,0xE6,0x80,0x00,0x19,0xEC,0x00,0x00,0x07,0xFE,0x20,0x00,0x00,
  37. 0x00,0xC3,0x00,0x07,0x67,0x40,0x00,0x07,0xF0,0x00,0x00,0x03,0x3E,0x00,0x00,0x00,
  38. 0x00,0x02,0x00,0x03,0xE7,0xA0,0x00,0x00,0x00,0x00,0x00,0x02,0x8E,0x00,0x00,0x00,
  39. 0x00,0x06,0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,
  40. 0x00,0x06,0x00,0x07,0x03,0x00,0x77,0x46,0x74,0x24,0x80,0x06,0x04,0x00,0x00,0x00,
  41. 0x00,0x1C,0x00,0x06,0x00,0x00,0x55,0x45,0x54,0x57,0x80,0x00,0x00,0x00,0x00,0x00,
  42. 0x00,0x1C,0x00,0x0E,0x00,0x00,0x45,0x45,0x74,0x57,0x80,0x08,0x00,0x00,0x00,0x00,
  43. 0x00,0x00,0x00,0x1C,0x00,0x00,0x55,0x45,0x44,0x74,0x80,0xF0,0x00,0x00,0x00,0x00,
  44. 0x00,0x00,0x00,0x38,0x00,0x00,0x77,0x76,0x47,0x54,0x80,0x00,0x00,0x00,0x00,0x00,
  45. 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  46. };          //128X32
  47. uchar code tab4[]={
  48. 0xFF,0xC1,0xF0,0x2E,0x7A,0x3F,0xBF,0xFF,0xFF,0x00,0x70,0xFF,0xF7,0x00,0xF0,0x02,
  49. 0x80,0x02,0x03,0xF0,0x1E,0x00,0x20,0x97,0xFE,0x00,0xFC,0x11,0x40,0x01,0x01,0xF0,
  50. 0x3E,0x00,0x21,0x83,0xFE,0x70,0xFE,0xB8,0x40,0x00,0x80,0x3E,0x7E,0x00,0x38,0x03,
  51. 0xFF,0xF8,0xFE,0xBE,0x41,0x80,0x40,0x0F,0xFC,0x05,0x71,0x93,0xFF,0xF9,0xFC,0x70,
  52. 0x08,0xC0,0x10,0x01,0xFC,0x7F,0x7F,0xFF,0xFF,0xFD,0xDC,0x10,0x00,0x00,0x08,0x00,
  53. 0x7F,0x2F,0xFF,0xE3,0xFF,0xFF,0xDD,0x01,0x10,0x08,0x10,0x01,0xFF,0x06,0x0F,0xE3,
  54. 0xFF,0xFF,0xFE,0x04,0x00,0x60,0x38,0x03,0xE0,0xF0,0x00,0x03,0xFF,0xFF,0xFF,0x80,
  55. 0x08,0x22,0x48,0x06,0x00,0x7B,0x05,0x83,0xFC,0x3F,0xFF,0xC0,0x31,0x01,0x88,0x04,
  56. 0x00,0x0F,0x0B,0xE3,0xFE,0x1B,0x3F,0xF0,0x7C,0x1F,0xF0,0x18,0x00,0x07,0x83,0xF7,
  57. 0xFE,0x1F,0x7F,0xF8,0x03,0xFF,0xFE,0x38,0x00,0x07,0x31,0xF7,0xFF,0x67,0xFF,0xF0,
  58. 0x3F,0xFF,0xFC,0x30,0x00,0x03,0x00,0xFF,0xFF,0x17,0xFF,0xF6,0x3F,0xFF,0xFE,0xE0,
  59. 0x00,0x01,0x80,0x7F,0xEF,0x77,0xFF,0xFB,0x1F,0xFF,0xFF,0xFF,0xFC,0x00,0x01,0x0F,
  60. 0xE7,0xFE,0xFF,0xF7,0x8F,0xE0,0x3F,0xE1,0xFC,0x00,0x01,0x1F,0xE7,0xEE,0x1F,0xFB,
  61. 0xDF,0xC0,0x1F,0xE0,0x7F,0x80,0x00,0x07,0xFF,0xFD,0x07,0xFF,0xBF,0xC0,0x0F,0x80,
  62. 0x3F,0xC0,0x00,0x03,0xE3,0xFE,0x03,0xFF,0xFF,0xE0,0x0F,0x9C,0x1F,0xF0,0x00,0x03,
  63. 0xF7,0xF9,0x02,0xFF,0xFF,0xE0,0x7F,0xFF,0xCF,0xF0,0x00,0x03,0xFF,0xF9,0x02,0x7F,
  64. 0xFF,0xFD,0xE7,0xFF,0xFF,0xF0,0x00,0x03,0xCF,0xFF,0x80,0x3F,0xFF,0xFC,0xF3,0x7F,
  65. 0xE7,0xF0,0x00,0x03,0xFF,0xFF,0x80,0x07,0xFF,0x38,0x43,0x1F,0xF7,0xF0,0x00,0x07,
  66. 0xFF,0xFF,0xC0,0x00,0x3E,0x00,0x03,0x0F,0xF9,0xF0,0x00,0x0F,0xFF,0xFF,0x00,0x00,
  67. 0x0F,0x00,0x02,0x07,0xF8,0xE0,0x00,0x1F,0xFF,0xFE,0x00,0x1F,0x1F,0xC0,0x00,0x03,
  68. 0xFE,0x40,0x00,0x7F,0xFF,0xFF,0x00,0x47,0x2B,0xC7,0x80,0x01,0xF0,0x00,0x01,0xFF,
  69. 0xFF,0xFF,0xF9,0xEB,0xFF,0xC0,0x00,0x00,0xF0,0x00,0x01,0xFF,0xFF,0xFF,0x00,0x7B,
  70. 0x0F,0xE7,0x00,0x00,0x3F,0x80,0x01,0xFF,0xFF,0xFD,0x00,0xF6,0x3F,0xFF,0x83,0xC0,
  71. 0x1F,0xF0,0x00,0x7F,0xBF,0xFC,0x02,0x3E,0x1F,0xFF,0x03,0x80,0x0F,0xFE,0xC0,0x03,
  72. 0xFF,0xFE,0x00,0xBE,0x1F,0x7F,0x1E,0x00,0x01,0x8F,0xF8,0x03,0xFF,0xFF,0x80,0x27,
  73. 0x67,0x7F,0x38,0x00,0x00,0x1F,0x3E,0x03,0xC7,0xFF,0xC1,0x71,0xEC,0x3F,0x70,0x00,
  74. 0x00,0x9F,0x30,0x03,0xE8,0xFF,0xFE,0xF9,0xFC,0x3F,0xC0,0x00,0x00,0x1F,0x02,0x03,
  75. 0xDC,0xFF,0xFF,0xFF,0xE8,0x3F,0x80,0x00,0x00,0x1F,0x02,0x07,0xE0,0xFF,0xFF,0xFF,
  76. 0xF8,0x1F,0x00,0x00,0x01,0x1F,0x00,0x07,0xF8,0xFF,0xFF,0xFF,0xF8,0x1F,0x00,0x00,
  77. 0x01,0x3F,0x00,0x07,0xEE,0xFF,0xFE,0x3F,0xF8,0x1E,0x00,0x00,0x01,0x3E,0x00,0x03,
  78. 0xE0,0x1F,0xFF,0x4F,0xF8,0x3C,0x00,0x00,0x00,0xFE,0x00,0x0F,0xCC,0x0F,0xFF,0xF9,
  79. 0xF0,0x38,0x00,0x00,0x00,0x7C,0x04,0xB3,0xDB,0x4F,0xFF,0xF9,0xC0,0x70,0x00,0x00,
  80. 0x00,0x00,0x00,0x03,0xF8,0xF3,0xFF,0xFF,0xC0,0x60,0x00,0x00,0x00,0x00,0x01,0x63,
  81. 0xE0,0x01,0xFF,0xFF,0xE0,0x60,0x00,0x00,0x00,0x00,0x07,0xFF,0x9F,0xC0,0x3F,0xFF,
  82. 0xE0,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0xBF,0xE6,0x1F,0xFF,0x80,0x00,0x00,0x00,
  83. 0x00,0x00,0x0E,0x03,0xBF,0xE8,0x1F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x20,0x0F,0x83,
  84. 0xFF,0xF9,0x1F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x60,0x2F,0xC3,0xFF,0xF0,0x17,0xFF,
  85. 0xE0,0x00,0x00,0x00,0x00,0x70,0x07,0xC3,0xFF,0xFC,0x00,0xFF,0xE0,0x00,0x00,0x00,
  86. 0x00,0x70,0x07,0xE3,0xBF,0xFD,0x86,0x3F,0xF0,0x00,0x00,0x00,0x00,0x40,0x0F,0x0F,
  87. 0xFF,0xFB,0x8F,0xBF,0xF0,0x00,0x00,0x00,0x00,0x40,0x0F,0x9F,0xFF,0xFE,0x47,0x1F,
  88. 0xF0,0x00,0x00,0x00,0x00,0x40,0x1F,0xFF,0xFF,0xFF,0x1E,0x00,0x30,0x00,0x00,0x00,
  89. 0x00,0xC0,0x1F,0xFF,0xBF,0xFC,0xEF,0xE0,0x00,0x00,0x00,0x00,0x00,0xC2,0x0F,0xFF,
  90. 0x8F,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0xC3,0x1F,0xFF,0x83,0xFF,0xFF,0xF8,
  91. 0x80,0x00,0x00,0x00,0x00,0x8F,0x1E,0xFF,0x80,0xFF,0xE0,0xFE,0x10,0x00,0x00,0x00,
  92. 0x01,0x8E,0x1F,0xFF,0xE0,0x3F,0xF0,0x7F,0xF8,0x00,0x00,0x00,0x01,0x8F,0x1F,0xFF,
  93. 0xE0,0x3F,0xEF,0xFF,0xFC,0x00,0x00,0x00,0x01,0x9E,0x3F,0x7F,0xEC,0xFF,0xFF,0xFF,
  94. 0xFC,0x00,0x00,0x00,0x01,0xAE,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  95. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
  96. };         //96X64
  97. uchar code tab5_1[]="白日依山尽,";
  98. uchar code tab5_2[]="黄河入海流。";
  99. uchar code tab5_3[]="欲穷千里目,";
  100. uchar code tab5_4[]="更上一层楼。";
  101. void keyscan()
  102. {
  103.          if(k1==0)
  104.          {
  105.                    delay_1ms(10);
  106.                   while(k1==0);
  107.                   xuanze=(xuanze+1)%4;
  108.                   if(xuanze!=0||xuanze!=3) write_12864cmd(0x01);  //清屏,这里的清屏是为了去掉“甄子丹”三个字
  109.               delay_1ms(5);                                                   //以便下副图的显示不受影响
  110.                   huitu_clear();
  111.          }

  112. }
  113. void main()
  114. {
  115.          LCD12864_init();
  116.          huitu_clear();
  117.          while(1)
  118.          {
  119.                   switch(xuanze)
  120.                   {
  121.                          case 0:       
  122.                                   set_LCD12864_pos(0,6);//x确定行,y确定起始位置
  123.                                   write_12864str(tab1_zhen);delay_1ms(1);
  124.                                   set_LCD12864_pos(1,6);
  125.                                   write_12864str(tab1_zi); delay_1ms(1);
  126.                                   set_LCD12864_pos(2,6);
  127.                                   write_12864str(tab1_dan);delay_1ms(1);//甄子丹 写完
  128.                                   LCD12864_set_tu(0,0,tab4,96,64);
  129.                                   while(xuanze==0) keyscan(); //这里是为了让程序停在这,显示画面不会闪
  130.                                   break;
  131.                          case 1:
  132.                                    LCD12864_set_tu(0,0,tab2,16,16);
  133.                                   while(xuanze==1) keyscan(); //
  134.                               break;
  135.                          case 2:
  136.                                    LCD12864_set_tu(0,0,tab3,128,32);
  137.                                   while(xuanze==2) keyscan(); //
  138.                               break;
  139.                          case 3:       
  140.                                   set_LCD12864_pos(0,1);
  141.                                   write_12864str(tab5_1);delay_1ms(1);
  142.                                   set_LCD12864_pos(1,1);
  143.                                   write_12864str(tab5_2); delay_1ms(1);
  144.                                   set_LCD12864_pos(2,1);
  145.                                   write_12864str(tab5_3);delay_1ms(1);
  146.                                   set_LCD12864_pos(3,1);
  147.                                   write_12864str(tab5_4);delay_1ms(1);
  148.                                   while(xuanze==3) keyscan(); //
  149.                               break;
  150.                   }
  151.                   
  152.          }

  153. }
复制代码
回复

使用道具 举报

板凳
ID:70650 发表于 2014-12-18 01:04 | 只看该作者
LCD12864.c文件
  1. #include "LCD12864.h"
  2. #include <intrins.h>
  3. //----------延时--------------
  4. void delay_1ms(uint x)
  5. {
  6.          uchar i,j;
  7.          for(j=0;j<x;j++)
  8.          for(i=0;i<110;i++);
  9.        
  10. }
  11. //--------------忙检测------------------
  12. void busy_check()
  13. {
  14.         uchar i=255;
  15.         P0=0xff;                //数据口置高
  16.         LCD12864_RS=0;LCD12864_RW=1; //读取状态
  17.         LCD12864_E=1;      //使能LCD
  18.         while((i--)&&P0&0x80);//检测数据口最高位状态,为0空闲
  19.         LCD12864_E=0;
  20. }
  21. //--------写指令----------
  22. void write_12864cmd(uchar cmd)
  23. {
  24.         busy_check();
  25.         LCD12864_RS=0;
  26.         LCD12864_RW=0;
  27.         LCD12864_E=0;
  28.         LCD12864_data=cmd;
  29.         delay_1ms(5);
  30.         LCD12864_E=1;
  31.         delay_1ms(5);
  32.         LCD12864_E=0;
  33. }
  34. //-------写数据-----------
  35. void write_12864dat(uchar dat)
  36. {
  37.         busy_check();
  38.         LCD12864_RS=1;
  39.         LCD12864_RW=0;
  40.         LCD12864_E=0;
  41.         LCD12864_data=dat;
  42.         delay_1ms(5);
  43.         LCD12864_E=1;
  44.         delay_1ms(5);
  45.         LCD12864_E=0;       
  46. }
  47. //------设定显示位置------------
  48. void set_LCD12864_pos(uchar x,uchar y)
  49. {
  50.         uchar pos;
  51.         if(x==0) x=0x80;
  52.         if(x==1) x=0x90;
  53.         if(x==2) x=0x88;
  54.         if(x==3) x=0x98;
  55.         pos=x+y;
  56.         write_12864cmd(pos); //地址
  57. }
  58. //------------写字符串----------------
  59. void write_12864str(uchar *s)
  60. {
  61.         while(*s)
  62.         {
  63.                 write_12864dat(*s);
  64.                 s++;
  65.                 delay_1ms(1);
  66.         }

  67. }
  68. //----------------------绘点---------------------
  69. /*void LCD12864_set_dot(uchar X,uchar Y)
  70. {
  71.         uchar X_byte,X_bit;           //横坐标的哪一字节,哪一位
  72.         uchar Y_byte,Y_bit;           //纵坐标的哪一字节,哪一位
  73.         X_byte=X/16;                  //算出地址,因为地址是16位的
  74.         X_bit=X%16;                          //算出在哪一个位

  75.         Y_byte=Y/32;                 //确定是在上半屏还是在下半屏
  76.                                                 //0——上半屏        1——下半屏
  77.         Y_bit=Y%32;                        //确定在哪一行
  78.         write_12864cmd(extra_cmd);//打开扩展指令集
  79.         write_12864cmd(tu_off);//绘图关
  80.         write_12864cmd(0x80+Y_bit);//先写垂直地址(Y),这是12864规定的
  81.         write_12864cmd(0x80+Y_byte*8+X_byte); //再写水平坐标,Y_byte*8确定了是
  82.                                                                                  //         上半屏还是下半屏
  83.         if(X_bit<8)                                                         //输入地址时,XY都从0开始
  84.         {
  85.                  write_12864dat(0x80>>(X_bit));        //高字节
  86.                  write_12864dat(0x00);                        //低字节
  87.         }
  88.         else
  89.         {
  90.                  write_12864dat(0x00);                        //高字节
  91.                  write_12864dat(0x80>>(X_bit-8));        //低字节
  92.         }
  93.         write_12864cmd(tu_on);//绘图开
  94.         write_12864cmd(com_cmd);//回到基本指令集
  95. }  */
  96. //------------------------------在任意位置开始显示图画-----------------------------
  97. void LCD12864_set_tu(uchar X,uchar Y,uchar *tu,uchar wide,uchar high)
  98. {         //Y确定开始行,X确定水平地址(0x80-0x87),tu是点阵字模数据
  99.          uint hang,lie;
  100.          write_12864cmd(extra_cmd);//打开扩展指令集
  101.          write_12864cmd(tu_off);//绘图显示关
  102.          if(wide%8==0) wide=wide/8;
  103.          else wide=wide/8+1;
  104.          for(hang=0;hang<high;hang++)
  105.          {
  106.                    if(Y+hang>31)                          //上下屏地址转换
  107.                   {
  108.                            write_12864cmd(0x80+Y+hang-32);//先写Y轴坐标
  109.                          write_12864cmd(0x88+X);//再写X轴坐标  ,(0x88-0x8f)
  110.                   }                                                        //这里X只需写(0-7)
  111.                   else
  112.                   {
  113.                            write_12864cmd(0x80+Y+hang);//先写Y轴坐标
  114.                          write_12864cmd(0x80+X);//再写X轴坐标  ,(0x80-0x87)
  115.                   }
  116.                   for(lie=0;lie<wide;lie++)                           //根据列宽逐行写入数据
  117.                   {                                                                           //宽占几字节,就写几字节
  118.                             write_12864dat(tu[hang*wide+lie]);//每行写入wide个字节数据
  119.                   }                  
  120.           
  121.          }
  122.          write_12864cmd(tu_on);//绘图显示开
  123.          write_12864cmd(com_cmd);//回到基本指令集


  124. }
  125. //------------------------------------------------
  126. void huitu_clear()
  127. {
  128.         uchar i,j,k;
  129.         busy_check();
  130.         write_12864cmd(extra_cmd);//打开扩展指令集
  131.         write_12864cmd(tu_on);//绘图开
  132.         for(i=0;i<2;i++)
  133.         {
  134.                  for(j=0;j<32;j++)
  135.                  {
  136.                           busy_check();
  137.                          write_12864cmd(0x80+j);  //写Y坐标
  138.                          _nop_();
  139.                          if(i==0) {write_12864cmd(0x80);_nop_();} //写X坐标
  140.                          else {write_12864cmd(0x88);_nop_();}          //下半屏
  141.                          for(k=0;k<16;k++)
  142.                          {
  143.                                   busy_check();
  144.                                  write_12864dat(0x00);
  145.                                  _nop_();
  146.                          }
  147.                          
  148.                          
  149.                  }
  150.        
  151.         }
  152.         write_12864cmd(com_cmd);//回到基本指令集
  153. }
  154. //-----------初始化------------------
  155. void LCD12864_init()
  156. {
  157.         LCD12864_PSB=1;// 并口方式
  158.         LCD12864_RES=1;
  159.         write_12864cmd(com_cmd); //基本指令集
  160.         delay_1ms(5);
  161.         write_12864cmd(0x0c); //显示开,关光标
  162.         delay_1ms(5);
  163.         write_12864cmd(0x06); //光标的移动方向
  164.         delay_1ms(5);
  165.         write_12864cmd(0x01);  //清屏
  166.         delay_1ms(5);
  167. }
复制代码
回复

使用道具 举报

地板
ID:70650 发表于 2014-12-18 01:05 | 只看该作者
LCD12864.h文件:
  1. #ifndef        _LCD12864_H_
  2. #define        _LCD12864_H_
  3. #include <reg52.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. //-----端口定义------------
  7. #define LCD12864_data P0
  8. sbit    LCD12864_RS =P2^0;
  9. sbit    LCD12864_RW =P2^1;
  10. sbit    LCD12864_E = P2^2;
  11. sbit    LCD12864_PSB=P2^3;
  12. sbit    LCD12864_RES=P2^5;
  13. //-------------------------
  14. extern void delay_1ms(uint x);
  15. extern void set_LCD12864_pos(uchar x,uchar y);//x确定行,y确定起始位置
  16. extern void LCD12864_init();
  17. extern void write_12864cmd(uchar cmd);
  18. //extern void write_12864dat(uchar dat);
  19. extern void write_12864str(uchar *s);
  20. //extern void LCD12864_set_dot(uchar X,uchar Y);//Y确定行,X确定列
  21. extern void huitu_clear();
  22. extern void LCD12864_set_tu(uchar X,uchar Y,uchar *tu,uchar wide,uchar high);
  23. //------------------------------------------
  24. #define com_cmd 0x30   // 基本指令
  25. #define extra_cmd 0x34        //扩展指令,关绘图显示
  26. #define tu_on 0x36                // 扩展指令,开绘图显示
  27. #define tu_off 0x34                // 关绘图显示





  28. #endif
复制代码
回复

使用道具 举报

5#
ID:71262 发表于 2014-12-28 14:39 | 只看该作者
学习了
回复

使用道具 举报

6#
ID:70172 发表于 2014-12-31 22:39 | 只看该作者
仿真里怎么练12864都没画啊
回复

使用道具 举报

7#
ID:6540 发表于 2015-11-14 11:51 | 只看该作者
下重复了 可惜我的黑币呀
回复

使用道具 举报

8#
ID:81035 发表于 2015-11-15 20:36 | 只看该作者
下的文件不对呀?
回复

使用道具 举报

9#
ID:96682 发表于 2015-12-3 10:17 | 只看该作者
还可以,只是图片显示上还是留一手。
回复

使用道具 举报

10#
ID:113491 发表于 2016-5-31 17:24 | 只看该作者
不错,好东东!~
回复

使用道具 举报

11#
ID:94489 发表于 2016-7-22 10:23 | 只看该作者
谢谢楼主
回复

使用道具 举报

12#
ID:142035 发表于 2016-10-9 14:21 | 只看该作者
谢谢楼主的分享
回复

使用道具 举报

13#
ID:140057 发表于 2016-10-24 21:18 | 只看该作者
感觉被黑了,仿真里没画12864
回复

使用道具 举报

14#
ID:155502 发表于 2016-12-17 21:47 | 只看该作者
谢谢楼主的分享
回复

使用道具 举报

15#
ID:74112 发表于 2017-2-19 19:32 | 只看该作者
感觉被黑了,仿真里没画12864  下了才知道
回复

使用道具 举报

16#
ID:162968 发表于 2017-3-3 19:59 | 只看该作者

谢谢楼主的分享
回复

使用道具 举报

17#
ID:171746 发表于 2017-3-18 19:57 | 只看该作者
下来学习学习
回复

使用道具 举报

18#
ID:172742 发表于 2017-3-19 15:22 | 只看该作者
666好厉害
回复

使用道具 举报

19#
ID:137629 发表于 2017-4-10 07:45 | 只看该作者
谢谢楼主。。。。。。
回复

使用道具 举报

20#
ID:99779 发表于 2017-8-4 16:55 | 只看该作者
仿真不能用
回复

使用道具 举报

21#
ID:137883 发表于 2017-8-17 18:22 | 只看该作者
加五分
回复

使用道具 举报

22#
ID:162491 发表于 2017-9-27 09:19 | 只看该作者
51黑有你更精彩
回复

使用道具 举报

23#
ID:297280 发表于 2018-3-26 15:06 | 只看该作者
看出来可是
回复

使用道具 举报

24#
ID:296556 发表于 2018-3-26 22:57 | 只看该作者
很给力学习一下
回复

使用道具 举报

25#
ID:234782 发表于 2018-4-20 13:17 | 只看该作者
能把12864库元件给共享吗
回复

使用道具 举报

26#
ID:423490 发表于 2018-11-9 11:45 | 只看该作者
很好用
回复

使用道具 举报

27#
ID:372237 发表于 2019-8-11 10:47 | 只看该作者
感谢楼主分享
回复

使用道具 举报

28#
ID:605686 发表于 2019-10-16 22:59 | 只看该作者
楼主好人啊,活两百岁!
      write_12864cmd(extra_cmd);//打开扩展指令集
        write_12864cmd(tu_off);//绘图关
我正愁没看到extra_cmd,tu_off的声明赋值,原来在头文件里了

学习了
回复

使用道具 举报

29#
ID:558833 发表于 2019-10-17 20:09 | 只看该作者
讲的好,感谢分享
回复

使用道具 举报

30#
ID:747335 发表于 2020-5-10 22:10 | 只看该作者
wc86110 发表于 2015-12-3 10:17
还可以,只是图片显示上还是留一手。

我的也是,实物可以,但是仿真不行,哎
回复

使用道具 举报

31#
ID:795427 发表于 2021-11-10 11:40 | 只看该作者
仿真文件就是只是一个空壳壳,没有电路,难怪没有上贴图。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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