找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5054|回复: 26
打印 上一主题 下一主题
收起左侧

15w4k32s4单片机接上1602液晶屏,液晶屏只显示白块,烧写后也是白块

  [复制链接]
跳转到指定楼层
楼主
ID:839796 发表于 2020-12-13 22:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1602显示屏只显示白块,烧写后同样如此。在网上找的程序:
#include "stc15.h"
/********IO引脚定义***********************************************************/
sbit LCD_RS=P1^2;//定义引脚
sbit LCD_RW=P1^1;
sbit LCD_E=P1^0;

/********宏定义***********************************************************/
#define LCD_Data P0
#define Busy    0x80 //用于检测LCD状态字中的Busy标识

/********数据定义*************************************************************/
unsigned char code uctech[] = {"Happy every day"};
unsigned char code net[] = {"www.lydz8.com"};

/********函数声明*************************************************************/
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);
}

/***********写数据********************************************************/       
void WriteDataLCD(unsigned char WDLCD)
{
        ReadStatusLCD(); //检测忙
        LCD_Data = WDLCD;
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_E = 0;                 //若晶振速度太高可以在这后加小的延时
        LCD_E = 0;                 //延时
        LCD_E = 1;
}

/***********写指令********************************************************/       
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;
}

/***********读数据********************************************************/       
unsigned char ReadDataLCD(void)
{
        LCD_RS = 1;
        LCD_RW = 1;
        LCD_E = 0;
        LCD_E = 0;
        LCD_E = 1;
        return(LCD_Data);
}

/***********读状态*******************************************************/       
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);
}

/***********初始化********************************************************/       
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);         //显示开及光标设置
}

/***********按指定位置显示一个字符*******************************************/       
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);
}

/***********按指定位置显示一串字符*****************************************/       
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++;
            }
          }
}

/***********短延时********************************************************/       
void Delay5Ms(void)
{
        unsigned int TempCyc = 5552;
        while(TempCyc--);
}

/***********长延时********************************************************/       
void Delay400Ms(void)
{
        unsigned char TempCycA = 5;
        unsigned int TempCycB;
        while(TempCycA--){
                  TempCycB=7269;
                  while(TempCycB--);
        }
}


51hei图片20201213210431.jpg (35.08 KB, 下载次数: 63)

51hei图片20201213210431.jpg

51hei图片20201213210753.png (58.26 KB, 下载次数: 66)

51hei图片20201213210753.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2020-12-13 22:59 | 只看该作者
51hei搜索"1602 方块"看看大家是怎么解决的这个问题:
http://www.51hei.com/bbs/dpj-168078-1.html
http://www.51hei.com/bbs/dpj-168643-1.html
回复

使用道具 举报

板凳
ID:839796 发表于 2020-12-13 23:37 | 只看该作者
也找了个这样的代码,烧写后一样都是白块
#include<stc15.h>         
#include<intrins.h>


    #define uchar unsigned char
#define uint unsigned int
sbit RS = P1^2;          //定义端口
sbit RW = P1^1;
sbit EN = P1^0;
sbit beep=P3^4;
sbit k2=P3^2;
sbit k3=P3^3;
sbit Led=P3^5;

#define RS_CLR RS=0            //选择命令
#define RS_SET RS=1                   //选择数据

#define RW_CLR RW=0            //写
#define RW_SET RW=1            //读

#define EN_CLR EN=0                   //使能位
#define EN_SET EN=1

#define DataPort P0

/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
//void DelayUs2x(unsigned char t)
//{   
// while(--t);
//}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
//void DelayMs(unsigned char t)
//{
//     
// while(t--)
// {
//     //大致延时1mS
//     DelayUs2x(245);
//         DelayUs2x(245);
// }
//}

void Delay1ms()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
                while (--j);
        } while (--i);
}

