Hello guys, I am quite new to AVR and GCC and I am having a bit of trouble trying to get a LCD to work in 4 bit mode, I have been able to get it to work in 8 bit mode, but I think I am initializing it wrong, I have actually no clue whats wrong, I have been following this for the initialization
This may be an Arduino forum but someone must know some gcc ?
and here is my code, I know it looks bad but i will neaten it up when it works!
:
#include<util/delay.h>
#include<avr/interrupt.h>
#define DATA_DDR DDRB
#define DATA_PORT PORTB
#define CONTROL_DDR DDRD
#define CONTROL_PORT PORTD
#define Enable_Pin 6
#define RegSelect_Pin 4
#define ReadWrite_Pin 5
#define Set_Enable CONTROL_PORT|=_BV(Enable_Pin)
#define Clear_Enable CONTROL_PORT&=~_BV(Enable_Pin)
#define Write_Lcd CONTROL_PORT&=~_BV(ReadWrite_Pin)
#define Read_Lcd CONTROL_PORT|=_BV(ReadWrite_Pin)
#define Select_InstructionRegister CONTROL_PORT&=~_BV(RegSelect_Pin) //Sets register select low
#define Select_DataRegister CONTROL_PORT|=_BV(RegSelect_Pin)
int main(void)
{
_delay_ms(20);
Select_InstructionRegister;
PORTB = 0B0000;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
PORTB = 0B0011;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
_delay_ms(5);
PORTB = 0B0000;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
PORTB = 0B0011;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
_delay_us(160);
PORTB = 0B0000;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
PORTB = 0B0011;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
_delay_us(160);
PORTB = 0B0000;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
PORTB = 0B0010;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
_delay_us(160);
PORTB = 0B0011;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
PORTB = 0B1000;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
PORTB = 0B0011;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
PORTB = 0B1000;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
PORTB = 0B0001;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
PORTB = 0B0000;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
PORTB = 0B0000;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
PORTB = 0B0001;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
PORTB = 0B0000;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
PORTB = 0B0110;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
PORTB = 0B0000;
Set_Enable;
Clear_Enable;
_delay_us(100);
PORTB = 0B1100;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
for(;;) // loop forever
{
Select_DataRegister;
PORTB = 0B0010;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
PORTB = 0B1110;
Set_Enable;
_delay_us(100);
Clear_Enable;
_delay_us(100);
}
}
Any help appreciated...
P.S I have posted this on other forums if you have seen this post before, I just want to get the quickest and best reply.