hasslesstech 3766ddfdc1 [lcd] add support for operating on virtual framebuffers
Current implementation contains full support for:
- transparent switching between direct and framebuffer rendering modes
- writing characters to framebuffers
- loading frame from memory to physical display

As well as partial support for instruction writes including:
- resetting the display (clears memory, sets cursor at 0:0, switches to increment mode)
- switching between increment/decrement modes
- setting cursor position
2025-04-14 16:53:13 +03:00

34 lines
996 B
C

#ifndef __LCD
#define __LCD
#include <stdint.h>
#define DISPLAY_RS ((uint16_t) (0x1U << 7))
#define DISPLAY_RW ((uint16_t) (0x1U << 10))
#define DISPLAY_ENA ((uint16_t) (0x1U << 11))
#define DISPLAY_FRAMES_AVAILABLE 14
#define DISPLAY_POLL_UNTIL_READY do { while (display_read_status() & 0x80) {} } while (0)
#define DISPLAY_SET_INCREMENT do { display_write_instruction_byte(0x06); } while (0)
#define DISPLAY_SET_DECREMENT do { display_write_instruction_byte(0x04); } while (0)
#define DISPLAY_SET_CURSOR(line, position) do { display_write_instruction_byte(0x80 | (line << 6) | position); } while (0)
#define DISPLAY_CLEAR do { display_write_instruction_byte(0x01); } while (0)
struct Display_emu_state {
size_t cursor_offset:5;
size_t next:1;
};
void display_init(void);
void display_write_instruction_byte(uint8_t code);
void display_write_data_byte(uint8_t code);
void display_write_data_seq(char *codes);
void display_to_framebuffer(void);
void display_to_direct(void);
#endif