微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助lcd1602怎么不显示数据求助求助!

求助lcd1602怎么不显示数据求助求助!

时间:10-02 整理:3721RD 点击:
#include <reg52.h>
/********IO引脚定义***********************************************************/
sbit LCD_RS=P2^7;//定义引脚
sbit LCD_RW=P2^6;
sbit LCD_E=P2^5;
/********宏定义***********************************************************/
#define LCD_Data P0
#define Busy    0x80 //用于检测LCD状态字中的Busy标识
/********数据定义*************************************************************/
unsigned char code uctech[] = {"Happy every day"};
unsigned char code net[] = {"QQ:342965129"};
/********函数声明*************************************************************/
void WriteDataLCD(unsigned char WDLCD);                                        //写数据
void WriteCommandLCD(unsigned char WCLCD,BuysC);                //写命令
unsigned char ReadDataLCD(void);                                                //读数据
unsigned char ReadStatusLCD(void);                                                //读状态
void LCDInit(void);                                                                                //初始化
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);                        //相应坐标显示字节内容
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);        //相应坐标开始显示一串内容
void Delay5Ms(void);                                                                        //延时
void Delay400Ms(void);                                                                        //延时
/**********************************************************
【函数功能】主函数
【实现功能】实现系统功能
**********************************************************/       
void main(void)
{
        Delay400Ms();         //启动等待,等LCD讲入工作状态
        LCDInit();                 //初始化
        Delay5Ms();         //延时片刻(可不要)
        DisplayListChar(0, 0, uctech);
        DisplayListChar(1, 5, net);
        ReadDataLCD();        //测试用句无意义
        while(1);
}
/**********************************************************
【函数功能】液晶1602的写数据函数
【函数入口】unsigned char WDLCD)
【函数出口】无
【实现功能】实现液晶1602的写数据
**********************************************************/
void WriteDataLCD(unsigned char WDLCD)
{
        ReadStatusLCD(); //检测忙
        LCD_Data = WDLCD;
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_E = 0;                 //若晶振速度太高可以在这后加小的延时
        LCD_E = 0;                 //延时
        LCD_E = 1;
}
       
/**********************************************************
【函数功能】液晶1602的写指令函数
【函数入口】unsigned char WCLCD,BuysC
【函数出口】无
【实现功能】实现液晶1602的写指令
**********************************************************/
void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
{
        if (BuysC) ReadStatusLCD(); //根据需要检测忙
        LCD_Data = WCLCD;
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_E = 0;
        LCD_E = 0;
        LCD_E = 1;
}
/**********************************************************
【函数功能】读数据液晶1602函数
【函数入口】无
【函数出口】LCD_Data
【实现功能】实现液晶1602的数据功能
**********************************************************/       
unsigned char ReadDataLCD(void)
{
        LCD_RS = 1;
        LCD_RW = 1;
        LCD_E = 0;
        LCD_E = 0;
        LCD_E = 1;
        return(LCD_Data);
}
/**********************************************************
【函数功能】读液晶1602的状态函数
【函数入口】无
【函数出口】LCD_Data
【实现功能】实现液晶1602的状态读取
**********************************************************/       
unsigned char ReadStatusLCD(void)
{
        LCD_Data = 0xFF;
        LCD_RS = 0;
        LCD_RW = 1;
        LCD_E = 0;
        LCD_E = 0;
        LCD_E = 1;
        while (LCD_Data & Busy); //检测忙信号
        return(LCD_Data);
}
/**********************************************************
【函数功能】液晶1602初始化函数
【函数入口】无
【函数出口】无
【实现功能】实现液晶1602初始化
**********************************************************/
void LCDInit(void)
{
        LCD_Data = 0;
        WriteCommandLCD(0x38,0);         //三次模式设置,不检测忙信号
        Delay5Ms();
        WriteCommandLCD(0x38,0);
        Delay5Ms();
        WriteCommandLCD(0x38,0);
        Delay5Ms();
        WriteCommandLCD(0x38,1);         //显示模式设置,开始要求每次检测忙信号
        WriteCommandLCD(0x08,1);         //关闭显示
        WriteCommandLCD(0x01,1);         //显示清屏
        WriteCommandLCD(0x06,1);         //显示光标移动设置
        WriteCommandLCD(0x0C,1);         //显示开及光标设置
}
/**********************************************************
【函数功能】按指定位置显示一个字符
【函数入口】unsigned char X, unsigned char Y, unsigned char DData
【函数出口】无
【实现功能】实现指定位置显示一个字符
**********************************************************/               
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
        Y &= 0x1;
        X &= 0xF;                                 //限制X不能大于15,Y不能大于1
        if (Y) X |= 0x40;                 //当要显示第二行时地址码+0x40;
        X |= 0x80;                         //算出指令码
        WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
        WriteDataLCD(DData);
}
/**********************************************************
【函数功能】按指定位置显示一串字符
【函数入口】unsigned char X, unsigned char Y, unsigned char code *DData
【函数出口】无
【实现功能】实现指定位置显示一串字符
**********************************************************/       
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
        unsigned char ListLength;
        ListLength = 0;
        Y &= 0x1;
        X &= 0xF;                                 //限制X不能大于15,Y不能大于1
        while (DData[ListLength]>=0x20){ //若到达字串尾则退出
                   if (X <= 0xF){                 //X坐标应小于0xF
                     DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
                     ListLength++;
                     X++;
            }
          }
}
       
