原帖由
A670521546
发自:dev.eefocus.com
------------------------------------------------------------------------------------------------------------------------------------------
先利用手头有的,学基础吧,看到高手们发的都是比较深的,移植系统什么的,现在干不了那事,就干些自己能做的,慢慢来 当然参考了一下其他的资料。 图片什么的后面再补 现在是最基础的8线的。 还有四线的,以及Arduino里有一个库LiquidCrystal,是4位/8位并行接口LCD常用到的库,封装了很多常用的LCD功能,这些后面慢慢来研究,在学习不上
int DI=12;
int RW=11;
int DB[]={3,4,5,6,7,8,9,10};
int E=2;
unsigned char table[]={"Hello World!"}; unsigned char temp[]={"I Love UNO32"};
void LcdCommandWrite(int value) //写命令
{
int i=0;
for(i=DB[0];i<=DI;i++) //1602液晶信号识别是D7-D0(不是D0-D7),这里是用来反转信号。
{
digitalWrite(i,value&01);
value>>=1;
}
digitalWrite(E,LOW);
delayMicroseconds(1);
digitalWrite(E,HIGH);
delayMicroseconds(1);
digitalWrite(E,LOW);
delayMicroseconds(1);
}
void LcdDataWrite(int value) //写数据命令
{
int i=0;
digitalWrite(DI,HIGH);
digitalWrite(RW,LOW);
for(i=DB[0];i<=DB[7];i++)
{
digitalWrite(i,value&01);
value>>=1;
}
digitalWrite(E,LOW);
delayMicroseconds(1);
digitalWrite(E,HIGH);
delayMicroseconds(1);
digitalWrite(E,LOW);
delayMicroseconds(1);
}
void Init(void) //初始化
{
LcdCommandWrite(0x38);
delay(20);
LcdCommandWrite(0x38);
delay(20);
LcdCommandWrite(0x38);
delay(20);
LcdCommandWrite(0x06);
delay(20);
LcdCommandWrite(0x0C);
delay(20);
LcdCommandWrite(0x01);
delay(20);
LcdCommandWrite(0x80);
delay(20);
}
void setup()
{
int i=0;
for(i=E;i<=DI;i++) {
pinMode(i,OUTPUT);
// delay(100); }
}
void loop()
{
unsigned char i;
Init();
LcdCommandWrite(0x01);
delay(10);
LcdCommandWrite(0x80); delay(5);//这个很重要,不然会出现下面我说到的问题
for(i=0;i<13;i++)
{
LcdDataWrite(table);
delay(5);
} delay(10);
LcdCommandWrite(0x80+0x40);
delay(5);
for(i=0;i<12;i++)
{
LcdDataWrite(temp);
delay(5);
}
while(1);
}
while(1);
}
这段代码有点问题是,第一个字符显示不了,所以我在数组里加了一个‘ ’来作为第一个字符,这里不知哪里有点问题,造成这样,现在找原因 现在已经解决问题了,只要在 LcdCommandWrite(0x80+0x01);后再加上一个延时delay(5);就可以了,就不会出现上面的问题,亲测。
不知道大家使用时会不会出现这个问题。 修改后代码如上,效果图:
|