250 lines
6.2 KiB
C
250 lines
6.2 KiB
C
|
#include<avr/io.h>
|
||
|
#include<util/delay.h>
|
||
|
|
||
|
#define HD44780_CLEAR 0x01
|
||
|
#define HD44780_HOME 0x02
|
||
|
#define HD44780_ENTRY_MODE 0x04
|
||
|
#define HD44780_EM_SHIFT_CURSOR 0
|
||
|
#define HD44780_EM_SHIFT_DISPLAY 1
|
||
|
#define HD44780_EM_DECREMENT 0
|
||
|
#define HD44780_EM_INCREMENT 2
|
||
|
#define HD44780_DISPLAY_ONOFF 0x08
|
||
|
#define HD44780_DISPLAY_OFF 0
|
||
|
#define HD44780_DISPLAY_ON 4
|
||
|
#define HD44780_CURSOR_OFF 0
|
||
|
#define HD44780_CURSOR_ON 2
|
||
|
#define HD44780_CURSOR_NOBLINK 0
|
||
|
#define HD44780_CURSOR_BLINK 1
|
||
|
#define HD44780_DISPLAY_CURSOR_SHIFT 0x10
|
||
|
#define HD44780_SHIFT_CURSOR 0
|
||
|
#define HD44780_SHIFT_DISPLAY 8
|
||
|
#define HD44780_SHIFT_LEFT 0
|
||
|
#define HD44780_SHIFT_RIGHT 4
|
||
|
#define HD44780_FUNCTION_SET 0x20
|
||
|
#define HD44780_FONT5x7 0
|
||
|
#define HD44780_FONT5x10 4
|
||
|
#define HD44780_ONE_LINE 0
|
||
|
#define HD44780_TWO_LINE 8
|
||
|
#define HD44780_4_BIT 0
|
||
|
#define HD44780_8_BIT 16
|
||
|
#define HD44780_CGRAM_SET 0x40
|
||
|
#define HD44780_DDRAM_SET 0x80
|
||
|
|
||
|
#define PORT(x) XPORT(x)
|
||
|
#define XPORT(x) (PORT##x)
|
||
|
#define PIN(x) XPIN(x)
|
||
|
#define XPIN(x) (PIN##x)
|
||
|
#define DDR(x) XDDR(x)
|
||
|
#define XDDR(x) (DDR##x)
|
||
|
|
||
|
#define LCD_DATA_PORT D
|
||
|
#define LCD_RS_PORT D
|
||
|
#define LCD_RW_PORT D
|
||
|
#define LCD_E_PORT D
|
||
|
#define LCD_D4_PIN 4
|
||
|
#define LCD_D5_PIN 5
|
||
|
#define LCD_D6_PIN 6
|
||
|
#define LCD_D7_PIN 7
|
||
|
#define LCD_RS_PIN 1
|
||
|
#define LCD_RW_PIN 2
|
||
|
#define LCD_E_PIN 3
|
||
|
|
||
|
void LCD_init(void);
|
||
|
void LCD_clear(void);
|
||
|
void LCD_goto(uint8_t x, uint8_t y);
|
||
|
void LCD_write_text(char * text);
|
||
|
|
||
|
int main(void) {
|
||
|
DDRC |= (1<<PC0);
|
||
|
PORTC |= (1<<PC0);
|
||
|
|
||
|
LCD_init();
|
||
|
LCD_clear();
|
||
|
LCD_goto(1,0);
|
||
|
LCD_write_text("TEST!TEST!TEST!");
|
||
|
|
||
|
while(1);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
uint8_t LCD_in_bits(void)
|
||
|
{
|
||
|
uint8_t tmp = 0;
|
||
|
if(((PIN(LCD_DATA_PORT) >> LCD_D4_PIN) & 0x01) != 0)
|
||
|
tmp |= (1 << 0);
|
||
|
if(((PIN(LCD_DATA_PORT) >> LCD_D5_PIN) & 0x01) != 0)
|
||
|
tmp |= (1 << 1);
|
||
|
if(((PIN(LCD_DATA_PORT) >> LCD_D6_PIN) & 0x01) != 0)
|
||
|
tmp |= (1 << 2);
|
||
|
if(((PIN(LCD_DATA_PORT) >> LCD_D7_PIN) & 0x01) != 0)
|
||
|
tmp |= (1 << 3);
|
||
|
return tmp;
|
||
|
}
|
||
|
|
||
|
uint8_t LCD_read(void)
|
||
|
{
|
||
|
uint8_t tmp = 0;
|
||
|
DDR(LCD_DATA_PORT) &=
|
||
|
~((1<<LCD_D4_PIN)|(1<<LCD_D5_PIN)|(1<<LCD_D6_PIN)|(1<<LCD_D7_PIN));
|
||
|
PORT(LCD_RW_PORT) |= (1<<LCD_RW_PIN);
|
||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||
|
tmp |= (LCD_in_bits() << 4);
|
||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||
|
_delay_ms(1);
|
||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||
|
tmp |= LCD_in_bits();
|
||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||
|
return tmp;
|
||
|
}
|
||
|
|
||
|
uint8_t LCD_ReadStatus(void)
|
||
|
{
|
||
|
PORT(LCD_RS_PORT) &= ~(1<<LCD_RS_PIN);
|
||
|
return LCD_read();
|
||
|
}
|
||
|
|
||
|
void LCD_out_bits(uint8_t bits_to_write)
|
||
|
{
|
||
|
if(bits_to_write & 0x01)
|
||
|
PORT(LCD_DATA_PORT) |= (1<<LCD_D4_PIN);
|
||
|
else
|
||
|
PORT(LCD_DATA_PORT) &= ~(1<<LCD_D4_PIN);
|
||
|
if(bits_to_write & 0x02)
|
||
|
PORT(LCD_DATA_PORT) |= (1<<LCD_D5_PIN);
|
||
|
else
|
||
|
PORT(LCD_DATA_PORT) &= ~(1<<LCD_D5_PIN);
|
||
|
if(bits_to_write & 0x04)
|
||
|
PORT(LCD_DATA_PORT) |= (1<<LCD_D6_PIN);
|
||
|
else
|
||
|
PORT(LCD_DATA_PORT) &= ~(1<<LCD_D6_PIN);
|
||
|
if(bits_to_write & 0x08)
|
||
|
PORT(LCD_DATA_PORT) |= (1<<LCD_D7_PIN);
|
||
|
else
|
||
|
PORT(LCD_DATA_PORT) &= ~(1<<LCD_D7_PIN);
|
||
|
}
|
||
|
|
||
|
void LCD_write(uint8_t data_to_write)
|
||
|
{
|
||
|
DDR(LCD_DATA_PORT) |=
|
||
|
((1<<LCD_D4_PIN)|(1<<LCD_D5_PIN)|(1<<LCD_D6_PIN)|(1<<LCD_D7_PIN));
|
||
|
PORT(LCD_RW_PORT) &= ~(1<<LCD_RW_PIN);
|
||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||
|
LCD_out_bits(data_to_write >> 4);
|
||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||
|
_delay_ms(1);
|
||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||
|
LCD_out_bits(data_to_write);
|
||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||
|
_delay_ms(1);
|
||
|
while(LCD_ReadStatus() & 0x80);
|
||
|
}
|
||
|
|
||
|
void LCD_just_write(uint8_t data_to_write)
|
||
|
{
|
||
|
DDR(LCD_DATA_PORT) |=
|
||
|
((1<<LCD_D4_PIN)|(1<<LCD_D5_PIN)|(1<<LCD_D6_PIN)|(
|
||
|
1<<LCD_D7_PIN));
|
||
|
PORT(LCD_RW_PORT) &= ~(1<<LCD_RW_PIN);
|
||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||
|
LCD_out_bits(data_to_write >> 4);
|
||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||
|
_delay_ms(1);
|
||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||
|
LCD_out_bits(data_to_write);
|
||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||
|
_delay_ms(1);
|
||
|
}
|
||
|
|
||
|
void LCD_just_write_command(uint8_t commandToWrite)
|
||
|
{
|
||
|
PORT(LCD_RS_PORT) &= ~(1<<LCD_RS_PIN);
|
||
|
LCD_just_write(commandToWrite);
|
||
|
}
|
||
|
void LCD_just_write_data(uint8_t data_to_write)
|
||
|
{
|
||
|
PORT(LCD_RS_PORT) |= (1<<LCD_RS_PIN);
|
||
|
LCD_just_write(data_to_write);
|
||
|
}
|
||
|
uint8_t LCD_NotBusy(void)
|
||
|
{
|
||
|
if(LCD_ReadStatus() != 0x80)
|
||
|
return 1;
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void LCD_write_command(uint8_t commandToWrite)
|
||
|
{
|
||
|
PORT(LCD_RS_PORT) &= ~(1<<LCD_RS_PIN);
|
||
|
LCD_write(commandToWrite);
|
||
|
}
|
||
|
|
||
|
void LCD_write_data(uint8_t data_to_write)
|
||
|
{
|
||
|
PORT(LCD_RS_PORT) |= (1<<LCD_RS_PIN);
|
||
|
LCD_write(data_to_write);
|
||
|
}
|
||
|
|
||
|
uint8_t LCD_read_data(void)
|
||
|
{
|
||
|
PORT(LCD_RS_PORT) |= (1<<LCD_RS_PIN);
|
||
|
return LCD_read();
|
||
|
}
|
||
|
|
||
|
void LCD_write_text(char * text)
|
||
|
{
|
||
|
while(*text != '\0' && *text != 0)
|
||
|
LCD_write_data(*text++);
|
||
|
}
|
||
|
|
||
|
void LCD_goto(uint8_t x, uint8_t y)
|
||
|
{
|
||
|
LCD_write_command(HD44780_DDRAM_SET | (x + (0x40 * y)));
|
||
|
}
|
||
|
|
||
|
void LCD_clear(void)
|
||
|
{
|
||
|
LCD_write_command(HD44780_CLEAR);
|
||
|
_delay_ms(2);
|
||
|
}
|
||
|
|
||
|
void LCD_home(void)
|
||
|
{
|
||
|
LCD_write_command(HD44780_HOME);
|
||
|
_delay_ms(2);
|
||
|
}
|
||
|
|
||
|
void LCD_init(void)
|
||
|
{
|
||
|
uint8_t i;
|
||
|
DDR(LCD_DATA_PORT) |=
|
||
|
((1<<LCD_D4_PIN)|(1<<LCD_D5_PIN)|(1<<LCD_D6_PIN)|(1<<LCD_D7_PIN));
|
||
|
DDR(LCD_RS_PORT) |= (1<<LCD_RS_PIN);
|
||
|
DDR(LCD_RW_PORT) |= (1<<LCD_RW_PIN);
|
||
|
DDR(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||
|
_delay_ms(15);
|
||
|
PORT(LCD_RS_PORT) &= ~(1<<LCD_RS_PIN);
|
||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||
|
PORT(LCD_RW_PORT) &= ~(1<<LCD_RW_PIN);
|
||
|
for(i = 0; i < 3; i++)
|
||
|
{
|
||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||
|
LCD_out_bits(0x03);
|
||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||
|
_delay_ms(5);
|
||
|
}
|
||
|
|
||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||
|
LCD_out_bits(0x02);
|
||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||
|
_delay_ms(1);
|
||
|
LCD_write_command(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE |
|
||
|
HD44780_4_BIT);
|
||
|
LCD_write_command(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF);
|
||
|
LCD_write_command(HD44780_CLEAR);
|
||
|
LCD_write_command(HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR |
|
||
|
HD44780_EM_INCREMENT);
|
||
|
LCD_write_command(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF |
|
||
|
HD44780_CURSOR_NOBLINK);
|
||
|
}
|