找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1326|回复: 7
收起左侧

请问各位大神,我这电路图错的吗?怎么1602显示不了字符

[复制链接]
ID:847202 发表于 2020-11-22 11:22 来自手机 | 显示全部楼层 |阅读模式
我单片机学得不是很好,因为我是自学的,师傅还没有教到,而且程序是复制别人的,程序我还不是全部都理解,但是编译没有出现错误,求指导
IMG20201122111622.jpg

单片机源程序如下:
#include<reg52.h>

#define Lcd1602_DB P2
sbit Lcd1602_RS = P3^0;
sbit Lcd1602_RW = P3^1;
sbit Lcd1602_E = P3^2;

void InitLcd1602();
void Lcdwritecmd(unsigned char cmd);
void LcdWaitReady();
void LcdShowstr(unsigned char x, unsigned char y, unsigned char *str);
void Lcdcursor(unsigned char x, unsigned char y);
void LcdWritedat( unsigned char str);

void main()
{
        InitLcd1602();
        LcdShowstr(5, 0, "L Z Y");
        LcdShowstr(3, 1, "come on!!!");
        while(1);
}
//初始化1602液晶
void InitLcd1602()
{
        Lcdwritecmd(0x38);//16*2显示,5*7点阵,8位数据口
        Lcdwritecmd(0x0C); //显示器开,光标关闭
        Lcdwritecmd(0x06);//文字不动,地址自动加+1
        Lcdwritecmd(0x01);//清屏
}
//向LCd1602写入一个一字节命令,cmd为待写入命令值
void Lcdwritecmd(unsigned char cmd)
{
        LcdWaitReady();
        Lcd1602_RS = 0;
        Lcd1602_RW = 0;
        Lcd1602_DB = cmd;
        Lcd1602_E = 1;
        Lcd1602_E = 0;
}
//等待液晶准备好
void LcdWaitReady()
{
        unsigned char sta;
        Lcd1602_DB = 0xFF;
        Lcd1602_RS = 0;
        Lcd1602_RW = 1;
        do{
           Lcd1602_E = 1;
           sta = Lcd1602_DB;//读取状态字
           Lcd1602_E = 0;
        }while(sta & 0x80);//bit7等于1表示液晶正忙,重复检测直到其等于0为止
}
//在液晶上显示字符串,(x,y)为对应屏幕上的起始坐标,str为字符指针
void LcdShowstr(unsigned char x, unsigned char y, unsigned char *str)
{
        Lcdcursor(x, y);//设置起始地址
        while(*str != '\0')//连续写入字符串数据,直到检测到结束符
        {
                LcdWritedat(*str++);//先取str指向的数据,然后str自加1
        }
}
//设置显示RAM起始地址,亦即光标位置,(x,y)为对应屏幕上的字符坐标
void Lcdcursor(unsigned char x, unsigned char y)
{
          unsigned char addr;
          if(y == 0)//由输入的屏幕坐标计算显示RAM的地址
          {
                  addr = 0x00 + x; //第一行字符坐标地址从0x00起始
          }
          else         
          {
                  addr = 0x40 +  x;//第二行字符地址从0x40起始
          }
          Lcdwritecmd(addr | 0x80);//设置RAM地址
}
//向液晶写入一个一字节数据,dat为待写入数据值
void LcdWritedat(unsigned char str)
{
        LcdWaitReady();
        Lcd1602_RS = 1;
        Lcd1602_RW = 0;
        Lcd1602_E = 1;
        Lcd1602_DB = str;
        Lcd1602_E = 0;        
}
回复

使用道具 举报

ID:748788 发表于 2020-11-23 10:31 | 显示全部楼层
将你的程序和仿真发上来,让大家运行一下看看
回复

使用道具 举报

ID:278840 发表于 2020-11-23 10:25 | 显示全部楼层
实测没毛病,看看自己画的图是不是哪里画错了
回复

使用道具 举报

ID:847479 发表于 2020-11-22 22:24 | 显示全部楼层
看着没毛病啊!
回复

使用道具 举报

ID:213173 发表于 2020-11-22 20:06 | 显示全部楼层
程序和仿真都没有问题
无标题.jpg

回复

使用道具 举报

ID:275826 发表于 2020-11-22 19:54 | 显示全部楼层
程序没有错误,应该是电路图那里画的有问题
回复

使用道具 举报

ID:687694 发表于 2020-11-22 19:36 | 显示全部楼层
如果程序无误,大概率是时序问题,通常此类例程在8951上运行,为12T单片机。故使用类似        Lcd1602_E = 1;
Lcd1602_E = 0;
这种直接控制io电平反转是可以的,仿真中未必能行,请参考控制时序加入适当延迟就行了。
回复

使用道具 举报

ID:342822 发表于 2020-11-22 17:45 | 显示全部楼层
没有错误可以仿真
重新编译一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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