51单片机驱动lcd1602,显示屏不显示
时间:10-02
整理:3721RD
点击:
#include <REGX52.H>
#define LCD_DB P0
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^7;
sbit LCD_E=P2^6;
unsigned char PuZh[]="Prechin Science";
void delay1ms(unsigned int c) //误差 0us
{
unsigned char a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
void delay(unsigned int t)
{
unsigned int a;
a=t;
while(a--);
}
void LCDWriteCom(unsigned int com)
{
LCD_E=0;
LCD_RS=0;
LCD_RW=0;
LCD_DB=com;
delay1ms(10);
LCD_E=1;
delay1ms(10);
LCD_E=0;
}
void LCDWriteData(unsigned int dat)
{
LCD_E=0;
LCD_RS=1;
LCD_RW=0;
LCD_DB=dat;
delay1ms(10);
LCD_E=1;
delay1ms(10);
LCD_E=0;
}
void LCDInit()
{
LCDWriteCom(0x38); //设置显示模式
delay1ms(1);
LCDWriteCom(0x0c); //开显示,不显示光标,光标不闪烁
delay1ms(1);
LCDWriteCom(0x06); //写一个指针加1
delay1ms(1);
LCDWriteCom(0x01); //清屏
delay1ms(1);
LCDWriteCom(0x80); //设置数据指针起点
delay1ms(1);
}
void main ()
{
unsigned char i;
LCDInit();
for(i=0;i<16;i++)
{
LCDWriteData(PuZh[i]);
delay1ms(1);
}
while(1)
{
}
}
#define LCD_DB P0
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^7;
sbit LCD_E=P2^6;
unsigned char PuZh[]="Prechin Science";
void delay1ms(unsigned int c) //误差 0us
{
unsigned char a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
void delay(unsigned int t)
{
unsigned int a;
a=t;
while(a--);
}
void LCDWriteCom(unsigned int com)
{
LCD_E=0;
LCD_RS=0;
LCD_RW=0;
LCD_DB=com;
delay1ms(10);
LCD_E=1;
delay1ms(10);
LCD_E=0;
}
void LCDWriteData(unsigned int dat)
{
LCD_E=0;
LCD_RS=1;
LCD_RW=0;
LCD_DB=dat;
delay1ms(10);
LCD_E=1;
delay1ms(10);
LCD_E=0;
}
void LCDInit()
{
LCDWriteCom(0x38); //设置显示模式
delay1ms(1);
LCDWriteCom(0x0c); //开显示,不显示光标,光标不闪烁
delay1ms(1);
LCDWriteCom(0x06); //写一个指针加1
delay1ms(1);
LCDWriteCom(0x01); //清屏
delay1ms(1);
LCDWriteCom(0x80); //设置数据指针起点
delay1ms(1);
}
void main ()
{
unsigned char i;
LCDInit();
for(i=0;i<16;i++)
{
LCDWriteData(PuZh[i]);
delay1ms(1);
}
while(1)
{
}
}
http://bbs.elecfans.com/forum.php?mod=viewthread&tid=497965
请对照查好看
http://bbs.elecfans.com/forum.ph ... p;highlight=lcd1602
查看了lcd相关部分。两个的不同是有一篇先给使能再给数据,另一篇先给数据再给使能。我都试过,但是lcd依然不显示
卧槽!原来是引脚给错了
程序没有问题,谢谢大家!
加忙检测试试
bit LCD_busy()
{
bit result;
LCD_RS=0;
LCD_RW=1;
LCD_E=1;
delay(1);
result=(bit)(P0&0x80);
LCD_E=0;
return result;
}
然后在写指令和写数据函数中调用忙检测函数while(bit LCD_busy());
有没有可能是硬件问题
有没有可能是硬件问题
有没有可能是硬件问题
是引脚加错了。
不过我想问一下测忙的原理是什么。
bit result是什么
就是lcd内部处理数据时忙标志位为1,此时不能接收单片机给它的新数据,直到检测到lcd内部的忙标志位为0时候送数据,大多数情况忙检测也可以不加,lcd处理数据时间比单片机快的多,基本就是做一下延时就可以了,但是会消耗cpu。
哦
谢谢!!11
谢谢分享,不错
。。
