找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 299|回复: 15
收起左侧

单片机+lcd1602初始化不成功 求帮助

[复制链接]
欣语宝贝 发表于 2020-7-9 21:07 | 显示全部楼层 |阅读模式
51hei图片_20200709210543.jpg


大神帮我看看哪儿的问题

#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit rs=P2^0;
sbit wr=P2^1;
sbit en=P2^2;
uint i,j;
delay(uint x)
{
        while(x--);
}
void write_com(uchar com)
{
        rs=0;
        wr=0;
        en=0;
        P1=com;
        en=1;
        delay(5);
        en=0;
}

void write_data(uchar bat)
{
        rs=1;
        wr=0;
        en=0;
        P1=bat;
        en=1;
        delay(5);
        en=0;
}
void init()
{
        write_com(0x38);
        write_com(0x08);
        write_com(0x01);
        write_com(0x06);
        write_com(0x0f);
}

void main()
{
        init();
        write_data("A");
        while(1);
}

回复

使用道具 举报

wulin 发表于 2020-7-10 06:32 | 显示全部楼层
由于对LCD读写数据之前没有判忙,所以延时函数时间就嫌短,导致初始化失败,建议延时1ms左右。
void write_com(uchar com)
{
        rs=0;
        wr=0;
        en=0;
        P1=com;
        delay(100);
        en=1;
        delay(100);
        en=0;
}

void write_data(uchar bat)
{
        rs=1;
        wr=0;
        en=0;
        P1=bat;
        delay(100);
        en=1;
        delay(100);
        en=0;
}
回复

使用道具 举报

static 发表于 2020-7-10 07:59 | 显示全部楼层
仿真玩的时候可以不判忙,不接晶振与电源,实际操作是少不了的!
回复

使用道具 举报

杨雪飞 发表于 2020-7-10 08:54 | 显示全部楼层
void main()
{
        init();

在这里加一句
write_com(0x80);
这个写命令是设置你写的数据的起始位置,0x80是第一行第一位
        write_data("A");
        while(1);
}
回复

使用道具 举报

杨雪飞 发表于 2020-7-10 09:15 | 显示全部楼层
1、主程序中使用了延时函数,但是这个延时函数之前没有声明;
2、延时函数写的有误,仅5个周期;
3、主函数中没有设定指针,也就是字符显示的初始位置。

你按照下边的改一下试试吧。改动的地方我用了红色
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
void Delay()        ;
sbit rs=P2^0;
sbit wr=P2^1;
sbit en=P2^2;


void delay(uint z)
{
   uint x,y;
   for(x=z;x>0;x--)
   for(y=19;y>0;y--);
}

void write_com(uchar com)
{
        rs=0;
        wr=0;
        en=0;
        P1=com;
        en=1;
        delay(5);
        en=0;
}

void write_data(uchar bat)
{
        rs=1;
        wr=0;
        en=0;
        P1=bat;
        en=1;
        delay(5);
        en=0;
}
void init()
{
        write_com(0x38);
        write_com(0x08);
        write_com(0x01);
        write_com(0x06);
        write_com(0x0f);
}

void main()
{
        init();
                write_com(0x80);
        write_data('A');
        while(1);
}


回复

使用道具 举报

杨雪飞 发表于 2020-7-10 09:32 | 显示全部楼层
错误太多,我的水平有限,还是没有全部解决。
回复

使用道具 举报

 楼主| 欣语宝贝 发表于 2020-7-10 12:40 来自手机 | 显示全部楼层
杨雪飞 发表于 2020-7-10 09:15
1、主程序中使用了延时函数,但是这个延时函数之前没有声明;
2、延时函数写的有误,仅5个周期;
3、主函 ...

等下回去试试谢谢啦
回复

使用道具 举报

 楼主| 欣语宝贝 发表于 2020-7-10 12:41 来自手机 | 显示全部楼层
static 发表于 2020-7-10 07:59
仿真玩的时候可以不判忙,不接晶振与电源,实际操作是少不了的!

