MIKR/lectures/LCD_lib/LCD-onefile.c
Dawid Pietrykowski 8749f5e3a9 First commit
2024-04-16 20:18:18 +02:00

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);
}