打印

请教12864液晶显示!

[复制链接]
2061|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houhou1004|  楼主 | 2009-12-8 19:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是我自己写的12864程序,可是显示字的时候字只能显示半段(8位),剩下的8位显示不出来,请帮忙更改,谢谢,字体为16*16.

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^5;
sbit e=P3^4;
sbit rw=P3^6;
sbit rest=P3^1;
sbit csa=P3^2;
sbit csb=P3^3;
sbit dula=P2^6;
sbit wela=P2^7;
uchar num;
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void write_com(uchar com)//写命令
{
rs=0;
rw=0;
P0=com;
e=1;
delay(5);
e=0;

}
void red_com(uchar com)
{
rs=0;
rw=1;
e=1;
delay(5);
   P0=com;
}
void write_date(uchar date)//写数据
{
rs=1;
rw=0;
e=1;
P0=date;
delay(5);
e=0;

}
void red_date(uchar date)
{
rs=1;
rw=1;
e=1;
delay(5);
P0=date;
}
uchar code table[]={
/*-------我---------*/
   0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,
      0xFF,0x20,0x22,0xAC,0x20,0x30,0x20,0x00,
      0x00,0x08,0x48,0x84,0x7F,0x02,0x21,0x10,
      0x09,0x06,0x1A,0x61,0x80,0xE0,0x00,0x00,
/*-------自---------*/
   0x00,0x00,0x00,0xF8,0x48,0x4C,0x4A,0x49,
      0x48,0x48,0x48,0xFC,0x08,0x00,0x00,0x00,
      0x00,0x00,0x00,0xFF,0x44,0x44,0x44,0x44,
      0x44,0x44,0x44,0xFF,0x00,0x00,0x00,0x00,
/*-------己---------*/
   0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,
      0x84,0x84,0x84,0xFE,0x04,0x00,0x00,0x00,
      0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,
      0x40,0x40,0x40,0x41,0x40,0x70,0x00,0x00,
/*-------写---------*/
   0x08,0x06,0x02,0x02,0xFA,0x22,0x22,0x22,
      0x22,0x22,0x32,0x22,0x82,0x0A,0x06,0x00,
      0x00,0x08,0x08,0x08,0x09,0x09,0x09,0x09,
      0x09,0x4D,0x89,0x41,0x3F,0x01,0x00,0x00
};
void init()
{
csa=1;
csb=1;
rest=1;
dula=0;
wela=0;
write_com(0x3f);//关显示
write_com(0x3e );//开显示
write_com(0xc0);//显示起始行设置
write_com(0xb8);//页面地址设置为第四页
write_com(0x40);//列地址设置
red_com(0x10);//读状态字
delay(5);
// red_date(table[num]);//读数据
}
void disply()
{
csa=1;
csb=1;
write_com(0xbc);//x,显示为第四页
write_com(0xc0);//z
write_com(0xc0);//y
for(num=0;num<128;num++)
{
write_date(table[num]);
delay(5);
}
}
void main()
{
init();
        disply();
while(1);

}

相关帖子

沙发
xlsbz| | 2009-12-8 19:23 | 只看该作者
先学会清空屏幕!  一点一点的清空 。然后再考虑写字 或者画图 都是小菜!

使用特权

评论回复
板凳
ningling_21| | 2009-12-8 22:09 | 只看该作者
搞清楚12864内部的地址就没问题了....

使用特权

评论回复
地板
houhou1004|  楼主 | 2009-12-8 22:25 | 只看该作者
就是地址的问题,如x,我定义的是在第四页显示,可是他一个页只能显示8位,而一个字要16个,而再加一页我就不会加了,有没有再加一页的例子阿,发个看看,谢谢了!

使用特权

评论回复
5
xushouxue999| | 2009-12-8 23:24 | 只看该作者
你都没有换行,显示的当然是8位的“字”了,而且你的行列地址都没有设置!正确做法应该是写16列8位数据后,换到下个页。
还有你所说的第四页,我记得这个型号的液晶好像是有8页吧!也就是说你只写了第7页,没有写第8页!

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
houhou1004 + 1
6
houhou1004|  楼主 | 2009-12-8 23:55 | 只看该作者
恩,很感谢你噢,
那个列我设置为0x7f,就是把所有的都打开,
""正确做法应该是写16列8位数据后,换到下个页""
这个怎么换的,不会阿,能帮我改下吗,谢谢

