12185|16

4

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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

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单片机论坛

最新回复

楼主解决了吗?  详情 回复 发表于 2015-8-6 13:04
点赞 关注
 

回复
举报

4

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
太悲剧了,调了两天,心力交瘁。= =
此帖出自51单片机论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
= =自己顶。
此帖出自51单片机论坛
 
 
 

回复

2955

帖子

0

TA的资源

纯净的硅(初级)

4
 
看看读的时序,另外为什么要读呢
此帖出自51单片机论坛
 
个人签名不断地学习,才会有创新!
淘宝小店:手机、qq点卡、游戏点卡自动充值 http://shop63727265.taobao.com/
 
 

回复

6892

帖子

0

TA的资源

五彩晶圆(高级)

5
 
先看看,研究研究!
此帖出自51单片机论坛
 
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

6
 

回复 4楼 lixiaohai8211 的帖子

不读数据的话没办法在同一个字节宽度下重复画点呀。
此帖出自51单片机论坛
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

7
 
我认为是没有判忙的问题,加上判忙标志应该可以的
此帖出自51单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

8
 

这个问题

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

此帖出自51单片机论坛
 
 
 

回复

289

帖子

0

TA的资源

一粒金砂(中级)

9
 

回复 8楼 lenghaixv 的帖子

嗯  LZ的读时序有问题啊。
此帖出自51单片机论坛
 
个人签名科学家研究已有的世界,工程师创造未来的世界!
 
 

回复

108

帖子

0

TA的资源

一粒金砂(中级)

10
 
研究研究一下
此帖出自51单片机论坛
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(中级)

11
 
我现在也是同样的问题,但是楼主的时序感觉没什么问题呀?读取前已经将E拉低 然后又拉高 然后再读数据 时序不就是这样么?请教遇到这块问题的高手帮解答一下 谢谢
此帖出自51单片机论坛
 
个人签名not so bad!
 
 

回复

1

帖子

0

TA的资源

一粒金砂(中级)

12
 
我也是同样的问题,读出的总是0xff,不知道什么原因,时序这些都没问题的啊
此帖出自51单片机论坛
 
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

13
 
一般这种问题是硬件造成可,可能硬件就没法读取
还有你为何要读呢,你打算把液晶上的内存当缓存用?这样是不好的,速度太慢,一般都是专门开辟一个小的显示缓冲区
此帖出自51单片机论坛
 
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

14
 
1.7920在设定好要读的地址后,要先空读一次,然后才能依次读出两个字节的数据。

2.7920串行模式的数据传输方向是单向,顾不能串行读取数据
此帖出自51单片机论坛
 
 
 

回复

1634

帖子

0

TA的资源

裸片初长成(高级)

15
 
建议先研究下别人的现成的例程,然后经过适当修改为自己所用,怎样弄到别人的例程你懂的。
此帖出自51单片机论坛
 
 
 

回复

165

帖子

2

TA的资源

纯净的硅(高级)

16
 

回复 楼主 phdhe 的帖子

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

回复

1

帖子

0

TA的资源

一粒金砂(初级)

17
 
楼主解决了吗?
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表