找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机lcd1602只显示第一排黑色方块

[复制链接]
回帖奖励 20 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
麻烦大佬帮忙看一下是什么问题

#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);
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:452950 发表于 2020-5-1 09:51 | 只看该作者
先考虑线有没有接错,对比度调好没有
回复

使用道具 举报

板凳
ID:97554 发表于 2020-5-1 10:58 | 只看该作者
RS   RW   EN三根线有没有对应程序,D0 -  D7线序有没有接反。
回复

使用道具 举报

地板
ID:709389 发表于 2020-5-1 11:26 | 只看该作者
调节电位器,对比度要调好
回复

使用道具 举报

5#
ID:531275 发表于 2020-5-1 14:47 | 只看该作者
xxpp2011 发表于 2020-5-1 09:51
先考虑线有没有接错,对比度调好没有

这些都没问题,烧例程可以显示
回复

使用道具 举报

6#
ID:531275 发表于 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
回复

使用道具 举报

7#
ID:97554 发表于 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()    延时子程序
{
内容
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:531275 发表于 2020-5-2 10:21 来自触屏版 | 只看该作者
杨雪飞 发表于 2020-5-1 15:29
烧例程可以的话你就把这个程序对照例程的初始化、写命令、写数据函数,看看哪里时序不对吧。开发板这玩意 ...

好的,谢谢
回复

使用道具 举报

9#
ID:691449 发表于 2020-5-2 13:01 | 只看该作者
滥情 发表于 2020-5-1 11:26
调节电位器,对比度要调好

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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