搜索
bottom↓
回复: 8

12864打点画线,线条出来了,但是其他地方很多乱码

[复制链接]

出0入0汤圆

发表于 2011-10-10 23:53:49 | 显示全部楼层 |阅读模式
如题,不知道为啥,原因我找了很久了贴上程序

/**********************  delay.h     ************************/
/**********************  delayms()   ************************/

#include  <reg52.h>
#include  "lcd12864_parallel.h"
#include  "delay.h"

sbit lcdrs = P3^5;
sbit lcdwr = P3^6;
sbit lcden = P3^4;
sbit lcdpsb = P3^7;

#define LCD_DATA P0
#define lcdrs_set lcdrs = 1
#define lcdrs_clr lcdrs = 0
#define lcdwr_set lcdwr = 1
#define lcdwr_clr lcdwr = 0
#define lcden_set lcden = 1
#define lcden_clr lcden = 0
#define lcdpsb_set lcdpsb = 1
#define lcdpsb_clr lcdpsb = 0

unsigned char lcd12864_test_busy(void)
{
        unsigned char temp;
        lcdrs_clr;
        lcdpsb_set;
        lcdwr_set;
        lcden_set;
        LCD_DATA = 0xff;
        temp = LCD_DATA;
        lcden_clr;
        lcdwr_clr;
        lcdrs_clr;
        temp &= 0x80;
        return temp;

}

unsigned char lcd12864_read_data(void)
{
        unsigned char temp;
        while(lcd12864_test_busy());
        lcdrs_set;
        lcdpsb_set;
        lcdwr_set;
        lcden_set;
        LCD_DATA = 0xff;
        temp = LCD_DATA;
        lcden_clr;
        lcdwr_clr;
        lcdrs_clr;
        return temp;
}


void lcd12864_write_cmd(unsigned char cmd)
{
        while( lcd12864_test_busy() ) ;
        lcdrs_clr;
        lcdpsb_set;
        lcdwr_clr;
        lcden_clr;
        LCD_DATA = cmd;
        lcden_set;
        lcden_clr;
}

void lcd12864_write_data(unsigned char date)
{
        while( lcd12864_test_busy() ) ;
        lcdrs_set;
        lcdpsb_set;
        lcdwr_clr;
        lcden_clr;
        LCD_DATA = date;
        lcden_set;
        lcden_clr;
}

void lcd12864_write_string(unsigned char *p)
{
        while(*p != '\0')
        {
                lcd12864_write_data(*p);
                p++;
        }
}

void lcd12864_write_position(unsigned char x,unsigned char y)
{
         if(x == 1)
         {
                 lcd12864_write_cmd(0x80+y-1);
         }
         else if(x == 2)
         {
                 lcd12864_write_cmd(0x90+y-1);
         }
         else if(x == 3)
         {
                 lcd12864_write_cmd(0x88+y-1);
         }
         else if(x == 4)
         {
                 lcd12864_write_cmd(0x98+y-1);
         }
}

void lcd12864_init()
{
        lcdpsb_set;
        lcdwr_clr;
        lcd12864_write_cmd(0x30);
        lcd12864_write_cmd(0x02);
        delayms(5);                                          //这个一定得4.6ms以上
        lcd12864_write_cmd(0x06);
        lcd12864_write_cmd(0x0c);
        lcd12864_write_cmd(0x01);
        delayms(5);                                          //这个一定得4.6ms以上
        lcd12864_write_cmd(0x80);
}

