打印

请教:LCD1602在MCU晶振稍高时显示乱码?

[复制链接]
3493|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
decheng01|  楼主 | 2007-1-17 10:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机是用飞利浦的P89V51RD2,程序如下,根据“电子驿站”的代码改编而成,原连接为http://www.ourmpu.com/mcujx/lcdxx08.htm,程序在12MHz时显示正常,而22.1184,30,40MHz就显示乱码,20MHz时好时坏。
芯片资料:http://www.21icsearch.com/searchpdf/default.asp?admin=
#include<reg51f.h>
#include<intrins.h>//_nop_()

#define DATA     P0
sbit RS=P2^7;
sbit RW=P2^6; //定义引脚
sbit E=P2^5;

void ReadStatus(void);
void WriteCommand(void);

void main()
{
    ReadStatus();//判断液晶忙状态?
    WriteCommand();

    DATA=0x01;//清屏
    WriteCommand();

    DATA=0x38;//
    WriteCommand();

    DATA=0x0F;
    WriteCommand();

    DATA=0x06;
    WriteCommand();
/**************************************************************/

    DATA=0x80;//第一行第一个字符地址
    WriteCommand();
     
    DATA=0x41;//字母A的代码
    RS=1;
    RW=0;
    E=0;
    ReadStatus();//判断液晶忙状态?
    E=1;    
/**************************************************************/
    while(1);
}

//写指令:RS=0,RW=0,E=1,D0~D7=指令代码
void WriteCommand(void) //写入控制命令的子程序
{
    RS=0;
    RW=0;
    E=0;
    E=0;//NOP
    ReadStatus();
    E=1;
}

//检测LCD忙状态; 读状态:RS=0,RW=1,E=1,输出:D0~D7=状态字
void ReadStatus(void)//判断液晶是否忙得子程序
{
    do{
        DATA=0xFF;
        RS=0;
        RW=1;
        E=0;
        E=0;//NOP
        E=1;
       }
    while(DATA&0x80);//为高电平就循环等待
}

相关链接:http://www.ourmpu.com/mcujx/lcdxx08.htm

相关帖子

沙发
daguang72| | 2007-1-17 11:48 | 只看该作者

很简单

你把模拟读写的时间用软件延长些,1602的驱动芯片速度慢,跟不上单片机的速度

使用特权

评论回复
板凳
decheng01|  楼主 | 2007-1-17 11:55 | 只看该作者

谢谢了!

能具体说一下在哪个地方改,应该怎样去改吗?
我都弄了两天多了,现在都不知道从那一行下手好!
thx!

使用特权

评论回复
地板
lixun00| | 2007-1-17 12:48 | 只看该作者

注意时序

使用特权

评论回复
5
computer00| | 2007-1-17 13:59 | 只看该作者

在每个LCD的操作之后加个空操作

例如:


void WriteCommand(void) //写入控制命令的子程序
{
    RS=0; RS=0;
    RW=0; RW=0;
    E=0;  E=0;
    E=0;//NOP
    ReadStatus();
    E=1; E=1;
}

使用特权

评论回复
6
zhichengdz| | 2007-1-17 20:12 | 只看该作者

延时多一点试试

使用特权

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

本版积分规则

1

主题

8

帖子

0

粉丝