/*------------------------------------------------
              判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
RS_CLR;
RW_SET;
EN_CLR;
_nop_();    //延时一个指令周期,一个指令周期为12MHZ
EN_SET;
return (bit)(DataPort & 0x80);//返回值强制转换成位的形式,dataport与0x80得出的结果1ture,0false
}                                                           //读LCD数据口,只要最高位bit7,为1忙,为0不忙
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{  
while(LCD_Check_Busy()); //忙则等待,忙返回1,那么while(1)一直循环下去
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙则等待 (判忙)
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}

/*------------------------------------------------
                清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
Delay1ms()   ;
}
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{     
if (y == 0)
        {     
         LCD_Write_Com(0x80 + x);     //表示第一行
        }
else
        {      
        LCD_Write_Com(0xC0 + x);      //表示第二行
        }        
while (*s)
        {     
LCD_Write_Data( *s);   //通过指针形式,依次写入字符串
s ++;     
        }
}
/*------------------------------------------------
              写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{     
if (y == 0)                      //设置坐标,若y!=0则第一行写满
        {     
        LCD_Write_Com(0x80 + x); //第一排以0x80起始,以写命令的方式写入,写之前判忙  
        }   
else
        {     
        LCD_Write_Com(0xC0 + x); //第二排以0xc0起始,以写命令的方式写入,写之前判忙   
        }        
LCD_Write_Data( Data);  
}
/*------------------------------------------------
              初始化函数
------------------------------------------------*/
void LCD_Init(void)
{
beep=0;
        Led=1;
   LCD_Write_Com(0x38);    /*显示模式设置*/
   Delay1ms();
   LCD_Write_Com(0x38);
   Delay1ms();
   LCD_Write_Com(0x38);
   Delay1ms();
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*显示关闭*/
   LCD_Write_Com(0x01);    /*显示清屏*/
   LCD_Write_Com(0x06);    /*显示光标移动设置*/
   Delay1ms();
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
   }



/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main(void)
{
LCD_Init(); //对光标设置,以及屏幕清屏
LCD_Clear();//清屏
while (1)
{  
  LCD_Write_Char(3,3,'o');
  LCD_Write_Char(2,2,'k');
  LCD_Write_String(4,1,"hello world");
  
  while(1);//
}
}
回复

使用道具 举报

地板
ID:213173 发表于 2020-12-14 08:08 | 只看该作者
gagaga123 发表于 2020-12-13 23:37
也找了个这样的代码,烧写后一样都是白块
#include         
#include

软件都是基于硬件条件编写的,直接使用别人的程序不考虑其硬件差异往往不能成功。液晶屏只显示白块说明LCD初始化失败。问题多数出在LCD驱动码时序不正确。
回复

使用道具 举报

5#
ID:277550 发表于 2020-12-14 09:56 | 只看该作者
除了程序,还有 细心调节屏的对比度

~~~~~~~
回复

使用道具 举报

6#
ID:748788 发表于 2020-12-14 10:17 | 只看该作者
先做个仿真看看能否正常显示。
回复

使用道具 举报

7#
ID:429356 发表于 2020-12-14 11:50 | 只看该作者
调一下亮度定位器,把亮度调低一点。
回复

使用道具 举报

8#
ID:343102 发表于 2020-12-14 20:16 | 只看该作者
stc单片机运行速度快,需要增加延时。stc官网上有1602的显示程序。
回复

使用道具 举报

9#
ID:517951 发表于 2020-12-14 21:01 | 只看该作者
上电之后屏未初始化成功,1602就是这种显示状态。
1)首先要确定一下显示屏是不是好的,
2)第二再量下屏的Rs,RW,E,D0-D7连接是否可靠。
3)写指令,数据时序的时间是否足够,1602的读写速度较慢,运行速度快单片机需要有足够的延时、尤其E信号
回复

使用道具 举报

10#
ID:155507 发表于 2020-12-14 22:30 | 只看该作者
写指令,数据时序






回复

使用道具 举报

11#
ID:839796 发表于 2020-12-15 23:24 | 只看该作者
angmall 发表于 2020-12-14 22:30
写指令,数据时序

我发现 网上的1602液晶屏写入程序的时候用到了P0或P1这种单一接口  ,但是我单片机连接用到了P0和P2接口,这应该怎么半
回复

