Proteus 仿真是可以显示的,但是实物上就显示不了了。第一排显示黑块,第二排没有东西显示。求大佬帮忙解答~
实物图,原理图,仿真图,代码 如下:
这是代码:
#include <reg52.h>
#include "intrins.h"
#include <stdio.h>
#define LCD1602_DB P0
sbit LCD1602_RS = P2^0; //LCD1602 显示
sbit LCD1602_RW = P2^1; //LCD1602 显示
sbit LCD1602_E = P2^2; //LCD1602 显示
void InitLcd1602();
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void LcdShowStr_data(unsigned char x, unsigned char y, unsigned char s);
void main (void)
{
InitLcd1602();
LcdShowStr(0, 0, "0123456789ABCDEF");
LcdShowStr(0, 1, "0123456789ABCDEF");
while(1);
}
/* 等待液晶准备好 */
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为止
}
/* 向LCD1602 写入一字节命令,cmd-待写入命令值 */
void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* 向 LCD1602 写入一字节数据,dat-写入数据值 */
void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* 设置显示 RAM 起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
void LcdSetCursor(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 地址
}
/* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
LcdSetCursor(x, y); //设置起始地址
while (*str != '\0')
{ //连续写入字符串数据,直到检测到结束符
LcdWriteDat(*str++); // 连续写入字符串数据,然后str自加 1
}
}
void LcdShowStr_data(unsigned char x, unsigned char y, unsigned char s)
{
LcdSetCursor(x, y); //设置起始地址
LcdWriteDat('0'+s);
}
/* 初始化1602液晶 */
void InitLcd1602()
{
LcdWriteCmd(0x38); //16*2 显示,5*7 点阵,8 位数据接口
LcdWriteCmd(0x0C); //显示器开,光标关闭
LcdWriteCmd(0x06); //文字不动,地址自动加 1
LcdWriteCmd(0x01); //清屏
}