#include #include #include #include #include "SystemFont5x7.h" #ifndef KS0108_H #define KS0108_H // Ports #define lcd_cmd_port PORTB // Command Output Register #define lcd_cmd_ddr DDRB // Data Direction Register for Command Port #define lcd_data_pin PINA // Data Input Register #define lcd_data_port PORTA // Data Output Register #define lcd_data_ddr DDRA // Data Direction Register for Data Port // Command Port Bits #define D_I 0x00 // D/I Bit Number #define R_W 0x01 // R/W Bit Number #define EN 0x02 // EN Bit Number #define CSEL1 0x03 // CS1 Bit Number #define CSEL2 0x04 // CS2 Bit Number // Chips #define CHIP1 0x00 #define CHIP2 0x01 // Commands #define LCD_ON 0x3F #define LCD_OFF 0x3E #define LCD_SET_ADD 0x40 #define LCD_SET_PAGE 0xB8 #define LCD_DISP_START 0xC0 // colours #define BLACK 0xFF #define WHITE 0x00 // Font Indices #define FONT_LENGTH 0 #define FONT_FIXED_WIDTH 2 #define FONT_HEIGHT 3 #define FONT_FIRST_CHAR 4 #define FONT_CHAR_COUNT 5 #define FONT_WIDTH_TABLE 6 // Uncomment for slow drawing // #define DEBUG typedef struct { uint8_t x; uint8_t y; uint8_t page; } lcdCoord; typedef uint8_t (*ks0108_fontcallback)(const uint8_t*); // // Function Prototypes // // Graphic Functions void ks0108DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t colour); void ks0108DrawRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t colour); void ks0108DrawRoundRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t radius, uint8_t colour); void ks0108FillRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t colour); void ks0108InvertRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height); void ks0108SetInverted(uint8_t invert); void ks0108SetDot(uint8_t x, uint8_t y, uint8_t colour); #define ks0108DrawVertLine(x, y, length, colour) {ks0108FillRect(x, y, 0, length, colour);} #define ks0108DrawHoriLine(x, y, length, colour) {ks0108FillRect(x, y, length, 0, colour);} #define ks0108DrawCircle(xCenter, yCenter, radius, colour) {ks0108DrawRoundRect(xCenter-radius, yCenter-radius, 2*radius, 2*radius, radius, colour);} #define ks0108ClearScreen() {ks0108FillRect(0, 0, 127, 63, WHITE);} // Font Functions uint8_t ks0108_read_font_data(const uint8_t* ptr); //Standard Read Callback void ks0108_select_font(const uint8_t* font, ks0108_fontcallback callback, uint8_t colour); void ks0108_print_number(uint8_t n); int ks0108_putchar(char c); void ks0108_puts(char* str); void ks0108_puts_p(PGM_P str); uint8_t ks0108_char_width(char c); uint16_t ks0108_string_width(char* str); uint16_t ks0108_string_width_p(PGM_P str); // Control Functions void ks0108Enable(void); void ks0108_cursorto(uint8_t x, uint8_t y); void ks0108_gotoxy(uint8_t x, uint8_t y); void ks0108_init(uint8_t invert); uint8_t ks0108DoReadData(uint8_t first); uint8_t ks0108_read_data(void); void ks0108_write_command(uint8_t cmd, uint8_t chip); void ks0108_write_data(uint8_t data); #endif