|
LCD貌似很少用了 太小 这个作为串入并出的一个小实验罢LCD1602的数据线有8个直接用单片机驱动很费IO口,所以用74hc595(3位控制线串入8位并出)芯片的输出端连接到LCD1602的数据线上
之前试了几次都没有弄好 主要是对数据手册理解有误

代码(电路连接方式很简单,包含在其中):
- #include"Display.h"
- #include<avr/pgmspace.h>
- //unsigned char dpins[8]={A0,A1,A2,A3,A4,A5,8,9};
- void InitLCD1602();
- void WriteLCD1602Cmd(unsigned char cmd);
- void AllowInput74HC595();
- void WriteByte74HC595(byte data);
- void AllowOutput74HC595();
- void InitDisplay()
- {
- pinMode(_74HC595_RCK,OUTPUT);
- pinMode(_74HC595_SCK,OUTPUT);
- pinMode(_74HC595_SI,OUTPUT);
- AllowInput74HC595();
- WriteByte74HC595(0x00);
- AllowOutput74HC595();
- InitLCD1602();
-
- }
- void InitLCD1602()
- {
- pinMode(LCD1602_RS,OUTPUT);
- pinMode(LCD1602_RW,OUTPUT);
- pinMode(LCD1602_EN,OUTPUT);
- digitalWrite(LCD1602_EN,HIGH);
- digitalWrite(LCD1602_RW,HIGH);
- digitalWrite(LCD1602_RS,HIGH);
- /*
- for(int i=0;i<8;i++)
- {
- pinMode(dpins[i],OUTPUT);
- digitalWrite(dpins[i],LOW);
- }*/
- LCD1602_ENABLE;
- delayMicroseconds(100);
- WriteLCD1602Cmd(0x3c);//16*2行显示,5*10点阵,8数据接口
- delayMicroseconds(64);
- WriteLCD1602Cmd(0x3c);//16*2行显示,5*10点阵,8数据接口
- delayMicroseconds(50);
- WriteLCD1602Cmd(0x3c);
- delay(20);
- WriteLCD1602Cmd(0x06);//显示模式,屏幕不动,字符后移
- delayMicroseconds(20);
- WriteLCD1602Cmd(0x0c); //屏幕开,光标关
- delayMicroseconds(20);
- WriteLCD1602Cmd(0x01);//清屏
- delayMicroseconds(20);
- }
- void WriteLCD1602Cmd(unsigned char cmd)
- {
-
- LCD1602_RS_LOW; //rs=0:读取/写入指令模式
- LCD1602_RW_WRITE;
-
- delayMicroseconds(1);
- LCD1602_ENABLE;
- delayMicroseconds(1);
-
- AllowInput74HC595();
- WriteByte74HC595(cmd);
- AllowOutput74HC595();
-
- //WriteDpins(cmd);
- delayMicroseconds(1);
-
- LCD1602_DISABLE;
- delayMicroseconds(1);
- LCD1602_ENABLE;
- delayMicroseconds(1);
- }
- void WriteLCD1602Data(unsigned char data)
- {
-
- LCD1602_RS_HIGH;
- LCD1602_RW_WRITE;
- delayMicroseconds(1);
- LCD1602_ENABLE;
- delayMicroseconds(1);
-
- AllowInput74HC595();
- WriteByte74HC595(data);
- AllowOutput74HC595();
-
- //WriteDpins(data);
- delayMicroseconds(1);
-
- LCD1602_DISABLE;
- delayMicroseconds(1);
- LCD1602_ENABLE;
- delayMicroseconds(1);
- }
- void ClearLCD1602()
- {
- int i;
- WriteLCD1602Cmd(0x80); //写数据指针地址,0位置显示
- for(i=0;i<16;i++)
- {
- WriteLCD1602Data(' ');
- delay(5);
- }
- WriteLCD1602Cmd(0xC0); //第二行显示
- for(i=0;i<16;i++)
- {
- WriteLCD1602Data(' ');
- delay(5);
- }
-
-
- }
- void Display(unsigned char row,char str[])
- {
- int i;
- if(row==1)
- {
- WriteLCD1602Cmd(0x80); //写数据指针地址,0位置显示
- }
- else
- {
- WriteLCD1602Cmd(0xC0); //第二行显示
- }
- int len=strlen(str);
- for(i=0;i<len;i++)
- {
- WriteLCD1602Data(str[i]);
- delay(5);
- }
- }
- void AllowInput74HC595()
- {
- digitalWrite(_74HC595_RCK,LOW);//allow input 74HC595
- }
- void AllowOutput74HC595()
- {
- digitalWrite(_74HC595_RCK,HIGH);//allow output 74HC595
- }
- void WriteByte74HC595(unsigned char data)
- {
- boolean pinState;
- unsigned char i;
-
- digitalWrite(_74HC595_SI,LOW);
- digitalWrite(_74HC595_SCK,LOW);
- for(i=0;i<=7;i++)
- {
- digitalWrite(_74HC595_SCK,LOW);//before output 1bit must set SCK low
- if(data &(0x01<<i))
- {
- pinState=HIGH;
- }
- else
- {
- pinState=LOW;
- }
- digitalWrite(_74HC595_SI,pinState);//write 1bit
- digitalWrite(_74HC595_SCK,HIGH);//74HC595 receive when rising edge occur
- }
- digitalWrite(_74HC595_SCK,LOW); //stop 74HC595 input
- }
- /*
- void WriteDpins(unsigned char d)
- {
-
- int i;
- for(i=0;i<8;i++)
- {
- if(d &(0x01<<i))
- {
- digitalWrite(dpins[i],HIGH);
- }
- else
- {
- digitalWrite(dpins[i],LOW);
- }
- }
- }*/
复制代码
|
|