|
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);
- }
- }
- }*/
復制代碼
|
-
-
BTComm.zip
2015-12-27 03:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
2.06 KB, 下載次數: 38, 下載積分: 黑幣 -5
|