使用道具 举报

12#
ID:839796 发表于 2020-12-15 23:52 | 只看该作者
我刚刚发现了一个问题,请大佬们帮忙看看是不是这个问题造成的只显示白块
http://www.51hei.com/bbs/dpj-199847-1.html
(出处: http://www.51hei.com/bbs/)
回复

使用道具 举报

13#
ID:639102 发表于 2020-12-16 00:26 | 只看该作者
51hei团团 发表于 2020-12-13 22:59
51hei搜索"1602 方块"看看大家是怎么解决的这个问题:
http://www.51hei.com/bbs/dpj-168078-1.html
http: ...


也找了个这样的代码,烧写后一样都是白块
#include<stc15.h>         
#include<intrins.h>


    #define uchar unsigned char
#define uint unsigned int
sbit RS = P1^2;          //定义端口
sbit RW = P1^1;
sbit EN = P1^0;
sbit beep=P3^4;
sbit k2=P3^2;
sbit k3=P3^3;
sbit Led=P3^5;

#define RS_CLR RS=0            //选择命令
#define RS_SET RS=1                   //选择数据

#define RW_CLR RW=0            //写
#define RW_SET RW=1            //读

#define EN_CLR EN=0                   //使能位
#define EN_SET EN=1

#define DataPort P0

/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
//void DelayUs2x(unsigned char t)
//{   
// while(--t);
//}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
//void DelayMs(unsigned char t)
//{
//     
// while(t--)
// {
//     //大致延时1mS
//     DelayUs2x(245);
//         DelayUs2x(245);
// }
//}

void Delay1ms()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
                while (--j);
        } while (--i);
}

/*------------------------------------------------
              判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
RS_CLR;
RW_SET;
EN_CLR;
_nop_();    //延时一个指令周期,一个指令周期为12MHZ
EN_SET;
return (bit)(DataPort & 0x80);//返回值强制转换成位的形式,dataport与0x80得出的结果1ture,0false
}                                                           //读LCD数据口,只要最高位bit7,为1忙,为0不忙
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{  
while(LCD_Check_Busy()); //忙则等待,忙返回1,那么while(1)一直循环下去
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙则等待 (判忙)
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}

/*------------------------------------------------
                清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
Delay1ms()   ;
}
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{     
if (y == 0)
        {     
         LCD_Write_Com(0x80 + x);     //表示第一行
        }
else
        {      
        LCD_Write_Com(0xC0 + x);      //表示第二行
        }        
while (*s)
        {     
LCD_Write_Data( *s);   //通过指针形式,依次写入字符串
s ++;     
        }
}
/*------------------------------------------------
              写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{     
if (y == 0)                      //设置坐标,若y!=0则第一行写满
        {     
        LCD_Write_Com(0x80 + x); //第一排以0x80起始,以写命令的方式写入,写之前判忙  
        }   
else
        {     
        LCD_Write_Com(0xC0 + x); //第二排以0xc0起始,以写命令的方式写入,写之前判忙   
        }        
LCD_Write_Data( Data);  
}
/*------------------------------------------------
              初始化函数
------------------------------------------------*/
void LCD_Init(void)
{
beep=0;
        Led=1;
   LCD_Write_Com(0x38);    /*显示模式设置*/
   Delay1ms();
   LCD_Write_Com(0x38);
   Delay1ms();
   LCD_Write_Com(0x38);
   Delay1ms();
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*显示关闭*/
   LCD_Write_Com(0x01);    /*显示清屏*/
   LCD_Write_Com(0x06);    /*显示光标移动设置*/
   Delay1ms();
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
   }



/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main(void)
{
LCD_Init(); //对光标设置,以及屏幕清屏
LCD_Clear();//清屏
while (1)
{  
  LCD_Write_Char(3,3,'o');
  LCD_Write_Char(2,2,'k');
  LCD_Write_String(4,1,"hello world");
  
  while(1);//
}
}
回复

使用道具 举报

