找回密码
 立即注册

QQ登录

只需一步,快速开始

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

AMPIRE12864液晶在任意位置显示任意字符或汉字的单片机源码与仿真

  [复制链接]
跳转到指定楼层
楼主
    最近配合proteus仿真,搞了一个小试验程序,功能是,通过 改变主程序里的d,x,y三个变量组合可以在ampire12864液晶上的任意可显示的地方显示任意字符或汉字。通过这个小东西可以很好的理解这类液晶的显示原理,可以很直观的操作其行和列,页和列 左右屏控制。感觉挺好玩,贡上来。请大神斧正。程序使用的是字符库,如要显示汉字,请自行修改参数。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:

  1. /***********************************lcd.c****************************************/

  2. #include <reg52.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int         
  5. #define DB P2
  6. uchar d,x,y;             
  7.         sbit Reset = P0^0;   //复位
  8.         sbit RS = P0^3;    //指令数据选择
  9.         sbit E = P0^1;    //指令数据控制
  10.         sbit CS1 = P0^5;   //左屏幕选择,低电平有效
  11.         sbit CS2 = P0^4;   //右屏幕选择
  12.         sbit RW = P0^2;    //读写控制
  13.     uchar  *ZF;        //数据指针,ZF为首地址          
  14. const uchar code ZF_tab[] =
  15. {
  16.         0xF8,0xFC,0x04,0xC4,0x24,0xFC,0xF8,0x00,  // -0-
  17.         0x07,0x0F,0x09,0x08,0x08,0x0F,0x07,0x00,

  18.         0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00,  // -1-
  19.         0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,

  20.         …………
  21. …………限于本文篇幅 余下代码请从51黑下载附件…………

  22.         0x00,0x04,0x04,0xBC,0xF8,0x40,0x40,0x00,  // -}-
  23.         0x00,0x08,0x08,0x0F,0x07,0x00,0x00,0x00,
  24.        
  25. };

  26. void delay(uint time)        //延时
  27.          {
  28.            while(time --);
  29.          }

  30. void writedata(uchar dat)        //写数据
  31. {
  32. delay(5);
  33. E = 1;        RS = 1;        RW = 0;
  34. P2 = dat;
  35. E = 0;
  36. }
  37. void writecmd(uchar cmd)          //写地址/命令
  38. {
  39. delay(5);
  40. E = 1;        RW = 0;        RS = 0;
  41. P2 = cmd;
  42. E = 0;
  43. }
  44. void SetOnOff(uchar onoff) //1-开显示 0-关
  45. {
  46. if(onoff == 1)        writecmd(0x3f);   
  47. if(onoff == 0) writecmd(0x3e);
  48. }
  49. void setPM(uchar PM) //选择屏幕( 0-左屏,1-右屏,2-全屏  )
  50. {
  51. switch(PM)
  52. {
  53.    case 0 :         CS1 = 0;         CS2 = 1;   break;
  54.    case 1 :         CS1 = 1;    CS2 = 0;   break;
  55.    default :    CS1 = 0;    CS2 = 0;
  56. }
  57. }
  58. void set_x( x)  //x -> 0 : 7 页
  59. {
  60. x = x&0x07|0xb8;          
  61. writecmd(x);
  62. }
  63.                
  64. void set_y( y) //y -> 0 :63 列
  65. {
  66. y = y & 0x3f|0x40;          
  67. writecmd(y);
  68. }

  69. void chearPM(uchar PM)  //清屏(0-清左屏,1-清右屏,2-清全屏 )
  70. {
  71. uchar i,j;
  72.   setPM(PM);
  73.          for(i = 0;i < 8;i++)         
  74.            {
  75.                   set_x(i);                   //从第0到第7页
  76.                   set_y(0);                                //从第0列开始
  77.                   for(j = 0;j < 64; j++)        //在PM=2的情况下左右半屏同时全写0.
  78.                   writedata(0x00);         
  79.            }   
  80. }       
  81. void InitLcd()                  //LCD初始化
  82. {
  83. Reset = 0;        delay(2);Reset = 1;        delay(2);//软件复位                    
  84. //SetOnOff(0);  //关屏幕
  85. chearPM(2);        //清屏
  86. }
  87. void showZF( x, y, uchar *ZF)          //显示一个字符
  88. {
  89. uchar i;
  90. set_x(x); set_y(y);                            //设置页地址,设置咧地址       
  91. for(i = 0;i < 8;i ++) writedata(*(ZF++));        // 写字符的上半部分
  92. set_x(x + 1);set_y(y);         
  93. for(i = 0;i < 8;i ++)        writedata(*(ZF++));         // 写字符的下半部分
  94.   
  95. }
  96. /*******************************************************************************/
  97. /********************************main.c***********************************************/

  98.          void effect (d, x, y)
  99.         {                                   
  100.                  uchar i,h,s;
  101.                  if(y<57 )
  102.                          {
  103.                           setPM(0);          //开左屏
  104.                           s=(64-y)/8;         //计算可以完整显示几个字符,               
  105.                           ZF =(ZF_tab+(d-1)*16);         //计算从第几个字符开始。
  106.                                          for(i =0;i <s; i++)   //循环取字符。
  107.                                   {
  108.                                         showZF(x,y ,ZF);
  109.                                                  y += 8;  //y加8跳过一个字符的宽度,
  110.                                      ZF +=16;          //        ZF加16跳过一个字符的高度                                                                                                                                     
  111.                                    }
  112.                           }
  113.                                           
  114.                           if(y>63 )          
  115.                            {
  116.                                     setPM(1);         //开右屏                                          
  117.                              h=y-64;          //计算离开右屏第1列的列值h,h范围0-63               
  118.                                  s=(128-y)/8;         //         计算右屏可以完整显示几个字符,
  119.                                  ZF =( ZF_tab+(d-1)*16);                                         
  120.                                          for(i =0;i <s; i++)
  121.                                   {
  122.                                         showZF(x,h ,ZF); h += 8;ZF +=16;       
  123.                                        }
  124.                                 }       
  125.           }
  126. void main()
  127. {                         
  128. InitLcd();
  129. while(1)
  130.   {        uchar i;        
  131.         d=28;  //  d:从字库中第几个字开始显示  正常再字库的字节数内取值1到若干个,1是第一个,2是第2个
  132.         x=6;   //x;在第几行显示,由于屏幕分8页,字符高度占两页。正常取0-6.x=6就已经是第7页了,
  133.                 //余下第8页是为了第6、7页能显示完整字符。        
  134.         y=32;        // y:从哪一列开始显示 正常取0-120.余下的8列,是为了显示完整字符。大于120终止取字循环。  
  135.     effect(d,x,y);                                                                                                       
  136.         setPM(2);                
  137.                 for(i=0;i<3;i++)         //闪烁几下        也可不用该程序段
  138.                 {  
  139.                     SetOnOff(1); delay(30000) ;                            
  140.                          SetOnOff(0); delay(30000);                                 
  141.                         SetOnOff(1);
  142.                 }
  143.         //while(1) ;       
  144.    }                            
  145. }
