93 lines
1.8 KiB
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;
|
|
}
|
|
}
|