搜索
bottom↓
回复: 16

12864 显示乱码 求助!

[复制链接]

出0入0汤圆

发表于 2011-11-10 18:23:05 | 显示全部楼层 |阅读模式
最近在搞万年历,想显示16*32的字符,因字库都是16*16的,所以用绘图的方法做!但奇怪的是,如果不用图形模式,直接用里面的字库写字,没问题,
但一旦打开图形模式,显示图形就会很多乱码,此时在在切换写16*16 乱码也不会消失,有时两个画面切换,换着换着就死机了!直接白屏!
高手们指点下?不胜感激。。。。
已经加勒清楚GDRAM的程序!

void write1632GDRAM(uchar x,uchar *bmp)       
{
        uchar i,j,basex,basey;       

        basex=0x80;
        basey=basex+x-1;

        write_com(0x34);                                             //绘图模式关写入数据
                                       
                  for(i=0;i<16;i++)                                 //写入上半屏16行点阵
                  {                                                                                                               
                            write_com(0x90+i);          //先写入垂直位址,选上下32行的哪一行,不管上下半屏,
                                delayus(5);                                                //首行都为0X80,第二行为0X90。
                            write_com(basey);                //(选上半屏)再写入水平位址
                                delayus(5);
                            for(j=0;j<2;j++)        //2个8位元的数据,即16BIT宽度
                                    write_data(*bmp++);
                                delayus(5);
                                                  
                  }
                  for(i=0;i<16;i++)                                 //写入下半屏16行点阵
                  {       
                                  delayus(5);                                                                                               
                            write_com(0x80+i);          //先写入垂直位址,选上下32行的哪一行,不管上下半屏,首行都为0X80
                                delayus(5);
                            write_com(basey+8);           //(选下半屏)再写入水平位址
                            for(j=0;j<2;j++)        //2个8位元的数据,即16BIT宽度
                                    write_data(*bmp++);   
                                delayus(5);
                  }         
        write_com(0x36);                                          //写完数据,开图片显示     
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2011-11-10 18:23:38 | 显示全部楼层
void Clean_12864_GDRAM(void)
{
    uchar x,y;
    write_com(0x34);
//        delay(2);
    init_12864_GDRAM();        //设置扩展指令集,按手册说明,仅设置了绘图位,
//        delay(2);
    write_com(0x36);        //需要两次,本次设置扩展指令集。
    for (y=0;y<32;y++)
    {
        write_com(0x80+y);  //设置y=1000+00xx,y+1则往下一行
        write_com(0x80);        //设置x=1000 0000
        for (x=0;x<16;x++)
        {
            write_data(0x00);   //高字节数据
            write_data(0x00);        //低字节数据
        }
    }
}

出0入0汤圆

 楼主| 发表于 2011-11-10 18:24:22 | 显示全部楼层
大家有没有遇到这种问题啊!~指点下

出0入0汤圆

 楼主| 发表于 2011-11-10 20:26:57 | 显示全部楼层

(原文件名:图片 001.jpg)


(原文件名:图片 002.jpg)


(原文件名:图片 003.jpg)


(原文件名:图片 004.jpg)

出0入0汤圆

 楼主| 发表于 2011-11-10 20:27:56 | 显示全部楼层
上图片!写汉字正常,画图片就乱码!

出0入0汤圆

发表于 2011-11-10 22:57:43 | 显示全部楼层
要清屏的……

出0入0汤圆

 楼主| 发表于 2011-11-11 09:43:08 | 显示全部楼层
清屏函数早已加!

出0入0汤圆

发表于 2011-11-11 15:03:48 | 显示全部楼层
我有2块12864液晶屏,蓝屏工作一切正常,同硬件我换上黄绿屏的12864液晶屏后不定时会乱码。现在也找不到原因,同样是7920的控制器。

出0入4汤圆

发表于 2011-11-11 15:28:01 | 显示全部楼层
一般操作采用双缓存绘图,抗干扰能力强,并利于绘图等,你可以试试

出0入0汤圆

发表于 2011-11-11 15:47:48 | 显示全部楼层
注意速度,把发数据的速度降一下。加点延时

出0入0汤圆

发表于 2011-11-11 16:10:06 | 显示全部楼层
学习

出0入0汤圆

 楼主| 发表于 2011-11-11 20:10:16 | 显示全部楼层
liguangqang
8楼
请教双缓存怎样弄?解释详细点可以吗?

出0入0汤圆

发表于 2011-11-21 13:00:41 | 显示全部楼层
这样清屏:
LCD12864_Write_Comm(0x01);//清除文字       
LCD12864_Clear_Scren(64,0,128,64);//清屏
LCD12864_Write_Comm(0x30);
LCD12864_Write_Comm(0x02);//清除文本中的污点

说明:
LCD12864_Write_Comm() 函数是向12864发送一条指令
LCD12864_Clear_Scren() 就是你的Clean_12864_GDRAM()

出0入0汤圆

发表于 2011-11-24 18:18:49 | 显示全部楼层
切换显示前,需要清屏幕,另外要加上读忙判断

出0入0汤圆

发表于 2011-11-24 21:16:01 | 显示全部楼层
回复【楼主位】snail_dongbin
-----------------------------------------------------------------------

给你看看我用的12864的驱动程序~
void delay1(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
  {
     for(y=110;y>0;y--);
  }
}

void write_com(uchar com)     ////要改
{
   lcdrs=0;
   lcdrw=0;
   lcden=1;  
   P0=com;
   delay1(6);
   lcden=0;
   delay1(6);

}
void write_date(uchar date)    ////要改
{
   lcdrs=1;
   lcdrw=0;
   lcden=1;
   P0=date;
   delay1(6);
   lcden=0;
   delay1(6);
  
}
void initlcd()         ////要改
{
   P2=0xff;
   lcden=0;
  write_com(0x30);  //选择8bit数据流
   delay1(5);
   write_com(0x0c);
   delay1(5);
   write_com(0x01);
   delay1(5);
}

void display(uchar *str)      /////要改
{
        while(*str!='\0')
        {
                write_date(*str);
                str++;               
        }
}

把要显示的数据放在数组里面就可以了~

出0入0汤圆

发表于 2013-8-13 10:51:12 | 显示全部楼层
不知楼主的问题解决没,我的12864也出现了这样的问题,求大神支招啊

出0入0汤圆

发表于 2016-3-14 13:38:40 | 显示全部楼层
本帖最后由 shiow198410 于 2016-3-14 15:46 编辑
shengsg 发表于 2011-11-21 13:00
这样清屏:
LCD12864_Write_Comm(0x01);//清除文字       
LCD12864_Clear_Scren(64,0,128,64);//清屏


确实有效,特别是加后面两句,可以把屏上的随机白点去掉,不过中间位置随机出现的字符还是不行啊


确实跟延时还是有一定关系,改成下面这样就不出现随机串码了:
  writecom_12864(0x80);
  delayus(100);
  writecom_12864(0x30);
  delayus(100);
  writecom_12864(0x02);
  delayus(100);

这个就不要加了,加了太占时间,屏幕会闪
LCD12864_Clear_Scren(64,0,128,64);//清屏
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-13 21:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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