复制代码

所有资料51hei提供下载:
在ampire12864液晶的任意可显示的地方显示任意字符或汉字C程序 proteus仿真.rar (78.07 KB, 下载次数: 287)


评分

参与人数 3黑币 +61 收起 理由
日了狗了 + 5 很给力!
admin + 50 共享资料的积分奖励!
xiaos + 6 很给力!

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2015-3-11 22:31 来自手机 | 只看该作者
好资料,谢谢分享,等上班后把分给您加上
回复

使用道具 举报

板凳
ID:73833 发表于 2015-3-14 12:09 | 只看该作者
本帖最后由 dingmingzhou 于 2015-7-15 06:02 编辑

哥称之为爱情
回复

使用道具 举报

地板
ID:74370 发表于 2015-3-15 21:54 | 只看该作者
燃眉之急好资料,谢谢分享
回复

使用道具 举报

5#
ID:72050 发表于 2015-5-7 20:38 来自手机 | 只看该作者
我看看,正在学习中
回复

使用道具 举报

6#
ID:73949 发表于 2015-5-7 22:33 | 只看该作者
学习学习,谢谢分享!
回复

使用道具 举报

7#
ID:21178 发表于 2015-9-10 14:02 | 只看该作者
好资料,正在研究
回复

使用道具 举报

8#
ID:102155 发表于 2016-1-6 21:56 | 只看该作者
看看,正好手头上有类似项目
回复

使用道具 举报

9#
ID:81035 发表于 2016-1-11 18:51 | 只看该作者
很好的资料,谢谢分享!
回复

使用道具 举报

10#
ID:122173 发表于 2016-5-20 14:29 | 只看该作者
很好的资料,谢谢分享!
回复

使用道具 举报

11#
ID:46028 发表于 2016-5-27 13:27 | 只看该作者
多谢分享,参考一下
回复

使用道具 举报

12#
ID:167267 发表于 2017-4-15 23:14 | 只看该作者
正在找这个资料。。。。
回复

使用道具 举报

13#
ID:137676 发表于 2017-4-17 00:00 | 只看该作者
真是雪中送炭啊,找了很久的资料啊!谢谢分享
回复

使用道具 举报

14#
ID:165122 发表于 2018-3-19 11:10 | 只看该作者
学习学习!
回复

使用道具 举报

15#
ID:339428 发表于 2018-5-27 23:07 | 只看该作者
很给力
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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