14#
ID:839796 发表于 2020-12-16 01:15 来自手机 | 只看该作者
rayin 发表于 2020-12-14 21:01
上电之后屏未初始化成功,1602就是这种显示状态。
1)首先要确定一下显示屏是不是好的,
2)第二再量下屏 ...

我的1602液晶屏D0-D7接了两个接口,例如D0-D3接的P0, D4-D7接的P3应该怎么办
回复

使用道具 举报

15#
ID:155507 发表于 2020-12-16 06:31 | 只看该作者
gagaga123 发表于 2020-12-16 01:15
我的1602液晶屏D0-D7接了两个接口,例如D0-D3接的P0, D4-D7接的P3应该怎么办

给你写一个异组端口驱动LCD示例

  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
  5. sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
  6. sfr P0M1 = 0x93;
  7. sfr P0M0 = 0x94;
  8. sfr P2M1 = 0x95;
  9. sfr P2M0 = 0x96;
  10. sfr P3M1 = 0xB1;
  11. sfr P3M0 = 0xB2;

  12. sbit LCD_RW=P1^1;
  13. sbit LCD_RS=P1^2;      
  14. sbit LCD_EN=P1^0;      

  15. sbit code0=P0^3;                           //定义LCD数据端口
  16. sbit code1=P0^2;
  17. sbit code2=P0^1;
  18. sbit code3=P0^0;
  19. sbit code4=P2^7;
  20. sbit code5=P2^6;
  21. sbit code6=P2^5;
  22. sbit code7=P2^4;      

  23. uchar table1[]="0123456789ABCDEFG";        //第一行
  24. uchar table2[]="HIJKLMNOPQRSTUVWX";        //第二行


  25. void PX(uchar i)                           //写入8位数据
  26. {   
  27.         code0=i&0x01;i>>=1;      
  28.         code1=i&0x01;i>>=1;
  29.         code2=i&0x01;i>>=1;
  30.         code3=i&0x01;i>>=1;
  31.         code4=i&0x01;i>>=1;
  32.         code5=i&0x01;i>>=1;
  33.         code6=i&0x01;i>>=1;
  34.         code7=i&0x01;
  35. }
  36. /*******100us延时程序********/
  37. void delay(uint x)
  38. {
  39.         uint a,b;
  40.         for(a=x;a>0;a--)
  41.         for(b=10;b>0;b--);
  42. }
  43. /*******液晶写指令程序********/
  44. void write_com(uchar com)
  45. {
  46.         LCD_RW=0;
  47.         LCD_EN=0;        //初始设置LCD_EN低电平
  48.         LCD_RS=0;        //允许写指令
  49.         PX(com);         //传递指令
  50.         delay(10);       //延时1ms
  51.         LCD_EN=1;        //使能写入
  52.         delay(10);        //延时1ms
  53.         LCD_EN=0;        //低跳变执行
  54.        
  55. }
  56. /*******液晶写数据程序********/
  57. void write_date(uchar date)
  58. {
  59.         LCD_RW=0;
  60.         LCD_RS=1;        //允许写数据
  61.         PX(date);        //传递数据
  62.         delay(10);        //延时1ms
  63.         LCD_EN=1;        //使能写入
  64.         delay(10);        //延时1ms
  65.         LCD_EN=0;        //低跳变执行
  66.        
  67. }
  68. /*******液晶初始化程序********/
  69. void init()                //设置显示模式、
  70. {

  71.         write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
  72.         write_com(0x01);//显示清零,数据指针清零
  73.         write_com(0x0c);//设置开显示,不显光标
  74.         write_com(0x06);//设置写一个字符后地址指针加1
  75.         write_com(0x80);//数据指针初始化,设置显示初始位置
  76. }
  77. /**********************主程序*************************/
  78. void main()
  79. {
  80.         uchar i;                                        //定义循环变量
  81.         P0M0 = 0x00;
  82.         P0M1 = 0x00;
  83.         P1M0 = 0x00;
  84.         P1M1 = 0x00;
  85.         P2M0 = 0x00;
  86.         P2M1 = 0x00;
  87.         P3M0 = 0x00;
  88.         P3M1 = 0x00;
  89.         init();                                                //初始化程序
  90.         /******用for循环按字节逐个写********/
  91.         write_com(0x80);                        //数据指针第一行起始0x80位置
  92.         for(i=0;i<16;i++)                        //每循环一次写一个字节数据
  93.         {
  94.                 write_date(table1[i]);        //写一个字节数据               
  95.         }
  96.         write_com(0xc0);                        //数据指针第二行起始位置0x80+0x40=0xc0
  97.         for(i=0;i<16;i++)                        //每循环一次写一个字节数据
  98.         {
  99.                 write_date(table2[i]);        //写一个字节数据               
  100.         }
  101.         while(1);
  102. }


