21ic电子技术开发论坛 单片机与嵌入式系统 侃单片机论坛 lcd1602读操作
发新帖我要提问
12下一页
返回列表
打印

lcd1602读操作

[复制链接]
6514|21
手机看帖
扫描二维码
随时随地手机跟帖
沙发
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;

使用特权

评论回复
5
schspa|  楼主 | 2012-7-11 18:12 | 只看该作者
不行啊,得到的值一直是P2口上次给的值,没有改变。。 4# joyme

使用特权

评论回复
6
schspa|  楼主 | 2012-7-11 18:29 | 只看该作者
4# joyme 用proteus连调时,P2口也是没有变化。

使用特权

评论回复
7
ayb_ice| | 2012-7-12 08:29 | 只看该作者
与读忙标志类似,仅是读指令,读数据的区别

使用特权

评论回复
8
schspa|  楼主 | 2012-7-12 19:13 | 只看该作者
与读忙标志类似,仅是读指令,读数据的区别
ayb_ice 发表于 2012-7-12 08:29
读的到底是什么啊。。读数据读的是当前数据指针所指的数码??

使用特权

评论回复
9
getmore| | 2012-7-12 19:48 | 只看该作者
楼主用的什么单片机,如果是51系列的单片机的话,你的P2口读数据时要先置1,再读数据。

使用特权

评论回复
10
schspa|  楼主 | 2012-7-12 19:55 | 只看该作者
9# getmore 哦,我用的就是51,我再试试。。

使用特权

评论回复
11
ningling_21| | 2012-7-12 20:18 | 只看该作者
1602一般不需要读取...

使用特权

评论回复
12
8号菜刀| | 2012-7-12 20:23 | 只看该作者
你得让en上的低电平持续一段时间。5毫秒就可以了。也就是lcde=0;delay(5);lcde=1;我是最近刚开始学习单片机的。刚学到LCD1602.

使用特权

评论回复
13
547091630| | 2012-7-13 18:33 | 只看该作者
用了一段时间的1602。。还就没读过。。

使用特权

评论回复
14
schspa|  楼主 | 2012-7-13 21:23 | 只看该作者
12# 8号菜刀 可以吗?具体在那一部分低一段时间啊??

使用特权

评论回复
15
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;
}
试试看。如果不行就检查你的写命令函数。

使用特权

评论回复
16
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给的值,没有变过。
如果命令写对了是得到当前指针指向的数据吗??

使用特权

评论回复
17
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;
}

使用特权

评论回复
18
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;
}
最终的代码,测试没有问题。

使用特权

评论回复
19
schspa|  楼主 | 2012-7-13 23:13 | 只看该作者
如果有人有什么指导可以发邮件,schspa@gmail.com欢迎进行技术交流。。

使用特权

评论回复
20
蜗牛狂奔| | 2012-7-14 09:26 | 只看该作者
先把P2数据口赋值  0XFF

使用特权

评论回复
下一页 »
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

70

帖子

0

粉丝
关闭 热门推荐
快速回复 在线客服 返回列表 返回顶部