社区导航

 

搜索
查看: 10378|回复: 16

[求助] 51驱动的12864总是无法正确读数据,总是读出0xff,求指导,调了两天了。

[复制链接]

5

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-4-29 20:38 | 显示全部楼层 |阅读模式
LCD是st7920带字库的。

我的程序:
读数据:
uchar readdata()
{
        uchar rv=0;
        P0=0xff;
        LCD_RS = 1;
        LCD_RW = 1;
        LCD_E=0;
        delay1(10)  //延时10微秒
        LCD_E=1;
        delay1(100);  //延时100微秒
        rv=P0;
        LCD_E=0;
        rv=Convert(rv);   // P0口是反接的,所以写了个算法把顺序倒过来
        return(rv);         
}

画点的函数:

void drawpoint(uchar x,char y)  //以左边界的中点为原点 y [-32,31] x[0,127]
{
        uchar modx1,modx2;
        uchar wr1=0,wr2=0;
        modx1=x/16;
        modx2=x%16;
        WriteCommandLCD(0x34);
        WriteCommandLCD(0x36);//打开绘图开关
        if(y<0)
                {
                    WriteCommandLCD(0x7f-y); //设置垂直坐标
                        WriteCommandLCD(0x88+modx1); //设置水平坐标
                        readdata();
                        wr1=readdata();
                        wr2=readdata();
                        //delay1(4);
                        WriteCommandLCD(0x7f-y); //设置垂直坐标
                        WriteCommandLCD(0x88+modx1); //设置水平坐标
                        if(modx2>8)
                                {
                                        WriteDataLCD(wr1|0x00);
                                        WriteDataLCD(wr2|(0x01<<(15-modx2)));       
                                }
                        if(modx2<8)
                        {
                                WriteDataLCD(wr1|(0x01<<(7-modx2)));
                                WriteDataLCD(wr2|0x00);
                        }
                }
        if(y>=0)
                {
                         WriteCommandLCD((0x80+31-y)); //设置垂直坐标
                        WriteCommandLCD(0x80+modx1); //设置水平坐标
                        readdata();
                        wr1=readdata();
                        wr2=readdata();
                        //delay1(4);
                        WriteCommandLCD((0x80+31-y)); //设置垂直坐标
                        WriteCommandLCD(0x80+modx1); //设置水平坐标
                        if(modx2>8)
                                {
                                        WriteDataLCD(wr1|0x00);
                                        WriteDataLCD(wr2|(0x01<<(15-modx2)));       
                                }
                        if(modx2<8)
                                {
                                        WriteDataLCD(wr1|(0x01<<(7-modx2)));
                                        WriteDataLCD(wr2|0x00);
                                }

                }       
        WriteCommandLCD(0x30);//返回基本指令集设定状态
}

uchar Convert(uchar In_Date)
{
    uchar i, Out_Date = 0, temp = 0;
    for(i=0; i<8; i++)
    {
        temp = (In_Date >> i) & 0x01;
        Out_Date |= (temp << (7 - i));
    }
    return Out_Date;
}       

下面三个函数应该没什么问题,也贴出来。

写指令:
void WriteCommandLCD(uchar Command)
{
        LCD_E = 0;   
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_Data = Convert(Command);
        LCD_E = 1;
        delay(1);
        LCD_E = 0;
}
写数据:
void WriteDataLCD(uchar Data)
{
        LCD_E = 0;
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_Data = Convert(Data);
        LCD_E = 1;
        delay(1);
        LCD_E = 0;
}

初始化:
void LCDInit(void)
{
        WriteCommandLCD(0x34);
        delay(1);
        WriteCommandLCD(0x30);
        delay(1);
        WriteCommandLCD(0x0c);
        delay(1);
        WriteCommandLCD(0x01);
        delay(1);
}