复制代码
回复

使用道具 举报

16#
ID:213173 发表于 2020-12-16 08:05 | 只看该作者
本帖最后由 wulin 于 2020-12-17 15:58 编辑
gagaga123 发表于 2020-12-16 01:15
我的1602液晶屏D0-D7接了两个接口,例如D0-D3接的P0, D4-D7接的P3应该怎么办

这是异组非顺序端口矩阵键盘程序,其方法可以移植写LCD驱动程序
  1. #include <STC15F2K60S2.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define PD ((P2<<3&0x80)|(P2<<4&0x40)|(P3&0x3f))//P4.4/P4.2

  5. sbit dula=P2^6;                        //573段选
  6. sbit wela=P2^7;                        //573位选

  7. uchar code table[]={                //数组
  8.         0x3f,0x06,0x5b,0x4f,
  9.         0x66,0x6d,0x7d,0x07,
  10.         0x7f,0x6f,0x77,0x7c,
  11.         0x39,0x5e,0x79,0x71};
  12. uchar data dis_buf[2];
  13. uchar key=0;
  14. bit wei=0;

  15. void PX(uchar x)
  16. {
  17.         P3&=0xc0;                //低6位清0,P36、37不变
  18.         P3|=(x&0x3f);        //P3低6位赋值
  19.         P2&=0xeb;                //P44、42清0,其它位不变
  20.         P2|=((x>>3&0x10)|(x>>4&0x04));//P44、42赋值
  21. }
  22. void keyscan()                                        //按键扫描程序
  23. {
  24.         static bit sign=0;                        //按键自锁标志
  25.         static uint count=0;                //消抖计数变量                        
  26.         uchar num=0;                                        //临时变量
  27.         PX(0xf0);                                        //赋值PX 1111 0000
  28.         if(PD!=0xf0)                                //检测有按键按下
  29.         {
  30.                 if((++count>=100)&&(sign==0))        //100~1000,根据主循环周期调整约10~20ms
  31.                 {                        
  32.                         sign=1;                                //按键自锁标志置1
  33.                         num=PD;                                //保存PD值xxxx 0000,x为0或1
  34.                         num|=0x0f;                        //保存num按位或0x0f值xxxx 1111
  35.                         PX(num);                                //赋值PX xxxx 1111
  36.                         num=PD;                                //保存PD xxxx xxxx
  37.                         switch(num)
  38.                         {
  39.                                 case 0xee: key= 1; break;
  40.                                 case 0xde: key= 2; break;
  41.                                 case 0xbe: key= 3; break;
  42.                                 case 0x7e: key= 4; break;
  43.                                 case 0xed: key= 5; break;
  44.                                 case 0xdd: key= 6; break;
  45.                                 case 0xbd: key= 7; break;
  46.                                 case 0x7d: key= 8; break;
  47.                                 case 0xeb: key= 9; break;
  48.                                 case 0xdb: key=10; break;
  49.                                 case 0xbb: key=11; break;
  50.                                 case 0x7b: key=12; break;
  51.                                 case 0xe7: key=13; break;
  52.                                 case 0xd7: key=14; break;
  53.                                 case 0xb7: key=15; break;
  54.                                 case 0x77: key=16; break;
  55.                         }
  56.                 }
  57.         }
  58.         else                                                //键抬起
  59.         {
  60.                 sign=0;                                //按键自锁标志清0
  61.                 count=0;                                //消抖计数清0
  62.         }
  63. }

  64. int main()
  65. {
  66.         while(1)
  67.         {
  68.                 keyscan();
  69.                 dis_buf[0]=table[key/10];
  70.                 dis_buf[1]=table[key%10];
  71.                 P0=0x00;//消隐
  72.                 dula=1;
  73.                 dula=0;
  74.                 if(wei==0)
  75.                 {
  76.                         P0=0xfe;//送位码
  77.                         wela=1;
  78.                         wela=0;
  79.                         P0=dis_buf[0];//送段码
  80.                         dula=1;
  81.                         dula=0;
  82.                         wei=1;
  83.                 }
  84.                 else
  85.                 {
  86.                         P0=0xfd;
  87.                         wela=1;
  88.                         wela=0;
  89.                         P0=dis_buf[1];
  90.                         dula=1;
  91.                         dula=0;
  92.                         wei=0;
  93.                 }
  94.         }
  95. }