/**********************************************************
【函数功能】延时函数
【函数入口】无
【函数出口】无
【实现功能】软件延时5个毫秒
**********************************************************/
void Delay5Ms(void)
{
        unsigned int TempCyc = 5552;
        while(TempCyc--);
}
/**********************************************************
【函数功能】延时函数
【函数入口】无
【函数出口】无
【实现功能】软件延时400个毫秒
**********************************************************/
void Delay400Ms(void)
{
        unsigned char TempCycA = 5;
        unsigned int TempCycB;
        while(TempCycA--){
                  TempCycB=7269;
                  while(TempCycB--);
        }
}



调一下可调电阻

看LCD屏的显示情况应该需要调一下可调电阻的阻值。

调试了  只能看见很浅的小黑方框   我的程序和接口有问题么

调试了  只能看见很浅的小黑方框   我的程序和接口有问题么

看程序总是有种美女找茬的感觉。我有现成的驱动程序,程序没用判忙语句。你是要程序,还是要指出错误之处。

那还是程序吧

#include<reg51.h>
char code fine1[16]={""};
char code fine2[16]={""};
sbit rs=P2^6;
sbit rw=P2^5;
sbit ep=P2^7;
void delay(int z)
{
   int x,y;
   for(x=100;x>0;x--)
     for(y=z;y>0;y--);
}
bit ifinbusy()
{
   bit a;
   rs=0;
   rw=1;
   delay(3);
   ep=1;
   a=(bit)(P0&0x80);
   ep=0;
   return a;
}
void wml(char min)
{
   rs=0;
   rw=0;
   delay(3);
   ep=1;
   P0=min;
   ep=0;
}
void wsj(char dat)
{
   rs=1;
   rw=0;
   delay(3);
   ep=1;
   P0=dat;
   ep=0;
}
void start()
{
   while(ifinbusy());
   wml(0x38);
   delay(3);
   wml(0x80);
   delay(3);
   wml(0x0c);
   delay(3);
   wml(0x06);
   delay(3);
   wml(0x18);
   delay(3);
}
void main()
{
   int k;
   start();
   for(k=0;k<16;k++)
    {
           wsj(fine1[k]);
           delay(3);
    }
        while(ifinbusy());
    wml(0x80+0x40);
   for(k=0;k<16;k++)
   {
       wsj(fine2[k]);
           delay(3);
   }
    //for(k=0;k<1;k++)
   //{
              //wml(0x18);
       //delay(200);
   //}
}
试一下这个程序吧,显示内容增加加上去看看

怎么给你,联proteus仿真给你

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top