3个IO驱动LCD1602
本帖最后由 Tliang 于 2013-3-9 10:11 编辑使用单片机的3个IO驱动LCD1602
只要加几个电容和电阻即可
说明:
这个办法我也是在网上看到的。不是我的原创。
工程包:
里面包括KEIL工程和PROTEUS仿真文件
原理:
这个是利用电容的记忆特性来做的。
也就是充放电。
当电容里面没有电的时候,就相当于短路。这个时候自然是0了
如果你想要他变成1,那么就给他充一段时间的电,给他充电的这个IO拉高,等到充好了。然后你再置0,这个时候就有两个不同的状态了。因为电容充完电后要变成0的话有一个放电过程。而你在他的电还没放完的时候就将数据写入LCD这样就OK了。
如果你要他变0就把他的电放完,也就是把IO拉低。等电放完后他又变成0.然后你在改变IO的状态。他充电也要一段时间才能到1.
使用KEIL和PROTEUS联调可以很清楚看到整个过程。很容易理解
图片:
代码: #include<reg52.h>
sbit E_And_RS = P1 ^ 2;
sbit Data1 = P1 ^ 1;
sbit Data2 = P1;
typedef bit ubit;
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
void delay(uint16 Time)
{
while(Time--);
}
void LCD_WriteDataAndComm(uint8 Data, ubit Control)
{
uint8 Flag;
for(Flag = 0;Flag < 2;Flag++)
{
if(Control) //判断写命令还是写数据
E_And_RS = 1; //写数据,对RS脚充电
else
E_And_RS = 0; //写命令,对RS脚放电
if(Data & 0x20) //判断D7脚数据
Data1 = 1; //为1则充电
else
Data1 = 0; //放电
if(Data & 0x80) //判断D5脚数据
Data2 = 1;
else
Data2 = 0;
delay(30); //等待充满或放完
if(Data & 0x10) //判断D4脚数据
Data1 = 1; //输出数据
else
Data1 = 0;
if(Data & 0x40) //判断D6脚数据
Data2 = 1;
else
Data2 = 0;
E_And_RS = 1; //拉高
Data <<= 4;
E_And_RS = 0; //数据写入.
}
delay(20);
}
void LCD_Init(void)
{
E_And_RS = 0; //RS脚放电
Data1 = 1; //D5脚充电,
Data2 = 0; //D7脚放电
delay(30); //等待充满或放完
Data1 = 0; //拉低D4
E_And_RS = 1; //写入0x20,为4BIT模式
delay(1);
E_And_RS = 0; //写入数据,LCD1602为上升沿读出数据下降沿写入数据
LCD_WriteDataAndComm(0x28, 0);
LCD_WriteDataAndComm(0x08, 0);
LCD_WriteDataAndComm(0x01, 0);
LCD_WriteDataAndComm(0x06, 0);
LCD_WriteDataAndComm(0x0C, 0);
}
void Show_Str(uint8 *Str, uint8 Addr)
{
LCD_WriteDataAndComm(Addr, 0);
while(*Str)
LCD_WriteDataAndComm(*Str++, 1);
}
void main(void)
{
LCD_Init();
Show_Str("Tliang Holle!", 0x80);
Show_Str("QQ:459436468", 0xc3);
while(1);
} 这也行? 天亮,验证过没有,说说原理,把原理放主楼。然后就可以加精了。:lol 本帖最后由 Tliang 于 2013-3-9 10:20 编辑
箫天 发表于 2013-3-8 20:03 http://www.avrbase.com/static/image/common/back.gif
天亮,验证过没有,说说原理,把原理放主楼。然后就可以加精了。
我在仿真上试过,实际应该也可以(我网上看的那个别人就是用实物来做的)。
希望老大能给个精:loveliness: 验证上图看看 原理一说,清楚了。 果然该射精! 生猛! 亮哥你真是仿真高人啊!! 可以,还有用一根线驱动的,考的是容阻改变信号的相位 八斤 发表于 2013-3-12 09:18 static/image/common/back.gif
可以,还有用一根线驱动的,考的是容阻改变信号的相位
- -!
一根线太慢了 学习了,谢谢楼主分享!! 路过看看,谢谢分享!!!! 我以前用三个io是通过595实现的,这个nb,但是可能会造成程序复杂速度慢。 这样都行,太牛了!
页:
[1]