Saturday, January 30, 2016

Atmega88p code for a 16x1 LCD Screen


The pictures above uses the code below. The LCD screens are 1 by 16  and are split into 2 parts of 8.
Replace the pink XXXXXXXX, with the desired words, but remember, the screen is split in 2 parts.



//#define F_CPU         4000000UL
#include <avr/delay.h>
#include <avr/io.h>

/*LCD function declarations */
void LCD_send_command(unsigned char cmnd);
void LCD_send_data(unsigned char data);
void LCD_init();
void LCD_goto(unsigned char y, unsigned char x);
void LCD_print(char *string);
void LCD_blink();
void LCD_scroll(unsigned char direction);

#define LCD_DATA_PORT PORTB
#define LCD_DATA_DDR   DDRB
#define LCD_DATA_PIN     PINB

#define LCD_CNTRL_PORT           PORTC
#define LCD_CNTRL_DDR DDRC
#define LCD_CNTRL_PIN   PINC

#define LCD_RS_PIN                       0
#define LCD_RW_PIN                     1
#define LCD_ENABLE_PIN            2

int main(void)
{
DDRD =0xFF;
PORTD|=1<<0;
PORTD|=1<<1;
PORTD|=1<<2;
PORTD|=1<<3;
PORTD|=1<<4;
            unsigned char i;

    LCD_init();
            LCD_goto(1,1);
            LCD_print("XXXXXXXX");
            LCD_goto(2,1);
            LCD_print("XXXXXXXX");
      
}

/* This function sends a command 'cmnd' to the LCD module*/
void LCD_send_command(unsigned char cmnd)
{
            LCD_DATA_PORT = cmnd;
            LCD_CNTRL_PORT &= ~(1<<LCD_RW_PIN);
            LCD_CNTRL_PORT &= ~(1<<LCD_RS_PIN);

            LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
            _delay_us(2);
            LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
            _delay_us(100);
}

/* This function sends the data 'data' to the LCD module*/
void LCD_send_data(unsigned char data)
{
            LCD_DATA_PORT = data;
            LCD_CNTRL_PORT &= ~(1<<LCD_RW_PIN);
            LCD_CNTRL_PORT |= (1<<LCD_RS_PIN);

            LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
            _delay_us(2);
            LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
            _delay_us(100);
}

void LCD_init()
{
            LCD_CNTRL_DDR = 0xFF;
            LCD_CNTRL_PORT = 0x00;
            LCD_DATA_DDR = 0xFF;
            LCD_DATA_PORT = 0x00;

            _delay_ms(10);
            LCD_send_command(0x38);
            LCD_send_command(0x0C);
            LCD_send_command(0x01);
            _delay_ms(10);
            LCD_send_command(0x06);
}

/* This function moves the cursor the line y column x on the LCD module*/
void LCD_goto(unsigned char y, unsigned char x)
{
            unsigned char firstAddress[] = {0x80,0xC0,0x94,0xD4};

            LCD_send_command(firstAddress[y-1] + x-1);
            _delay_ms(10);          
}

void LCD_print(char *string)
{
            unsigned char i=0;

            while(string[i]!=0)
            {
                        LCD_send_data(string[i]);
                        i++;
            }
}

void LCD_blink()
{
            LCD_send_command(0x08);
            _delay_ms(250);
            LCD_send_command(0x0C);
            _delay_ms(250);
}

void LCD_scroll(unsigned char direction)
{
            if(direction == 0)
                        LCD_send_command(0x18);
            else
                        LCD_send_command(0x1C);

            _delay_ms(500);

}