2013-01-04 57 views
0

我在使用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 
} 
+4

時間打出來的範圍... –

+0

顯示器是什麼型號或芯片組?你有鏈接到它的specsheet? –

+0

我從一個朋友那裏得到它的工作在4位模式。 我能找到的唯一數據表是:http://www.powertipusa.com/pdf/pc2004a.pdf – nettogrisen

回答

2

似乎這是一個HD44780兼容控制器。

請注意,每個4x20顯示屏都是一個2x40的實際中間切割。這可以通過一個顯示控制器來實現,但顯示屏需要多個驅動程序。 滿足這一點: HD44780

儘管如此,您仍然可以在4位模式下連接顯示器。 (請注意,引腳15(LED +)和引腳16(LED-)缺失,只有背光引腳)。下面是一個示例如何在位模式下連接4x20 (注意引腳15(LED +)和引腳16不要忘記將Pin5(R/W)連接到GND。

HD44780 in 4 Bit Mode

一個很好的LIB到接口的HD44780的4x20是由彼得·弗勒裏寫的: http://homepage.hispeed.ch/peterfleury/avr-software.html#libs 節「基於HD44870 LCD的液晶庫」試試看

+0

非常感謝:) 我想知道這件事。當我調整對比度時,我只看到2行(第1行和第3行)上的黑框。 那麼這是否意味着我的方案與我的方式? 我打算去研究你現在發佈的lib。 – nettogrisen

+0

不,但是lib是一種快速且便宜的方式來了解更多關於連接字符lcd的信息。在lcd.h中有一些小的改動,當你只能看到第1行和第3行時,你可以連接每個HD44780(2x16,4x16,4x20,等等......) – derWilly

+0

看lcd中的「顯示大小的定義」 .h,每行有起始地址。這可以解決你的問題 – derWilly