找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3179|回复: 9
收起左侧

关于LCD1602初始化问题

[复制链接]
ID:570264 发表于 2021-3-15 15:59 来自手机 | 显示全部楼层 |阅读模式
最近再做个非接触式红外温度测量,用LCD1602显示,但第一行全部一直显示黑块,百度了下是初始化问题,求问怎么解决
void delay1(uint x)          //延时函数1
{
  while(x--);
}
char Busy(){   //忙碌       
char a=0;       
rs=0,rw=1,lcden=1;       
if(P0&0x80==0x80)a=1;       
lcden=0;
        return a;}
void write_cmd(uchar cmd)        //写命令函数{        while(Busy());       
delay1(100);         rs=0;                          //写命令        rw=0;       
lcden=0;       
delay1(100);       
P0=cmd;       
delay(100);       
lcden=1;       
delay1(100);       
lcden=0;}
void write_data(uchar dat)        //写数据函数{  while(Busy());  
delay(100);  
rs=1;                                //写入数据  
rw=0;  
lcden=0;  
delay1(100);  
P0=dat;  
delay1(100);  
lcden=1;  
delay1(100);  
lcden=0;}
void init()                        //初始化函数{  rs=0;  
rw=0;  
lcden=0;  
write_cmd(0x38);                   //8位总线,双行显示,5X7点阵字符  
write_cmd(0x0c);                   //打开显示屏,不显示光标,光标所在位置不闪烁  write_cmd(0x06);                   //写入数据后,地址自动加一  
write_cmd(0x01);                   //清屏  delay(50);}
16157951439971130738293.jpg
回复

使用道具 举报

ID:213970 发表于 2021-3-15 17:41 | 显示全部楼层
这个也和VO的电阻有关系,确认不是电位器没调好吗?调一下电位器试试看
回复

使用道具 举报

ID:451718 发表于 2021-3-15 17:52 | 显示全部楼层
论坛上有很规范的标准结构代码,你可以参考一下。  你这个问题大概率是出在延迟函数上。
回复

使用道具 举报

ID:570264 发表于 2021-3-15 18:56 来自手机 | 显示全部楼层
lqb7733 发表于 2021-3-15 17:41
这个也和VO的电阻有关系,确认不是电位器没调好吗?调一下电位器试试看

如果是对比度问题,那应该是两行都有,对比度连线都没问题
回复

使用道具 举报

ID:570264 发表于 2021-3-15 18:58 来自手机 | 显示全部楼层
robinsonlin 发表于 2021-3-15 17:52
论坛上有很规范的标准结构代码,你可以参考一下。  你这个问题大概率是出在延迟函数上。

网上代码找了几个,只有一个成功,应该不是连线和对比度问题,我把成功的代码完整复制进来结果也没用
回复

使用道具 举报

ID:703546 发表于 2021-3-15 20:58 | 显示全部楼层
把主频降到几兆试试。一般来说,有读忙操作,是否延时影响不太大,可能是IO配置或初始化指令操作有误。下面是以前写的测试可用的(51,晶振12M,8线),你试下。#include<reg51.h>
#define BF P1_7
#define RS P2_0
#define RW P2_1
#define E  P2_2
#define IO P1
sbit P1_7=P1^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
/*****忙标志*******/
unsigned char busy(void)
{
unsigned char b=0;
RS=0;RW=1;E=0;
IO=255;
E=1;
if(BF){b=1;}
return(b);
}
/*****初始化LCD****/
void inital(void)
{
IO=1;               /*1:(0000 0001)清屏,光标回位*/
RS=0;RW=0;E=0;      
while(busy()){;}
IO=56;              /*2:(0011 1000)8位总线,2行显示,5*7点阵*/
RS=0;RW=0;E=0;
while(busy()){;}
IO=15;              /*3:(0000 1111)整体显示开,显示光标,光标闪烁开*/
RS=0;RW=0;E=0;
while(busy()){;}
IO=6;               /*4:(0000 0110)光标右移*/
RS=0;RW=0;E=0;
}
回复

使用道具 举报

ID:390416 发表于 2021-3-16 09:24 | 显示全部楼层
LCD1602显示℃ 这种自定义符号 http://www.51hei.com/bbs/dpj-200685-1.html
回复

使用道具 举报

ID:584814 发表于 2021-3-16 10:32 | 显示全部楼层
程序问题,四线和八线接法的初始化命令不同,还可能与延时有关。
分析你那个成功了的时序,对照着修正或直接抄了就好。
回复

使用道具 举报

ID:139866 发表于 2021-3-16 11:58 | 显示全部楼层
也有可能是电位器的关系,调一下电位器试试
回复

使用道具 举报

ID:570264 发表于 2021-3-16 13:48 来自手机 | 显示全部楼层
终于找到原因了,我数据线有问题,原先是p0口,我换成了p1口就能正常显示了,估计p0排阻不好或者焊接不好
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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