
I have commented on delay routines, otherwise it will not work with the simulator.
Code: Select all
#ifndef HD44780_H
#define HD44780_H
#include<avr/io.h>
#ifndef F_CPU
#define F_CPU 12000000
#endif
#include<util/delay.h>
#define CLEAR_DISPLAY 0b00000001
#define RETURN_HOME 0b00000010
#define DISPLAY_ON 0b00001100
#define DISPLAY_OFF 0b00001000
#define DIS_ON_CUR_ON_BLNK_OFF 0b00001110
#define DIS_ON_CUR_OFF_BLNK_OFF 0b00001100
#define DIS_ON_CUR_ON_BLNK_ON 0b00001111
#define DIS_ON_CUR_ON_BLNK_OFF 0b00001110
#define DIS_FUNC_SET 0b00111000 //8bit data, 2 lines, 5x10 dots
#define SET_E_PIN (PORTD |=(1<<3))
#define CLR_E_PIN (PORTD &=~(1<<3))
#define SET_RW_PIN (PORTD |=(1<<2))
#define CLR_RW_PIN (PORTD &=~(1<<2))
#define SET_RS_PIN (PORTD |=(1<<1))
#define CLR_RS_PIN (PORTD &=~(1<<1))
#define LCD_PORT PORTB
extern void init_HD44780();
extern void write_HD44780_Command(unsigned char cmd);
extern void write_HD44780_DataAt(unsigned char address, char* data);
extern void write_HD44780_Data(char* data);
extern void set_HD44780_DDRAM_Address(unsigned char address);
short LCDBusy();
#endif
Code: Select all
#include "hd44780.h"
void init_HD44780(){
DDRB=0xFF;//All pins output
DDRD=0xFF;
// while(!LCDBusy());
write_HD44780_Command(CLEAR_DISPLAY);
// while(!LCDBusy());
write_HD44780_Command(DIS_ON_CUR_ON_BLNK_ON);
// while(!LCDBusy());
write_HD44780_Command(DIS_FUNC_SET);
}
void write_HD44780_Command(unsigned char cmd){
LCD_PORT=0x0;
LCD_PORT|=cmd;
CLR_RW_PIN;
CLR_RS_PIN;
CLR_E_PIN;
SET_E_PIN;
// _delay_us(1);// wait
CLR_E_PIN;
// _delay_ms(5);
}
void write_HD44780_DataAt(unsigned char address,char* data){
set_HD44780_DDRAM_Address(address);
write_HD44780_Data(data);
}
void write_HD44780_Data(char* data){
SET_RS_PIN;
CLR_RW_PIN;
CLR_E_PIN;
while(*data){
// while(!LCDBusy());
LCD_PORT=0x0;
LCD_PORT=*data;
SET_E_PIN;
// _delay_us(1);
CLR_E_PIN;
// _delay_us(200);
data++;
}
}
void set_HD44780_DDRAM_Address(unsigned char address){
CLR_RS_PIN;//select IR
CLR_RW_PIN;//Going to write
LCD_PORT=0x0;
LCD_PORT|=(1<<7); //|=0b10000000
//Now set address
LCD_PORT|=address;
CLR_E_PIN;
//_delay_us(2);
SET_E_PIN;
// _delay_us(2);
CLR_E_PIN;
// _delay_ms(5);
}
short LCDBusy(){
SET_RW_PIN;
CLR_RS_PIN;
SET_E_PIN;
_delay_us(10);
if(LCD_PORT & 0x80) {// PIN 7 high
CLR_E_PIN;
CLR_RW_PIN;
return 1;
}else{
CLR_E_PIN;
CLR_RW_PIN;
return 0;
}
}

Thanks.