使用特权

评论回复
7
houhou1004|  楼主 | 2009-12-10 00:33 | 只看该作者
已经解决,谢谢大家的支持!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^5;
sbit e=P3^4;
sbit rw=P3^6;
sbit rest=P3^1;
sbit csa=P3^2;
sbit csb=P3^3;
sbit dula=P2^6;
sbit wela=P2^7;
uchar num;
void delay(uint z)
{
        uchar x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);       
}
void write_com(uchar com)//写命令
{
        rs=0;
        rw=0;
        P0=com;
        e=1;
        delay(5);
        e=0;
       
}
void red_com(uchar com)
{
        rs=0;
        rw=1;
        e=1;
        delay(5);
   P0=com;       
}
void write_date(uchar date)//写数据
{
        rs=1;
        rw=0;
        P0=date;
        e=1;
        delay(5);
        e=0;
       
}
void red_date(uchar date)
{
        rs=1;
        rw=1;
        e=1;
        delay(5);
        P0=date;
}

uchar code table[]={
//"我",
          0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,
      0xFF,0x20,0x22,0xAC,0x20,0x30,0x20,0x00,
      0x00,0x08,0x48,0x84,0x7F,0x02,0x21,0x10,
      0x09,0x06,0x1A,0x61,0x80,0xE0,0x00,0x00,
//"自",
          0x00,0x00,0x00,0xF8,0x48,0x4C,0x4A,0x49,
      0x48,0x48,0x48,0xFC,0x08,0x00,0x00,0x00,
      0x00,0x00,0x00,0xFF,0x44,0x44,0x44,0x44,
      0x44,0x44,0x44,0xFF,0x00,0x00,0x00,0x00,
//"己",
          0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,
      0x84,0x84,0x84,0xFE,0x04,0x00,0x00,0x00,
      0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,
      0x40,0x40,0x40,0x41,0x40,0x70,0x00,0x00,
//"写",
          0x08,0x06,0x02,0x02,0xFA,0x22,0x22,0x22,
      0x22,0x22,0x32,0x22,0x82,0x0A,0x06,0x00,
      0x00,0x08,0x08,0x08,0x09,0x09,0x09,0x09,
      0x09,0x4D,0x89,0x41,0x3F,0x01,0x00,0x00
};

void init()
{
        csa=1;
        csb=1;
        rest=1;
        dula=0;
        wela=0;
        write_com(0x3f);//开显示
        write_com(0x3e );//关显示       
        write_com(0xc0);//显示起始行设置
        write_com(0xb8);//页面地址设置
        write_com(0x40);//列地址设置
        red_com(0x10);//读状态字
        delay(5);

//        red_date(table[num]);//读数据
}

/*--------------写点阵------------------*/
void lat_disp (uchar data1,uchar data2)
{
  uchar i,j;
  csa=1;csb=1;
  write_com(0x3f);
  for(j=0;j<8;j++)
  {
    write_com (0xb8+j);//0xb8+j
    write_com (0xc0);//0xc0
    write_com (0x40);//0x40
            for(i=0;i<32;i++)
            {
             write_date(data1);
              write_date(data2);
            }
  }
}
/*---指定位置(x,y)显示row_xl行(每行row_yl个)汉字(大小8xl*yl)---*/
void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar
row_xl,uchar row_yl,uchar code *chn)
{
  uchar i,j,k,l,a;
  write_com(0x3f);
  for(l=0;l<row_xl;l++)
  {
    for(k=0;k<row_yl;k++)
    {
      for(j=0;j<xl;j++)
      {
        write_com(0xb8+x+l*xl+j);
        write_com(0xc0);
        write_com(0x40+y+k*yl);
        a=l*xl*yl*row_yl+k*xl*yl+j*yl;
        for(i=0;i<yl;i++)
          write_date (chn[a+i]);
      }
    }
  }
}
void disply()
{
          lat_disp(0x00,0x00);
          delay(100);
          csa=1;csb=0;
          chn_disp (3,0,2,16,1,4,table);
          delay(100);
       
}
void main()
{
        init();
    disply();
        while(1);
       
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

13

帖子

1

粉丝