void lcd12864_draw_point(unsigned char x,unsigned char y,unsigned char color)
{
        unsigned char  m,n;                      //m为该点的页数,n为改点在页中的比特数
        unsigned char datah,datal;          //datah为读出数据的高字节,datal为低字节
        m = x >> 4;
        n = x & 0x0f;
        if(y >= 32)
        {
                y -= 32;
                m += 8;       
        }
        lcd12864_write_cmd(0x80+y);
           lcd12864_write_cmd(0x80+m);
        lcd12864_read_data();
        datah = lcd12864_read_data();
        datal = lcd12864_read_data();
        if(n < 8)
        {
                switch(color)
                {
        /*                case 0:  datah &= (~( 0x01 >> n ));
                                                break;
                        case 1:  datah |= ( 0x01 >> n );
                                                break;
                        case 2:  datah ^= ( 0x01 >> n );
                                                break;
                        default: break;
        */       
                        case 0:  datah &= (~( 0x01 >> (7-n) ));
                                                break;
                        case 1:  datah |= ( 0x01 >> (7-n) );
                                                break;
                        case 2:  datah ^= ( 0x01 >> (7-n) );
                                                break;
                        default: break;
                }
        }
        else
        {
                 switch(color)
                {
/*                        case 0:  datal &= (~( 0x80 >> (15-n) ));
                                                break;
                        case 1:  datal |= ( 0x80 >> (15-n) );
                                                break;
                        case 2:  datal ^= ( 0x80 >> (15-n) );
                                                break;
                        default: break;               
*/               
                        case 0:  datal &= (~( 0x01 >> (15-n) ));
                                                break;
                        case 1:  datal |= ( 0x01 >>(15-n) );
                                                break;
                        case 2:  datal ^= ( 0x01 >> (15-n) );
                                                break;
                        default: break;       
                }
        }
        lcd12864_write_cmd(0x80+y);
           lcd12864_write_cmd(0x80+m);
        lcd12864_write_data(datah);
           lcd12864_write_data(datal);
}

void lcd12864_draw_horizontal_line(unsigned char xstar,unsigned char xend,unsigned char y)
{
        unsigned char temp,i;
        if(xstar > xend)
        {
                temp = xstar;
                xstar = xend;
                xend = temp;
        }
        lcd12864_write_cmd(0x34);
        lcd12864_write_cmd(0x36);
        for(i=xstar; i<=xend; i++)
        {
                lcd12864_draw_point(i,y,1);
        }
        lcd12864_write_cmd(0x30);
}

void lcd12864_draw_vertical_line(unsigned char x,unsigned char ystar,unsigned char yend)
{
        unsigned char temp,i;
        if(ystar > yend)
        {
                temp = ystar;
                ystar = yend;
                yend = temp;
        }
        lcd12864_write_cmd(0x34);
        lcd12864_write_cmd(0x36);
        for(i=ystar; i<=yend; i++)
        {
                lcd12864_draw_point(x,i,1);
        }
        lcd12864_write_cmd(0x30);
}

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-10-11 08:01:53 | 显示全部楼层
基本上是void lcd12864_write_cmd(unsigned char cmd) 的写时序存在问题,中间加上短暂的延时试试

出0入0汤圆

发表于 2011-10-11 08:25:47 | 显示全部楼层
每次画线之前都要清屏。

出0入0汤圆

发表于 2011-10-11 11:36:27 | 显示全部楼层
你的12864的问题!我们用老师的100多的屏就可以读出里面的数据,用自己买的50多的屏测试时!就会出现你的问题!

出0入0汤圆

 楼主| 发表于 2011-10-11 13:30:18 | 显示全部楼层
回复【2楼】lucya
-----------------------------------------------------------------------

嗯,你说的对。我上电之后清屏一下,就可以,不过两种清屏是不同的。

出0入0汤圆

 楼主| 发表于 2011-10-11 13:32:08 | 显示全部楼层
回复【3楼】YAOZHE
-----------------------------------------------------------------------

不是12864的问题,我的问题已经解决了。哈哈,我自己找了很久。。。然后突然发现的。原因是,上电后,绘图的时候,如果不清屏,除了你写入数据的地方,其他地方的内容可能是不确定的,有可能就是1,然后就会显示出黑点来。自己清屏一下就可以了。

出0入0汤圆

发表于 2012-5-5 21:49:32 | 显示全部楼层
本帖最后由 leimao 于 2012-5-5 21:50 编辑


lz,这个清屏指令时数据手册上的0x01,还是得自己写个子程序

出0入0汤圆

 楼主| 发表于 2012-5-6 00:03:24 | 显示全部楼层
leimao 发表于 2012-5-5 21:49
lz,这个清屏指令时数据手册上的0x01,还是得自己写个子程序

我个人的理解是:显示汉字和字母的那个层跟另一个可以打点画线的那层是不在一起到 ,我查过,好像是异或关系。

打点画线之前,要在打点画线那一层清屏,这个清屏是要自己写的。

0X01是对汉字和字母那一层清屏的。

出0入0汤圆

发表于 2012-5-6 14:45:28 | 显示全部楼层
lz,的确是,我今天试了下,0x01好像只是DDRAM的指令,对GDRAM没有效果,GDRAM只能填0来清屏,谢谢你啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 02:29

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

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