这是用单片机控制的1602液晶显示 程序,我检查不出错误来,可就是实现不了功能啊。。向大家求助!!先多谢

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^4;
sbit rw=P2^5;
sbit e=P2^6;

uchar table1[]={"hello evrry one "};
uchar table2[]={"I lvoe You ! "};

void delay_50us(uint t)
{
uint i;
for(;t>0;t--)
for(i=19;i>0;i--);
}
void Write_comd(uchar date)
{
e=0;
rs=0;
rw=1;

P0=date;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}

void Write_data(uchar dat)
{
e=0;
rs=1;
rw=0;

P0=dat;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}

void init(void)
{
delay_50us(300);
Write_comd(0x38);
delay_50us(100);
Write_comd(0x38);
delay_50us(100);
Write_comd(0x38);
delay_50us(100);
Write_comd(0x38);
Write_comd(0x08);
Write_comd(0x01);
Write_comd(0x06);
Write_comd(0x0c);
}

void main()
{
uchar j;
init();
// while(1)
// {
Write_comd(0x80);

for(j=0;j<16;j++)
{
Write_data(table1[j]);
delay_50us(10);
}

Write_comd(0x40);
for(j=0;j<16;j++)
{
Write_data(table2[j]);
delay_50us(10);
}
while(1);
// }
}

把延时啦长点就好了,这个问题经常遇见,把每次写命令和写数据的时间延时长一点就OK了!
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-10-06
// LCD函数部分

void LcdDelay()
{
int i;
for(i = 0; i < 40; i++);
}

void LcdBusy() // LCD忙检测函数
{
LCD_RS = 0; // 读状态寄存器或写命令寄存器
LCD_RW = 1; // 读标志
LcdComdPort = 0xff; // 读数前先对端口置1
LCD_E = 1;
LcdDelay();
while ((LcdComdPort&0x80) != 0) // 1000 0000
{
LCD_E = 0;
LcdDelay();
LCD_E = 1;
LcdDelay();
}
LCD_E = 0; // 原为LCD_E=1
}

void LcdCmd(uchar c) // LCD控制命令函数
{
LcdBusy(); // 忙检测
LcdComdPort = c; // 置命令线
LCD_RS = 0; // 选命令寄存器
LCD_RW = 0; // 写标志
LCD_E = 1;
LcdDelay();
LCD_E = 0;
}

void LcdData(uchar c) // LCD数据输入函数
{
LcdBusy(); // 忙检测
LcdDataPort = c; // 置数据线
LCD_RS = 1; // 选数据寄存器
LCD_RW = 0; // 写标志
LCD_E = 1;
LcdDelay();
LCD_E = 0;
}

void LcdInit() // LCD初始化函数
{
LcdCmd(0x01); // 清屏.AC=0
LcdCmd(0x38); // 显示移位;右移
LcdCmd(0x06); // CGRAM=1
LcdCmd(0x0c); // 数据位数:8位;行数:1行;字体:0
LcdCmd(0x01); // DDRAM=0
}

void LcdClr() // LCD清屏函数
{
LcdCmd(0x01); // DDRAM=0
}

void LcdXY(uchar x, uchar y) // LCD显示定位函数、置DDRAM地址
{
if((x&0x01) != 0) // x:行、y:列
LcdCmd(0x80|(y - 1)); // 固定:1000 0000
else
LcdCmd(0xC0|(y - 1)); // 固定:1000 0000+0100 0000
}

void LcdStr(uchar *c) // 显示字符串函数
{
data int d = 0;
while (c[d] != 0)
{
LcdData(c[d++]);
LcdDelay();
}
}

void LcdChar(uchar c) // 显示数字函数
{
LcdData(c);
LcdDelay();
}

void LcdClear(uchar col) // 在液晶第col行clear
{
char i;
for(i = 0; i < 8; i++)
{
LcdXY(col, i + 1);
LcdStr(kong);
}
}追问

我想问一下,我的有没有错误?谢谢

追答

没时间看,反正我的绝对是能用的

...程序,我检查不出错误来,可就是实现不了功能啊。。向大家求助!!先多 ...
把延时啦长点就好了,这个问题经常遇见,把每次写命令和写数据的时间延时长一点就OK了!

自己焊的单片机 1602液晶显示 为什么显示 乱码
可能产生的问题如下:1、I\/O口与LCD的数据口方向焊反2、LCD的RS、RW、E的控制I\/O口在程序编辑时定义错误3、程序错误只要这三点做对了是绝对没问题的

单片机 1602 液晶屏 检测是否忙对的c程序,看不懂,望详解
void busy_test()\/\/检测lcd是否忙{ u8 st; \/\/忙状态标志 0:不忙,0x80:忙 if(f_init==0) \/\/如果某个东西没有初始化 { return; \/\/ 退出忙判断,不执行下面的代码 } lcd=0xff; \/\/ 先往数据端口赋高电平,便于读数据 rs=0; \/\/ 读忙设置 ...

单片机和LCD1602显示时间时,久了会出现乱码
很大的可能是1302的问题,比如1302的32K晶振停振(运行的时候不要用手触摸晶振引脚,出现乱码的时候用示波器观察下晶振的波形),1302读取错误等等,先试试不用1302,只用单片机让1602显示字符,看看有没有问题,然后再检查程序和1302

单片机1602只显示一排小方块
1602液晶显示模块有个特性,就是在通电后,如果没有正确执行初始化操作,屏幕将会出现第一行点阵全部点亮、第二行点阵不亮的现象,此时除了初始化操作以外,1602液晶屏不接收其它操作指令。因此,在驱动1602液晶屏的时候出现这种情况,应该重点检查控制电路(单片机或者其它控制器)是否正确输出了初始化的信号...

怎么检查1602液晶显示器是不是坏了?
看你的液晶的学习板原理图,看上面是否有1602的跳脱冒,有的话就把它拔掉,应该就可以显示了,如过还不行就看是不是液晶的问题,最后是板子的问题,你可以把原理图贴上来看看。。起码你不能把液晶插反,对照下教程。。。

LCD1602第一行显示为16个小黑块,仿真没问题,但是烧写到板子里就有问题...
而对于单片机来说,1602好比那个瓶子漏斗,写入1602中要显示的数据好比油,如果以单片机的高运行速度向1602写数据就很可能造成上面所说的溢出,比如连续写入abc,结果只显示出了a,这是因为1602的显示芯片每次都要花时间来处理输入的ascii码数据,并把它显示出来。而我们却不容易主动地去控制写入数据的速度...

求大神帮我看看这程序错在哪里啊! 用51单片机定时器写的1602显示...
1)你这显示函数 直接就死循环了 还怎么进行下去了 你要把按键连外部中断 这样 按键按下 产生中断 停止计时器 然后循环检查键盘 设置时间 显示 不能死循环 你要把计时器 设定时中断 假设中断一次 50Ms 计数a=1 当a=20时 过去了一秒 刷新下1602显示 main 里面 放计数判断 ...

51单片机 控制1602 液晶 遇到问题 求高手指教
这可能是程序的延时问题,你要把显示的时间加大一点。如果是C语言则在主程序delay()中的数改大点。

51单片机,1602液晶和矩阵键盘的P口冲突
应该不会冲突吧,我记得我作过这样的实验没出现问题 1602是静态显示器件,不需要反复刷新,.所以大部分时间其接口是不被占用的,并且lcden WR RD和rs对LCD来说都是输入的,说明LCD不会主动乾扰你的其它工作 按键扫描倒是有可能乾扰LCD工作,但按键扫描也是在你控制下进行的,有时虽会改变LCD这几种...

相似回答