我在使用4x20液晶顯示屏時遇到了問題。 過去幾天我一直在尋找許多指南和代碼片段,但似乎沒有任何幫助。 問題是顯示器什麼都沒顯示。帶Atmega32的4位4x20液晶顯示屏
當我在我的電腦上編譯它並將它全部打印在我的屏幕上時,一切似乎都沒有問題。
如果有人會通過它看看是否有任何明顯的錯誤,我將不勝感激。
在此先感謝。
// Connection:
//
// Atmega32 LCD
// PB0 -> DB4
// PB1 -> DB5
// PB2 -> DB6
// PB3 -> DB7
// PB4 -> RS
// PB5 -> R/W
// PB6 -> E
// PB7 ->
#include <avr/io.h>
#include <util/delay.h>
#define LCDPort PORTB
#define LCDDDR DDRB
#define enable 6 //Enable = on
#define readWrite 5 //Read = on, Write = off
#define RS 4 //Send command = off, send data = on
void checkBusy(void);
void updateLCD(void);
void sendCommand(unsigned char command);
void sendData(unsigned char character);
void sendInitCommand(unsigned char command);
int main(void)
{
LCDDDR |= 15;
LCDDDR |= 1 << enable; //Set control lines as output (high)
LCDDDR |= 1 << readWrite;
LCDDDR |= 1 << RS;
_delay_ms(100); //Wait for LCD to boot
sendInitCommand(0x3); //Init function set 1
_delay_ms(100);
sendInitCommand(0x3); //Init function set 2
_delay_us(100);
sendInitCommand(0x3); //Init function set 3
_delay_us(100);
sendInitCommand(0x2); //Function set (set 4 bit mode)
_delay_us(100);
sendInitCommand(0x28); //Funcion set I=1, N=0, F=0
//sendInitCommand(0x8);
_delay_us(60);
sendInitCommand(0x8); //On/off control D=0, C=0, B=0
//sendInitCommand(0x8);
_delay_us(60);
sendCommand(0x01); //Clear display
//sendInitCommand(0x1);
_delay_ms(60);
sendCommand(0x06); //Entry mode set I/D=1, S=0
//sendInitCommand(0x6);
_delay_us(60);
sendCommand(0x0C); //On/off control D=1, C=0, B=0
//sendInitCommand(0xC);
_delay_us(60);
sendData(0x41); //Display "A"
sendData(0x42); //Display "B"
sendData(0x43); //Display "C"
sendData(0x44); //Display "D"
sendData(0x45); //Display "E"
while(1) {
}
return 0;
}
void checkBusy() {
LCDDDR &= ~15; //Set data DDR lines read (low)
/* LCDPort |= 1 << readWrite; //Forget read for now - use delay instead
LCDPort &= ~1 << RS;
while((LCDPort & 15) >= 0x8) {
updateLCD();
}
*/
_delay_ms(50);
LCDDDR |= 15; //Set data lines DDR to write (high)
}
void updateLCD() {
LCDPort |= 1 << enable; //Enable
asm volatile ("nop");
asm volatile ("nop");
LCDPort &= ~1 << enable; //Disable
}
void sendCommand(unsigned char command) {
checkBusy();
LCDPort &= ~(1 << readWrite | 1 << RS); //Set R/W and RS low (write command)
LCDPort |= (command >> 4) & 15; //Send 4 ms bits
updateLCD();
LCDPort &= ~15;
LCDPort |= command & 15; //Send 4 ls bits
updateLCD();
LCDPort &= ~15; //Clear data lines
}
void sendData(unsigned char character) {
checkBusy();
LCDPort &= ~1 << readWrite; //Set R/W low and RS high (write data)
LCDPort |= 1 << RS;
LCDPort |= (character >> 4 & 15); //Send 4 ms bits
updateLCD();
LCDPort &= ~1 << readWrite;
LCDPort &= ~15;
LCDPort |= 1 << RS;
LCDPort |= (character & 15); //Send 4 ls bits
updateLCD();
LCDPort &= ~15; //Clear data lines
}
void sendInitCommand(unsigned char command) {
LCDPort &= ~(1 << readWrite | 1 << RS); //Set R/W and RS low (write command)
LCDPort |= command & 15;
updateLCD();
LCDPort &= ~15; //Clear data lines
}
時間打出來的範圍... –
顯示器是什麼型號或芯片組?你有鏈接到它的specsheet? –
我從一個朋友那裏得到它的工作在4位模式。 我能找到的唯一數據表是:http://www.powertipusa.com/pdf/pc2004a.pdf – nettogrisen