1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#include "ssd1306.h"
#include "chars.h"
#include <hardware/gpio.h>
#include <pico/error.h>
int ssd_init(ssd1306_t *display, i2c_inst_t *i2c, uint8_t addr) {
display->i2c = i2c;
display->addr = addr;
display->len = 0;
return PICO_OK;
}
int ssd_push(ssd1306_t *display, uint8_t byte) {
if (display->len < SSD1306_BUFFER_LEN) {
display->buf[display->len] = byte;
display->len++;
return PICO_OK;
} else {
return PICO_ERROR_BUFFER_TOO_SMALL;
}
}
int ssd_send(ssd1306_t *display) {
int ret = i2c_write_blocking(
display->i2c,
display->addr,
display->buf,
display->len,
false
);
display->len = 0;
return ret;
}
int ssd_power_on(ssd1306_t *display) {
ssd_push(display, SSD1306_CTRL_CMD);
ssd_push(display, SSD1306_DISPLAY_OFF);
ssd_push(display, SSD1306_SET_CLOCK_DIV);
ssd_push(display, 0x80);
ssd_push(display, SSD1306_SET_MULTIPLEX);
ssd_push(display, 0x1f);
ssd_push(display, SSD1306_START_LINE(0));
ssd_push(display, SSD1306_SET_CHARGE_PUMP);
ssd_push(display, SSD1306_CHARGE_PUMP_ON);
ssd_push(display, SSD1306_SET_MEMORY_MODE);
ssd_push(display, SSD1306_MEM_MODE_HORIZONTAL);
ssd_push(display, SSD1306_SEG_REMAP_COL127);
ssd_push(display, SSD1306_COM_SCAN_REMAP);
ssd_push(display, SSD1306_SET_COM_PINS);
ssd_push(display, SSD1306_COM_PINS_SEQUENTIAL);
ssd_push(display, SSD1306_SET_CONTRAST);
ssd_push(display, 0xcf);
ssd_push(display, SSD1306_SET_PRECHARGE);
ssd_push(display, 0xf1);
ssd_push(display, SSD1306_SET_VCOMH);
ssd_push(display, SSD1306_VCOMH_0_77);
ssd_push(display, SSD1306_ENTIRE_DISPLAY_RESUME);
ssd_push(display, SSD1306_NORMAL_DISPLAY);
ssd_push(display, SSD1306_SCROLL_DEACTIVATE);
ssd_push(display, SSD1306_DISPLAY_ON);
return ssd_send(display);
}
int ssd_putscr(ssd1306_t *display, const uint8_t c, bool shift) {
ssd_push(display, SSD1306_CTRL_DATA);
for (int i = 0; i < 8; i++) {
int b;
if (shift) {
b = c64_chars[c + 256][i];
} else {
b = c64_chars[c][i];
}
int ret = ssd_push(display, b);
if (ret < 0) {
return ret;
}
}
return ssd_send(display);
}
int ssd_putchar(ssd1306_t *display, const char c) {
uint8_t scr = ascii_to_screen[c];
return ssd_putscr(display, scr, true);
}
int ssd_push_str(ssd1306_t *display, const char *str) {
for (int i = 0; str[i]; i++) {
int ret = ssd_putchar(display, str[i]);
if (ret < 0) {
return ret;
}
}
return PICO_OK;
}
|