打印

LCD1602图形显示问题,求解!!

[复制链接]
3846|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuanguojian260|  楼主 | 2012-7-19 09:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yuanguojian260 于 2012-7-21 18:19 编辑

显示lcd的时候显示的第一行被第二行覆盖,而且第二行与第一行显示的也是一样的字符,我猜是CGRAM的地址设置问题,但我不知道怎么改,上代码,各位大侠看看,我想知道详细的原因。

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P3^5;
sbit lcden=P3^4;
sbit dula=P2^6;
sbit wela=P2^7;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
uchar code table[]={0x0f,0x01,0x01,0x01,0x01,0x01,0x1f,0x10,
     0x08,0x08,0x08,0x09,0x0a,0x0c,0x1f,0x08,
     0x01,0x00,0x10,0x03,0x00,0x00,0x19,0x00,
     0x1e,0x0a,0x0a,0x1f,0x12,0x12,0x1e,0x00,
     0x11,0x0a,0x04,0x1f,0x04,0x04,0x0e,0x04,
     0x00,0x01,0x02,0x06,0x0a,0x02,0x02,0x02,
     0x04,0x1f,0x04,0x04,0x0e,0x04,0x04,0x1f};
uchar code table1[]={0x10,0x1f,0x01,0x01,0x01,0x09,0x05,0x03,
     0x08,0x0c,0x0a,0x09,0x08,0x09,0x0a,0x0c,
     0x01,0x01,0x02,0x02,0x10,0x08,0x00,0x00,
     0x00,0x1e,0x12,0x12,0x12,0x1e,0x00,0x00,
     0x1f,0x04,0x04,0x04,0x04,0x04,0x00,0x00,
     0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,
     0x05,0x05,0x05,0x06,0x04,0x00,0x00,0x00};
void write_com(uchar com)   //写指令
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)  //写数据
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()   //LCD初始化
{
   
dula=0;
wela=0;
rs=0;
lcden=1;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);

}
void main()
{
    uchar i;
init();
write_com(0x40);  //设置CGRAM的地址
for(i=0;i<56;i++)
  {
   write_date(table);  //读上半部分
   delay(5);
  
  }
write_com(0x80);
for(i=0;i<7;i++)
  {
      write_date(i);
  }
write_com(0x40);  //    (我才是这里设置有问题)设置下半部分CGRAM地址
for(i=0;i<56;i++)
  {
   write_date(table1);  //读下半部分
   delay(5);
  
  }
write_com(0x80+0x40);
for(i=0;i<7;i++)
  {
   write_date(i);
   
  }
while(1);
}

相关帖子

沙发
mcustudypeace| | 2012-7-19 11:35 | 只看该作者
写地址时需要加80H,例如要想在第一行第一列显示,要写的地址为0x00+0x80,而不是0x00,你的程序我看着乱,没仔细看。你可以试试。

使用特权

评论回复
板凳
yuanguojian260|  楼主 | 2012-7-20 09:50 | 只看该作者
这个我知道,可我显示的是汉字,是点阵的形式显示的,最开始的CGRAM地址设为0x40,显示lcd上部分,那下部分的地址我该怎么设置呢?

使用特权

评论回复
地板
ayb_ice| | 2012-7-20 10:00 | 只看该作者
本帖最后由 ayb_ice 于 2012-7-20 10:01 编辑

//------------------------------
// NO.1
     lcd1602_command_write(LCD1602_CMD__DDRAM_AD_SET+0);    //LCD1602_CMD__DDRAM_AD_SET=0x80
//------------------------------
// NO.2
    lcd1602_command_write(LCD1602_CMD__DDRAM_AD_SET+0x40);

写程序要多考虑可读性,程序里到处是直接数据,神仙也不知道是在干什么

使用特权

评论回复
5
wukunshan| | 2012-7-20 10:17 | 只看该作者
用1602来显示汉字?1602的第一行和第二行之间有一条缝隙的间隔,显示出来的汉字的上半部分和下半部分分开,看起来不是很别扭吗?
1602第一行的首地址是:0x80;第二行首的地址是:0xc0。

使用特权

评论回复
6
dlyt_test001| | 2012-7-20 15:36 | 只看该作者
改成液晶,用128*64

使用特权

评论回复
7
aihe| | 2012-7-20 20:29 | 只看该作者
可以显示如“日,月,年”等简单字

使用特权

评论回复
8
yuanguojian260|  楼主 | 2012-7-21 11:49 | 只看该作者
1602的第一行第二行首地址我肯定知道啦,我是想控制5x8的点阵来显示一些图形,8个点一个字节,有3位没有显示,就是5位一个字节,5x8就是8个字节,但1602只能显示64个字节,如果超过了就显示乱码,所以我就想通过设置两次点阵的地址,上部分设置的是0x40,显示56个字节,下部分就不知道点阵的地址了,如果继续设置为0x40就出现我上面说的情况,我纠结的是这里啊,如何设置下部分点阵的地址显示另外的56字节。

使用特权

评论回复
9
zhuanghaiyang| | 2012-7-21 13:47 | 只看该作者
没用过不带字库的

使用特权

评论回复
10
jmd_18| | 2012-7-21 17:34 | 只看该作者
用过1601c,显示一行字符

使用特权

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

本版积分规则

0

主题

7

帖子

0

粉丝