找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机lcd12864半屏显示程序详解

[复制链接]
跳转到指定楼层
楼主
ID:83710 发表于 2015-6-23 18:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
哎!这些日子发生了很多事,很多人让我改变看法,也许我也是有点。。。。
真是很郁闷,真的还好有它---------给我挑战,给我动力,加油!努力!
这是我一贯的,用笨法子编程,管他那,能用就行 啊!
128*64的半屏和刷屏程序!





#include<reg51.h>
#define uint unsigned int;
#define uchar unsigned char;
sbit rs=P1^0;//并行模式下为指令数据选择信H/L=指令/数据
虽然并不是什么图,只是很多点,但是我知道他意味这什么,
第一幅是在PC上显示的图,第二幅是在12864液晶上显示的图,也就是如果我ROM足够大,我可以做视屏,这一点我坚信!只是现在我的ROM存储到没有了,所以ROM空间放不下了,我才用了半屏。现在要大ROM也是很简单的,16K的,64K的,多了,只要有钱!呵呵





  1. sbit rw=P1^1;//并行的读写信号H/L=读/写
  2. sbit e=P1^2; //并行下的使能信号
  3. sbit reset=P1^5;
  4.    uchar x,y;//坐标
  5.    uchar datetabal;
  6. uchar d1,d2;//数据缓冲
  7. uchar k=0,h=0;
  8. unsigned int i,j;


  9. uchar code tab[]={/*--  调入了一幅图像:C:\Users\lenovo\Desktop\100001313985056.bmp  --*/
  10. /*--  宽度x高度=128x32  --*/
  11. 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  12. 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  13. 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  14. 0x00,0x00,0x00,0x00,0x00,0x00,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  15. 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  16. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  17. 0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  18. 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  19. 0x00,0x00,0x00,0x00,0x66,0x4A,0xFC,0xEF,0xF5,0x92,0x00,0x00,0x00,0x00,0x00,0x00,
  20. 0x00,0x00,0x00,0x00,0xC6,0x0F,0x99,0x49,0x9D,0x5F,0x00,0x00,0x00,0x00,0x00,0x00,
  21. 0x00,0x00,0x00,0x00,0x8D,0xFD,0x66,0x79,0x67,0x4D,0x00,0x00,0x00,0x00,0x00,0x00,
  22. 0x00,0x00,0x00,0x00,0x19,0x3E,0x96,0x8F,0xCB,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,
  23. 0x00,0x00,0x00,0x00,0x33,0xE9,0xF2,0x60,0xB6,0xFB,0x00,0x00,0x00,0x00,0x00,0x00,
  24. 0x00,0x00,0x00,0x00,0xE7,0xD3,0xFF,0x33,0xED,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,
  25. 0x00,0x00,0x00,0x00,0x4F,0x4E,0x33,0x93,0x33,0x64,0x00,0x00,0x00,0x00,0x00,0x00,
  26. 0x00,0x00,0x00,0x00,0x7E,0xA6,0xCC,0xD8,0x42,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,
  27. 0x00,0x00,0x00,0x00,0x4C,0x34,0x48,0x46,0x00,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,
  28. 0x00,0x00,0x00,0x00,0x93,0x7E,0x36,0xE9,0xFF,0x64,0x00,0x00,0x00,0x00,0x00,0x00,
  29. 0x00,0x00,0x00,0x00,0x57,0xFF,0xCA,0x26,0x00,0xBB,0x00,0x00,0x00,0x00,0x00,0x00,
  30. 0x00,0x00,0x00,0x00,0xBF,0x4D,0xF1,0x78,0x00,0x2D,0x00,0x00,0x00,0x00,0x00,0x00,
  31. 0x00,0x00,0x00,0x00,0x38,0x05,0xAC,0x73,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
  32. 0x00,0x00,0x00,0x00,0xFD,0xB4,0xBE,0xBE,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,
  33. 0x00,0x00,0x00,0x00,0x32,0xB6,0x4F,0xF5,0xFF,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,
  34. 0x00,0x00,0x00,0x00,0xF6,0x0A,0x6B,0xAA,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,
  35. 0x00,0x00,0x00,0x00,0x7D,0x4A,0x3E,0x6D,0x9B,0xD5,0x8A,0x45,0x00,0x00,0x00,0x00,
  36. 0x00,0x00,0x00,0x00,0xBF,0xAF,0xCC,0xF6,0x50,0x6C,0x77,0xA8,0x00,0x00,0x00,0x00,
  37. 0x00,0x00,0x00,0x00,0x76,0x15,0xAF,0x7A,0xAB,0xA7,0x6A,0x13,0x00,0x00,0x00,0x00,
  38. 0x00,0x00,0x00,0x00,0x5D,0xAA,0x7F,0xFE,0x5D,0xFF,0x4D,0xD4,0x00,0x00,0x00,0x00,
  39. 0x00,0x00,0x00,0x00,0xEC,0x25,0xB3,0xB8,0x5B,0xCF,0xEC,0x2D,0x00,0x00,0x00,0x00,
  40. 0x00,0x00,0x00,0x00,0x6F,0xDE,0xB6,0x65,0xFF,0x27,0xF7,0xFC,0x00,0x00,0x00,0x00,
  41. 0x00,0x00,0x00,0x00,0xAB,0x2D,0x73,0x7A,0x3E,0x51,0x29,0x9B,0x00,0x00,0x00,0x00,
  42. 0x00,0x00,0x00,0x00,0x4B,0xC5,0x5D,0xF3,0xFD,0x4D,0xFC,0xCE,0x00,0x00,0x00,0x00,

  43. };


  44. void delay40ms(void)   //误差 -0.000000000009us
  45. {
  46.     unsigned char ad,bd,cd;
  47.     for(cd=11;cd>0;cd--)
  48.         for(bd=124;bd>0;bd--)
  49.             for(ad=12;ad>0;ad--);
  50. }
  51. void delay4_6ms()//
  52. {
  53. unsigned char av,bv;
  54.     for(bv=12;bv>0;bv--)
  55.         for(av=175;av>0;av--);

  56. }
  57. void delay(void)
  58. {
  59.      ;;;

  60. }

  61. void writedate(unsigned char a)//写数据
  62. {
  63.   





  64.    delay4_6ms();
  65.       rs=1;
  66.     delay();
  67.     rw=0;
  68.    delay();
  69.    e=1;
  70.    delay();


  71.    P0=a;
  72.   
  73.   

  74. delay();
  75. e=0;
  76. delay();






  77. }

  78. void writectrl(unsigned char ds)//写指令
  79. {
  80.   rs=0;
  81.    delay();
  82.     rw=0;
  83.   delay();
  84.    e=1;
  85.    delay();
  86. P0=ds;
  87. delay();
  88. e=0;
  89.    delay();
  90.   

  91. }

  92. void main()
  93. {
  94.     reset=0;
  95.     delay();
  96.     reset=1;
  97.     delay40ms();

  98.   writectrl(0x3f);//开扩充指令操作数据位选择8位
  99.    delay4_6ms();


  100.    writectrl(0x3e);//写指令扩充指令操作,8位数据,绘图开关关
  101.   delay4_6ms();

  102.    // writectrl(0x80);//写指令设置  垂直  列地址 Y轴为  “0”
  103.    //delay4_6ms();
  104.     //writectrl(0x80);//写指令设置 水平  行地址 X轴  “0”
  105.        //delay4_6ms();
  106.      //writedate(0xffff);  //数据写入FffFH
  107.   //delay4_6ms();


  108.    x=0;
  109.    y=0;
  110.    i=0;
  111.    j=0;
  112. for( h=0;h<32;h++  )
  113. {
  114.      x=0;
  115.    for (k=0;k<8;k++)
  116.    {

  117.    
  118.    
  119.    writectrl((0x80+y));//写指令设置  垂直  列地址 Y轴为  “0”
  120.    delay4_6ms();
  121.     writectrl((0x80+x));//写指令设置 水平  行地址 X轴  “0”
  122.        delay4_6ms();     
  123.   writedate(tab[i]);  //数据写入FFH
  124.         i++;
  125.   writedate(tab[i]);  //数据写入FFH
  126.   delay4_6ms();
  127.      i++;
  128.    
  129.      x++;
  130.   
  131.     }

  132.     y++;







  133.   
  134. }

  135. //;***********以上是上半屏(Y=0-1F,X=0-07)以下是下扳平Y=8-0F X=0-1F********************************
  136. x=0;y=0;
  137. for( h=0;h<32;h++  )
  138. {
  139.      x=0;
  140.    for (k=0;k<8;k++)
  141.    {

  142.    
  143.    
  144.    writectrl((0x80+y));/:/写指令设置  垂直  列地址 Y轴为  “0”
  145.    delay4_6ms();
  146.     writectrl((0x88+x));//写指令设置 水平  行地址 X轴  “0”
  147.        delay4_6ms();     
  148.    writedate(0x00);  //数据写入FFH
  149.          i++;
  150.    writedate(0x00);  //数据写入FFH
  151.   
  152.   delay4_6ms();
  153.          i++;
  154.      x++;
  155.   
  156.     }

  157.     y++;







  158.   
  159. }

  160.   




  161. while(1);  //*******************************************************
  162.             //12864到今晚我也成功了,呵呵,我是这样的:把12864分成两部分,上半部分12832,下半部分12832
  163.       //然后用扫描的办法从第一行开始扫描,知道32行,在执行下半部分扫描程序,第33行开始,扫描32行道64至
  164.       //这里还要说一个事:关于12864画图,你看那大海,水很多,但是它是由一滴滴水组成的,所以要想在12864屏幕上显示一幅图像,你就要
  165.       //从一个点开始,第一步我让第一行的第一列显示一个点,怎么实现呢?我开始很是不明白,看了一天的手册,一下午的实验,终于总结出
  166.       //1:向7920的写入3F和3E指令,使液晶工作在扩展指令状态,8位数据,绘图开关开2:设定绘图RAM地址,先写入列(Y轴)再写入行(X轴)
  167.       //然后再一口气写入16位的数据,也可以写8位,但要写2次,我是采取后者,然后这十六是什么呢?---即这样的排列D15-D0,让第一个点就写入8000H
  168.       //那么,现在就是在第一行第一列显示一个点!呵呵,会写一个点,你就一定会写一幅图像了,为什么呢,你只要让单片机这样重复的写512个字就是有一幅
  169.       //12864的图像了,这其实说白了就是点阵啊----------



  170.       //呵呵,2010年11月17日  与天津开发区第四项目部宿舍,操今天给分包队干了一天的活,很郁闷,但是有单片机真的让我开心起来
  171.       //
  172.       //
  173.       //
  174.       //
  175.       //
  176.       //
  177.       //
  178.       ///
  179.       //***************************************************8

  180. }
复制代码




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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