之前看到一个牛人zhu123帖子,是用二线连接1602。只用2个IO口节省了资源,但效果不太好,显示速度慢。改成三线后效果就很好,可以实用化。这种接法的原理就是利用电容的充电放电效应进行存储数字位,类似动态存储器的原理。原贴是用51汇编写的,现在我用Arduino实现了三线连接的实用化。经实验,瓷片电容选择范围可从10nf-100nf都可以。代码有注释,很好懂。
二线连接帖子位置http://www.51hei.com/bbs/dpj-20365-1.html
制作出来的实物图如下:
实物
用Proteus仿真
单片机源程序如下:
- #define setXy(x,y) lcdWrite(0,(x<<6)|(y&15)|0x80)
- #define dataA 4
- #define dataB 5
- #define commPin 6
- void lcdWrite(byte RS,char dat)
- {
- byte i;
- for (i = 2; i > 0; --i) //运行两次,分别对应字节高4位和低4位
- {
- digitalWrite( dataB,dat & 0x80); //LED_D7口。置位数据口为1。如果D7是1,先给D7位的C4充电(C1、C2、C3也会充满电,这里不用管),在跌到低电平之前,将其他3个位充好电,再将1602使能读入,即可完成半个字节数据的读入。
- digitalWrite( dataA,dat & 0x20); //LED_D5口。置位数据口为1
- digitalWrite( commPin,RS);//置位命令口为1。如果RS是1,是数据,0是命令
- delayMicroseconds(400); //683电容,延时400us
- digitalWrite( commPin,HIGH); //置位命令口为1
- digitalWrite( dataB,dat & 0x40); //LED_D6口。置位数据口为1
- digitalWrite( dataA,dat & 0x10); //LED_D4口。置位数据口为1
- delayMicroseconds(1); //0.5us < t < 1.36us
- digitalWrite( commPin,LOW); //命令口清零,1602使能,读入数据
- delayMicroseconds(50);
- dat <<= 4;
- }
- }
- void lcdPrint(char *p)
- {
- while(*p) lcdWrite(1,*p++);
- }
- void lcdInit(void)
- {
- byte i = 3;
- digitalWrite( dataB,LOW); //D7=0
- digitalWrite( commPin,LOW); //命令口清零
- delayMicroseconds(400); //683电容,延时400us
- do{
- digitalWrite( dataB,LOW); //D6=0
- delayMicroseconds(1);
- digitalWrite( dataA,HIGH); //D5=1
- delayMicroseconds(400); //683电容,延时400us
- if (i == 0) {digitalWrite( dataA,LOW); } //D4=0
- digitalWrite( commPin,HIGH); //置位命令口为1
- delayMicroseconds(3);
- digitalWrite( commPin,LOW); //命令口清零
- delayMicroseconds(3);
- }while(i--);
- delay(100);
- lcdWrite(0,0x28); //4线 2行 5x7
- delay(50);;
- lcdWrite(0,0x06);//输入方式自动增量,没有显示移位
- delay(50);;
- lcdWrite(0,0x0c);//开启显示屏,光标不显示,无闪烁
- delay(50);;
- lcdWrite(0,0x01);//清除显示屏,地址计数器AC归零
- delay(50);;
- }
- int adc;
- void setup()
- {
- byte aa=45;
- pinMode(dataA,OUTPUT);
- pinMode(dataB,OUTPUT);
- pinMode(commPin,OUTPUT);
- delay(100);
- lcdInit();//对LCD进行初始化
- }
- void loop()
- {
- setXy(0,0);
- lcdPrint(" ");
- setXy(0,0);
- lcdPrint("The value is:");
- setXy(1,0);
- lcdPrint(" ");
- setXy(1,0);
- lcdPrint("352");
- delay(1000);
复制代码
以上程序51hei提供下载:
三线连接1602.zip
(1.11 KB, 下载次数: 42)
|