lcd1602读操作

[复制链接]
 楼主| schspa 发表于 2012-7-11 17:13 | 显示全部楼层 |阅读模式
写操作是没有问题的,但是读操作没有起任何作用,
 楼主| schspa 发表于 2012-7-11 17:15 | 显示全部楼层
uint lcd_read_data()       //读数据
{
        uint lcd_data;
        lcdrs=1;
        lcdrw=1;
        lcde=1;
        lcd_data=P2;
        delay(10);
        lcde=0;
        lcdrs=0;
        lcdrw=1;
        lcde=1;
        return lcd_data;
}
读数据代码,数据总线P2   delay(10)时间绝对够大的。
 楼主| schspa 发表于 2012-7-11 17:22 | 显示全部楼层
谁有什么见解帮帮忙啦。。
joyme 发表于 2012-7-11 17:37 | 显示全部楼层
        lcd_data=P2;
        delay(10);


从时序上讲,delay肯定得放到读操作之前(可以理解为从设备数据准备时间,之后读取才能读到正确稳定的数据)
        delay(10);
        lcd_data=P2;
 楼主| schspa 发表于 2012-7-11 18:12 | 显示全部楼层
不行啊,得到的值一直是P2口上次给的值,没有改变。。 4# joyme
 楼主| schspa 发表于 2012-7-11 18:29 | 显示全部楼层
4# joyme 用proteus连调时,P2口也是没有变化。
ayb_ice 发表于 2012-7-12 08:29 | 显示全部楼层
与读忙标志类似,仅是读指令,读数据的区别
 楼主| schspa 发表于 2012-7-12 19:13 | 显示全部楼层
与读忙标志类似,仅是读指令,读数据的区别
ayb_ice 发表于 2012-7-12 08:29
读的到底是什么啊。。读数据读的是当前数据指针所指的数码??
getmore 发表于 2012-7-12 19:48 | 显示全部楼层
楼主用的什么单片机,如果是51系列的单片机的话,你的P2口读数据时要先置1,再读数据。
 楼主| schspa 发表于 2012-7-12 19:55 | 显示全部楼层
9# getmore 哦,我用的就是51,我再试试。。
ningling_21 发表于 2012-7-12 20:18 | 显示全部楼层
1602一般不需要读取...
8号菜刀 发表于 2012-7-12 20:23 | 显示全部楼层
你得让en上的低电平持续一段时间。5毫秒就可以了。也就是lcde=0;delay(5);lcde=1;我是最近刚开始学习单片机的。刚学到LCD1602.
547091630 发表于 2012-7-13 18:33 | 显示全部楼层
用了一段时间的1602。。还就没读过。。
 楼主| schspa 发表于 2012-7-13 21:23 | 显示全部楼层
12# 8号菜刀 可以吗?具体在那一部分低一段时间啊??
wukunshan 发表于 2012-7-13 21:48 | 显示全部楼层
uint lcd_read_data()       //读数据
{
        uint lcd_data;
        lcde=0;
        lcdrs=1;
        lcdrw=1;
        lcde=1;
        lcd_data=P2;
        lcde=0;
        lcdrs=0;
        lcdrw=1;
       return lcd_data;
}
试试看。如果不行就检查你的写命令函数。
 楼主| schspa 发表于 2012-7-13 22:30 | 显示全部楼层
void lcd_write_com(uint com)
//写指令
{

while(lcd_read_com()&0x80);

lcdrs=0;

lcdrw=0;

lcde=1;

lcd_db=com;

delay(1);
//delay不可少

lcde=0;

lcdrw=1;
}
写命令函数应该没有什么问题啊,
先把设定指针lcd_write_com(0x80+3);
然后再n=lcd_read_com();
n的值一直就是上次lcd_db给的值,没有变过。
如果命令写对了是得到当前指针指向的数据吗??
 楼主| schspa 发表于 2012-7-13 22:39 | 显示全部楼层
已经调好了,可以用,没有问题。谢谢各位的帮忙,等会儿写个总结。
uint lcd_read_data()       //读数据
{
        uint lcd_data;
        lcd_db=0xff;
        lcde=0;
        delay(5);
        lcdrs=1;
        lcdrw=1;
        lcde=1;
        lcd_data=P2;
        lcde=0;
        lcdrs=0;
        lcdrw=1;
       return lcd_data;
}
 楼主| schspa 发表于 2012-7-13 23:11 | 显示全部楼层
void delay(uint x)
{
        uint i;
        uchar j;
        for(i=x;i>0;i--)
           for(j=2;j>0;j--)
           {;}
}
uint lcd_read_com()       //读状态
{
        uint lcd_sta;
        lcdrs=0;
        lcdrw=1;
        lcde=1;
        delay(1);
        lcd_sta=lcd_db;
        lcde=0;
        return lcd_sta;
}
void lcd_write_data(uint lcddata)                //写数据
{    while(lcd_read_com()&0x80);
         lcdrs=1;
         lcdrw=0;
         lcde=1;
         lcd_db=lcddata;
         delay(10);
         lcde=0;
}
void lcd_write_com(uint com)                        //写指令
{
        while(lcd_read_com()&0x80);
        lcdrs=0;
        lcdrw=0;
        lcde=1;
        lcd_db=com;
        delay(1);         //delay不可少
        lcde=0;
}

uint lcd_read_data()       //读数据
{
        uint lcd_data;
                lcd_db=0xff;
        lcde=0;
                delay(3);
        lcdrs=1;
        lcdrw=1;
        lcde=1;
        lcd_data=lcd_db;
        lcde=0;
       return lcd_data;
}
最终的代码,测试没有问题。
 楼主| schspa 发表于 2012-7-13 23:13 | 显示全部楼层
如果有人有什么指导可以发邮件,schspa@gmail.com欢迎进行技术交流。。
蜗牛狂奔 发表于 2012-7-14 09:26 | 显示全部楼层
先把P2数据口赋值  0XFF
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

70

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部