复制代码






回复

使用道具 举报

17#
ID:65956 发表于 2020-12-16 08:13 | 只看该作者
你可以试试这些代码放到STC89C52上是否能正常显示,如果能显示而放到STC15系列上不能显示,那就是延时时间的问题,如果也不显示,那本身程序不适用你的液晶驱动
回复

使用道具 举报

18#
ID:748788 发表于 2020-12-16 10:44 | 只看该作者
你的程序有这样一句:#define DataPort P0。即定义了P0作为1602的数据端口,但是接线图里的数据接口对应的却分别是P0和P2的几个端口。这就驴唇不对马嘴了。
回复

使用道具 举报

19#
ID:748788 发表于 2020-12-16 10:48 | 只看该作者
刚才复制错了。应该是这一句:#define LCD_Data P0
回复

使用道具 举报

20#
ID:839796 发表于 2020-12-17 10:58 | 只看该作者
angmall 发表于 2020-12-16 06:31
给你写一个异组端口驱动LCD示例

谢谢,我可能是对比度的问题吧,显示两行白格了
回复

使用道具 举报

21#
ID:839796 发表于 2020-12-20 17:53 | 只看该作者
大佬们,多谢了 我的可以显示了,我把D0-D7从新弄了一下,然后代码中没有把P1和P2口设置为弱上拉,希望这个回答也可以帮助别的和我一样问题的萌新。
回复

使用道具 举报

22#
ID:420836 发表于 2020-12-20 23:54 | 只看该作者
看来问题出在对比度设置上,降低了对比度。
回复

使用道具 举报

23#
ID:484674 发表于 2022-1-5 20:58 来自手机 | 只看该作者
1602出现左正常右边白格什么原因
回复

使用道具 举报

24#
ID:192215 发表于 2022-5-16 10:36 | 只看该作者
我也遇到了这个问题
回复

使用道具 举报

25#
ID:1044173 发表于 2023-4-18 08:29 | 只看该作者
我之前用Proteus仿真1602也是白屏不显示把延时改了一下,显示出来了,但我做的超声波测距,当超声波模块数值改变时1602上显示的数据不变
回复

使用道具 举报

26#
ID:1091100 发表于 2023-8-10 23:29 | 只看该作者
同志们,板子还是买良心商家的吧!
//引脚配置:
//sbit LCD_RS=P2^6;
//sbit LCD_RW=P2^5;
//sbit LCD_EN=P2^7;

sbit LCD_RS=P2^4;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^6;

原理图上引脚定义标的都是错的,你敢信?
拿表打出正确的引脚后就显示正常了!
回复

使用道具 举报

27#
ID:1085441 发表于 2023-8-11 00:11 | 只看该作者
看前面不少人说是对比度问题,我觉得不像,如果仅是对比度问题,字符还是能看出来的,应该是像9楼说的初始化不对,我们遇到这种情况是引脚没焊好或是短路。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表