调试的结果是,如果没有读数据这一步,12864可以正确在相应位置显示一个点,但是因为没有读数据,不能在同一个坐标下面重复画两个点。
如果加了读数据,无法正确显示一个点,而是16个点,即读出来的数据总是0xff。
看了N遍datasheet,改了各种延时,时序也变了好多种,老是出现同样的问题。
我的12864没有问题,而且我换了一个用,结果没变。
此帖出自51单片机论坛

5

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2010-4-29 20:40 | 显示全部楼层
太悲剧了,调了两天,心力交瘁。= =

回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2010-4-29 21:28 | 显示全部楼层
= =自己顶。

回复

使用道具 举报

3196

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2010-4-30 15:04 | 显示全部楼层
看看读的时序,另外为什么要读呢
不断地学习,才会有创新!
淘宝小店:手机、qq点卡、游戏点卡自动充值 http://shop63727265.taobao.com/

回复

使用道具 举报

8910

TA的帖子

0

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

发表于 2010-4-30 15:10 | 显示全部楼层
先看看,研究研究!
一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!

回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2010-5-2 21:17 | 显示全部楼层

回复 4楼 lixiaohai8211 的帖子

不读数据的话没办法在同一个字节宽度下重复画点呀。

回复

使用道具 举报

40

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2010-9-18 00:57 | 显示全部楼层
我认为是没有判忙的问题,加上判忙标志应该可以的

回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2011-3-1 18:21 | 显示全部楼层

这个问题

我也遇到这个问题了,就是读取时要先使E=0;再接受数据data=P0;你试试吧,这样就不是0xff了。。。


回复

使用道具 举报

292

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2011-3-1 19:43 | 显示全部楼层

回复 8楼 lenghaixv 的帖子

嗯  LZ的读时序有问题啊。
科学家研究已有的世界,工程师创造未来的世界!

回复

使用道具 举报

108

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2011-3-2 17:05 | 显示全部楼层
研究研究一下

回复

使用道具 举报

57

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2011-5-5 23:38 | 显示全部楼层
我现在也是同样的问题,但是楼主的时序感觉没什么问题呀?读取前已经将E拉低 然后又拉高 然后再读数据 时序不就是这样么?请教遇到这块问题的高手帮解答一下 谢谢
not so bad!

回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2011-5-24 21:44 | 显示全部楼层
我也是同样的问题,读出的总是0xff,不知道什么原因,时序这些都没问题的啊

回复

使用道具 举报

2186

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

发表于 2011-5-25 10:25 | 显示全部楼层
一般这种问题是硬件造成可,可能硬件就没法读取
还有你为何要读呢,你打算把液晶上的内存当缓存用?这样是不好的,速度太慢,一般都是专门开辟一个小的显示缓冲区

回复

使用道具 举报

2186

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

发表于 2011-5-25 10:34 | 显示全部楼层
1.7920在设定好要读的地址后,要先空读一次,然后才能依次读出两个字节的数据。

2.7920串行模式的数据传输方向是单向,顾不能串行读取数据

回复

使用道具 举报

1698

TA的帖子

0

TA的资源

裸片初长成(高级)

Rank: 12Rank: 12Rank: 12

发表于 2011-5-25 11:58 | 显示全部楼层
建议先研究下别人的现成的例程,然后经过适当修改为自己所用,怎样弄到别人的例程你懂的。

回复

使用道具 举报

197

TA的帖子

2

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2011-5-30 09:07 | 显示全部楼层

回复 楼主 phdhe 的帖子

不知道是楼主什么意思,是不能读取EEPROM数据,还是读到数据液晶屏不能正常显示?这个要弄清楚的,液晶不能显示我这里有个好的驱动程序,可以留个邮箱发给你的
zhangqi123zq@126.com

回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2015-8-6 13:04 | 显示全部楼层
楼主解决了吗?

回复

使用道具 举报

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

关闭

站长推荐上一条 /4 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-2-26 01:29 , Processed in 0.461246 second(s), 18 queries , Gzip On, MemCache On.

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