等下去实验下  谢谢了
回复

使用道具 举报

 楼主| 欣语宝贝 发表于 2020-7-10 12:42 来自手机 | 显示全部楼层
wulin 发表于 2020-7-10 06:32
由于对LCD读写数据之前没有判忙,所以延时函数时间就嫌短,导致初始化失败,建议延时1ms左右。
void write ...

好的  等下试一下  谢谢
回复

使用道具 举报

杨雪飞 发表于 2020-7-10 14:20 | 显示全部楼层
只能帮你这么多了


#include<reg52.h>   
#define uint unsigned int  
#define uchar unsigned char
sbit rs=P2^0;   
sbit rw=P2^1;        
sbit en=P2^2;        

void delay(uint n)                  
{
    uint x,y;  
    for(x=n;x>0;x--)
    for(y=110;y>0;y--);
}

void lcd_wcom(uchar com)                  
{
    rs=0;            
    rw=0;            
    P0=com;            
    delay(5);      
    en=1;        
    en=0;
}


void lcd_wdat(uchar dat)           
{
    rs=1;      
    rw=0;        
    P0=dat;        
    delay(5);   
    en=1;      
    en=0;
}


void lcd_init()               
{
    lcd_wcom(0x38);         
    lcd_wcom(0x0c);   
    lcd_wcom(0x06);   
    lcd_wcom(0x01);   
}


void main()           
{     

    lcd_init();              
    lcd_wcom(0x80);      
    lcd_wdat('a');           
    delay(200);
    while(1);      
}

回复

使用道具 举报

 楼主| 欣语宝贝 发表于 2020-7-10 21:13 | 显示全部楼层
杨雪飞 发表于 2020-7-10 14:20
只能帮你这么多了

可以初始化   但是不能写数据没有 反应 51hei图片_20200710211146.jpg
回复

使用道具 举报

 楼主| 欣语宝贝 发表于 2020-7-10 21:18 | 显示全部楼层
wulin 发表于 2020-7-10 06:32
由于对LCD读写数据之前没有判忙,所以延时函数时间就嫌短,导致初始化失败,建议延时1ms左右。
void write ...

根据你修改的代码   不能初始化  是不是1602lcd坏了?
回复

使用道具 举报

 楼主| 欣语宝贝 发表于 2020-7-10 21:25 | 显示全部楼层
void main()           
{     

    lcd_init();              
    lcd_wcom(0x80+0x40);      
    lcd_wdat('8');
    lcd_wcom(0x80+0x41);      
    lcd_wdat('9');           这样写可以显示第二行       这咋回事???????????? b5a73c547500f831c4d625b0897a828.jpg
回复

使用道具 举报

 楼主| 欣语宝贝 发表于 2020-7-10 22:11 | 显示全部楼层
51hei图片_20200710221100.jpg 第一行可以显示了   结果测试   第一行的十六位地址为  0x40   第二行为0x80+0x40      即0xc0  但是不能显示字母或者汉字  应该是没有字库的原因  正在找怎么加字库
回复

使用道具 举报

杨雪飞 发表于 2020-7-11 08:45 | 显示全部楼层
欣语宝贝 发表于 2020-7-10 22:11
第一行可以显示了   结果测试   第一行的十六位地址为  0x40   第二行为0x80+0x40      即0xc0  但是不能显 ...

第一,硬件方面,1602的V0口对比度电阻没有调好,液晶显示对比度很差
第二、字母是可以显示的,你看一下1602的资料,不支持汉字显示,支持部分自定义字符。

直接把数字替换成字母应该就可以正常显示的,除非你用了全角输入的。

评分

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

查看全部评分

回复

使用道具 举报

2366560944 发表于 2020-7-11 11:59 | 显示全部楼层
有写命令写数据,还得要有忙检测才行,不过你好像已经弄好了,我就来蹭蹭哈哈哈哈

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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