lord loh.
Member
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.h
lcdtest.c
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
Code:
#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);
}
stdmacro.h
Code:
#define rotl(var) (((var&0x80)>>7)|(var<<1))
#define sbi(port, bit) (port) |= (1 << (bit))
#define cbi(port, bit) (port) &= ~(1 << (bit))
lcdtest.c
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;
}