标题: 单片机lcd1602只显示第一排黑色方块 [打印本页]

作者: dislsqq    时间: 2020-4-30 22:47
标题: 单片机lcd1602只显示第一排黑色方块
麻烦大佬帮忙看一下是什么问题

#include "LCD1602.h"
#ifdef P25_DRIV_RW
//读操作,RS=1读数据;RS=0读指令
unsigned char Read_LCD1602(bit RS)  
{      
unsigned char temp;
LCD1602_RS = RS;//数据寄存器
LCD1602_RW = 1;//读操作
LCD1602_EN = 1;//上升沿,LCD准备数据
_nop_();
_nop_();
_nop_();
_nop_();
temp =  LCD1602_DATA;//读取DB7~0
LCD1602_EN = 0;//下降沿,LCD锁存数据
return temp;
}
//读忙操作,高电平表示忙
bit LCD_Busy(void)
{
   unsigned char temp;
   temp = Read_LCD1602(COMMAND);//读指令
   return (bit)(temp & 0x80);//返回BF(bit7)位
}
//写操作,RS=1写数据;RS=0写指令
void Write_LCD1602(unsigned char dat,bit RS)
{      
while(LCD_Busy());
  LCD1602_EN = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATA = dat; //写入数据
Delay_ms(1);
LCD1602_EN= 1;   //写入时序
Delay_ms(5);   //保持时间
LCD1602_EN= 0;

}

#else
void Write_LCD1602(unsigned char dat,bit RS)
{
  LCD1602_EN = 0;   //使能清零
LCD1602_RS = 1;   //选择写入数据

LCD1602_DATA= dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
  Delay_ms(1);
LCD1602_EN= 1;   //写入时序
  Delay_ms(5);;
LCD1602_EN = 0;
LCD1602_DATA = dat << 4; //写入低四位
  Delay_ms(1);
LCD1602_EN = 1;   //写入时序
  Delay_ms(5);
LCD1602_EN=0;
}
#endif
void LCD_WrCmd(unsigned char dat)
{
Write_LCD1602(dat,COMMAND);
}
void LCD_WrDat(unsigned char dat)
{
Write_LCD1602(dat,DATA);
}
void St_LCD1602_Pos(unsigned char pos)
{      
LCD_WrCmd(pos | 0x80);
}
void LCD1602_Init(void)  
{      
unsigned char empty = ' ';
LCD1602_EN = 0;
LCD_WrCmd(0x38);   
LCD_WrCmd(0x0c);  
LCD_WrCmd(0x06);  
LCD_WrCmd(0x01);
  LCD_WrCmd(0x80);
Wr_LCD1602_Num(0x00,0);
Wr_LCD1602_Str(0x00,"t");
Wr_LCD1602_Byt(0x00,'t');
St_LCD1602_Cur(0);
St_LCD1602_Clr();
}

void Wr_LCD1602_Str(unsigned char pos,unsigned char *Pwdata)
{
St_LCD1602_Pos(pos);
while(*Pwdata != '\0')
  LCD_WrDat(*Pwdata++);
}
void Wr_LCD1602_Byt(unsigned char pos,unsigned char _data)
{
St_LCD1602_Pos(pos);
LCD_WrDat(_data);
}
void Wr_LCD1602_Num(unsigned char pos,unsigned char _data)
{
St_LCD1602_Pos(pos);
if((0<=_data)&&(_data<=9))
  LCD_WrDat((_data+'0'));
else
  LCD_WrDat('E');
}
void St_LCD1602_Clr(void)
{
    LCD_WrCmd(0x01);//清显示
}
void St_LCD1602_Cur(bit OpnClose)
{
if(OpnClose)
  LCD_WrCmd(0x0f);
else
  LCD_WrCmd(0x0c);
}


作者: xxpp2011    时间: 2020-5-1 09:51
先考虑线有没有接错,对比度调好没有
作者: 杨雪飞    时间: 2020-5-1 10:58
RS   RW   EN三根线有没有对应程序,D0 -  D7线序有没有接反。
作者: 滥情    时间: 2020-5-1 11:26
调节电位器,对比度要调好
作者: dislsqq    时间: 2020-5-1 14:47
xxpp2011 发表于 2020-5-1 09:51
先考虑线有没有接错,对比度调好没有

这些都没问题,烧例程可以显示
作者: dislsqq    时间: 2020-5-1 14:49
杨雪飞 发表于 2020-5-1 10:58
RS   RW   EN三根线有没有对应程序,D0 -  D7线序有没有接反。

#define LCD1602_DATA P0
sbit LCD1602_EN = P2^7;
sbit LCD1602_RS        = P2^6;
#ifdef P25_DRIV_RW
sbit LCD1602_RW = P2^5;
#endif
作者: 杨雪飞    时间: 2020-5-1 15:29
dislsqq 发表于 2020-5-1 14:49
#define LCD1602_DATA P0
sbit LCD1602_EN = P2^7;
sbit LCD1602_RS        = P2^6;

烧例程可以的话你就把这个程序对照例程的初始化、写命令、写数据函数,看看哪里时序不对吧。开发板这玩意难伺候,所以我就觉得初学者用开发板学是个坑。比如我们驱动1602,我用P0口不解上拉电阻都可以直接驱动1602正常显示。但是在开发板上就不行。我有块普中开发板,用的1602就跟一般的不一样,之前因为这个绕了不少弯路。

对于1602的显示按以下几块分解了学就好了。

void main()   主函数
{
lcd init();   先初始化液晶
while()      循环

{
delay();
wrt_com();    写命令函数,定义位置
delay();
wrt_dat()   ;  写数据函数,显示内容。
}

}


lcd_init()    初始化子程序
{
内容
}

wrt_com()    写命令子程序
{
内容
}

wrt_dat()   写数据子程序
{
内容
}


delay()    延时子程序
{
内容
}
作者: dislsqq    时间: 2020-5-2 10:21
杨雪飞 发表于 2020-5-1 15:29
烧例程可以的话你就把这个程序对照例程的初始化、写命令、写数据函数,看看哪里时序不对吧。开发板这玩意 ...

好的,谢谢
作者: xianming    时间: 2020-5-2 13:01
滥情 发表于 2020-5-1 11:26
调节电位器,对比度要调好

只有一行黑色不是对比度的问题,应该和初始化有关系




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1