I have been working for the past few days to interface a 16x2 LCD Module with an ATmega32 without success...
My connections are as
E -> D.7
RS ->C.4
RW ->C.5
DB4->C.0
DB5->C.1
DB6->C.2
DB7->C.3
Here are my files.
Where can I be going wrong?
Please help. Thanks in advance.
lcd.h
stdmacro.hCode:#define LCD_PORT PORTC #define LCD_BUSY 3 #define LCD_CMD 4 #define LCD_RW 5 #define LCD_LED 6 #define LCD_SEL 7 #define LCDWord(data,cmd,rw) ((data)|(cmd<<LCD_CMD)|(rw<<LCD_RW)|(LCD_PORT&0x40)) #define selectLCD (PORTD &= ~(1 <<7)) #define unSelectLCD (PORTD |= (1<<7)) #define ledOn sbi(LCD_PORT,LCD_LED) #define ledOff cbi(LCD_PORT,LCD_LED) void lcd_init(void); void lcd_writeCommand(unsigned char data); void lcd_writeData(unsigned char data); void lcdBusy(void); void clk(void); void clk(void) { unSelectLCD; _delay_us(5); selectLCD; } void lcd_init(void) { sbi(DDRD,7); DDRC=0xff; //PORT C -> Output. selectLCD; //clk ->Low LCD_PORT=LCDWord(0b0011,0,0); //8bit interface clk(); //clk = high->low _delay_ms(20); clk(); _delay_ms(20); clk(); _delay_ms(20); LCD_PORT=LCDWord(0b0010,0,0); //4bit interface clk(); _delay_ms(20); lcd_writeCommand(0b00101000); //4 Bit 2 Line lcd_writeCommand(0b00001110); //Display ON Cursor On lcd_writeCommand(0b00000110); //Entry mode lcd_writeCommand(0b00000001); //ClearDisplay lcd_writeCommand(0b00000010); //Return Home } void lcd_writeCommand(unsigned char data) { LCD_PORT=LCDWord(((data&0xF0)>>4),0,0); //MSB clk(); lcdBusy(); LCD_PORT=LCDWord((data&0x0F),0,0); //LSB clk(); lcdBusy(); } void lcd_writeData(unsigned char data) { LCD_PORT=LCDWord(((data&0xF0)>>4),1,0); //MSB clk(); lcdBusy(); LCD_PORT=LCDWord((data&0x0F),1,0); //LSB clk(); lcdBusy(); } void lcdBusy(void) { /*cbi(DDRC,LCD_BUSY); //Make Bit 7 as i/p unSelectLCD; //EN->H cbi(LCD_PORT,LCD_CMD); //Command sbi(LCD_PORT,LCD_RW); //Read while(1) { selectLCD; unSelectLCD; if bit_is_set(LCD_PORT,LCD_BUSY) break; } sbi(DDRC,LCD_BUSY); //Make Bit 7 as o/p */ _delay_ms(20); }
lcdtest.cCode:#define rotl(var) (((var&0x80)>>7)|(var<<1)) #define sbi(port, bit) (port) |= (1 << (bit)) #define cbi(port, bit) (port) &= ~(1 << (bit))
Code:#include <avr/io.h> #include <avr/wdt.h> #define F_CPU 1000000UL #include <util/delay.h> #include "stdmacro.h" #include "lcd.h" int main() { wdt_disable(); _delay_ms(5); lcd_init(); ledOn; lcd_writeCommand(0x84); lcd_writeData(0x45); while(1) return 0; }


Reply With Quote
