ak-kr-project/Core/Src/lcd.c

93 lines
1.8 KiB
C

#include "main.h"
#include "lcd.h"
#include "generic_macros.h"
void display_init(void)
{
// switch to 4-bit 2-line mode
display_write_instruction_byte(0x28);
// clear display
display_write_instruction_byte(0x01);
// enable display
display_write_instruction_byte(0x0C);
// move cursor to first line
display_write_instruction_byte(0x80);
}
uint8_t display_read_status(void)
{
// make sure GPIOE is in correct mode
GPIOE->MODER = 0x00504000;
if (GPIOE->MODER != 0x00504000)
PANIC(0x4000);
uint8_t status = 0;
GPIOE->ODR = 0x0;
GPIOE->BSRR = DISPLAY_RW;
GPIOE->BSRR = DISPLAY_ENA;
status |= (GPIOE->IDR & 0xF000) >> 8;
GPIOE->BSRR = (DISPLAY_ENA << 16);
GPIOE->BSRR = DISPLAY_ENA;
status |= (GPIOE->IDR & 0xF000) >> 12;
GPIOE->BSRR = (DISPLAY_ENA << 16);
GPIOE->ODR = 0x0;
return status;
}
void display_write_instruction_byte(uint8_t code)
{
DISPLAY_POLL_UNTIL_READY;
// make sure GPIOE is in correct mode
GPIOE->MODER = 0x55504000;
if (GPIOE->MODER != 0x55504000)
PANIC(0x4000);
GPIOE->ODR = (code & 0xF0) << 8;
GPIOE->BSRR = DISPLAY_ENA;
GPIOE->BSRR = (DISPLAY_ENA << 16);
GPIOE->ODR = (code & 0x0F) << 12;
GPIOE->BSRR = DISPLAY_ENA;
GPIOE->BSRR = (DISPLAY_ENA << 16);
}
void display_write_data_byte(uint8_t code)
{
DISPLAY_POLL_UNTIL_READY;
// make sure GPIOE is in correct mode
GPIOE->MODER = 0x55504000;
if (GPIOE->MODER != 0x55504000)
PANIC(0x4000);
GPIOE->ODR = ((code & 0xF0) << 8) | (DISPLAY_RS);
GPIOE->BSRR = DISPLAY_ENA;
GPIOE->BSRR = DISPLAY_ENA << 16;
GPIOE->ODR = ((code & 0x0F) << 12) | (DISPLAY_RS);
GPIOE->BSRR = DISPLAY_ENA;
GPIOE->BSRR = DISPLAY_ENA << 16;
}
void display_write_data_seq(char *codes)
{
for (size_t i = 0; i < 16; i++) {
if (codes[i] != 0)
display_write_data_byte(codes[i]);
else
break;
}
}