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