]> mj.ucw.cz Git - home-hw.git/blob - Src/display.c
BMP085 basics
[home-hw.git] / Src / display.c
1 #include "util.h"
2 #include "main.h"
3 #include "app.h"
4
5 static const byte Gentium23x32[] = {
6         0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x80, 0xFF, 0xFF, 0x00, 0xE0, 0xFF, 0xFF, 0x03, 0xF0, 0xFF, 0xFF, 0x0F, 0xF8, 0xFF, 0xFF, 0x1F, 0xFC, 0xFF, 0xFF, 0x3F, 0xFE, 0x01, 0xE0, 0x3F, 0x3E, 0x00, 0x00, 0x7F, 0x1F, 0x00, 0x00, 0x7C, 0x0F, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 0x78, 0x1F, 0x00, 0x00, 0x78, 0x3F, 0x00, 0x00, 0x78, 0x7F, 0x00, 0x00, 0x3E, 0xFE, 0x07, 0xC0, 0x3F, 0xFE, 0xFF, 0xFF, 0x1F, 0xFC, 0xFF, 0xFF, 0x0F, 0xF8, 0xFF, 0xFF, 0x07, 0xE0, 0xFF, 0xFF, 0x03, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0xFC, 0x0F, 0x00,  // Code for char 0
7         0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x78, 0x00, 0x00, 0x70, 0x78, 0x00, 0x00, 0x78, 0x78, 0x00, 0x00, 0x78, 0x7C, 0x00, 0x00, 0x78, 0x3C, 0x00, 0x00, 0x78, 0xFE, 0xFF, 0xFF, 0x7F, 0xFE, 0xFF, 0xFF, 0x7F, 0xFE, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F, 0xFE, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00,  // Code for char 1
8         0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x01, 0x00, 0x78, 0xE0, 0x03, 0x00, 0x7C, 0xF0, 0x03, 0x00, 0x7E, 0xF8, 0x03, 0x80, 0x7F, 0xFC, 0x01, 0xC0, 0x7F, 0xFE, 0x01, 0xE0, 0x7F, 0x3E, 0x00, 0xF0, 0x7F, 0x1E, 0x00, 0xFC, 0x7F, 0x0F, 0x00, 0xFE, 0x79, 0x0F, 0x00, 0xFF, 0x78, 0x0F, 0xC0, 0x7F, 0x78, 0x1F, 0xE0, 0x3F, 0x78, 0x3F, 0xF8, 0x0F, 0x78, 0xFF, 0xFF, 0x07, 0x78, 0xFE, 0xFF, 0x03, 0x78, 0xFE, 0xFF, 0x00, 0x7C, 0xFC, 0x7F, 0x80, 0x7F, 0xF8, 0x1F, 0x80, 0x7F, 0xE0, 0x07, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 2
9         0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xC0, 0x00, 0x00, 0x1F, 0xF0, 0x01, 0x00, 0x1E, 0xF8, 0x01, 0x00, 0x3E, 0xFC, 0x01, 0x00, 0x3C, 0xFE, 0x00, 0x00, 0x7C, 0xFE, 0x00, 0x00, 0x78, 0x1E, 0xE0, 0x00, 0x78, 0x0F, 0xF0, 0x00, 0x78, 0x0F, 0xF0, 0x00, 0x78, 0x0F, 0xF0, 0x00, 0x78, 0x1F, 0xF8, 0x01, 0x7C, 0x3F, 0xFC, 0x01, 0x7C, 0xFF, 0xFF, 0x07, 0x3F, 0xFE, 0xFF, 0xFF, 0x3F, 0xFE, 0xFF, 0xFF, 0x1F, 0xFC, 0xCF, 0xFF, 0x0F, 0xF8, 0xC7, 0xFF, 0x07, 0xE0, 0x83, 0xFF, 0x03, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 3
10         0x17, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x00, 0xFE, 0x3D, 0x00, 0x00, 0xFF, 0x3C, 0x70, 0xC0, 0x3F, 0x3C, 0x70, 0xE0, 0x1F, 0x3C, 0x70, 0xF8, 0x07, 0x3C, 0x78, 0xFC, 0x03, 0x3C, 0x78, 0xFE, 0xFF, 0xFF, 0x7F, 0xFE, 0xFF, 0xFF, 0x7F, 0xFE, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F, 0xFE, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x3C, 0x78, 0x00, 0x00, 0x3C, 0x70, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x00, 0x08, 0x00,  // Code for char 4
11         0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xC0, 0x00, 0x1F, 0x00, 0xFE, 0x01, 0x1E, 0xFC, 0xFF, 0x01, 0x3E, 0xFC, 0xFF, 0x00, 0x3C, 0xFC, 0xFF, 0x00, 0x3C, 0xFC, 0x7F, 0x00, 0x78, 0x3C, 0x78, 0x00, 0x78, 0x3C, 0x78, 0x00, 0x78, 0x3C, 0x78, 0x00, 0x78, 0x3C, 0x78, 0x00, 0x78, 0x3C, 0xF8, 0x00, 0x7C, 0x3C, 0xF8, 0x00, 0x7E, 0x3C, 0xF0, 0x03, 0x3F, 0x3C, 0xF0, 0xFF, 0x3F, 0x3C, 0xF0, 0xFF, 0x1F, 0x1E, 0xE0, 0xFF, 0x0F, 0x0F, 0xC0, 0xFF, 0x07, 0x06, 0x80, 0xFF, 0x03, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 5
12         0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0xFE, 0xFF, 0x07, 0x80, 0xFF, 0xFF, 0x0F, 0xC0, 0xFF, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0x3F, 0xF0, 0xFF, 0xC1, 0x3F, 0xF8, 0xF7, 0x00, 0x7E, 0xF8, 0x71, 0x00, 0x7C, 0xFC, 0x78, 0x00, 0x78, 0x7C, 0x78, 0x00, 0x78, 0x3E, 0x78, 0x00, 0x78, 0x1E, 0xF8, 0x00, 0x7C, 0x1E, 0xF8, 0x03, 0x3E, 0x0F, 0xF0, 0xFF, 0x3F, 0x0F, 0xF0, 0xFF, 0x1F, 0x0F, 0xE0, 0xFF, 0x0F, 0x06, 0xE0, 0xFF, 0x07, 0x00, 0x80, 0xFF, 0x03, 0x00, 0x00, 0x7E, 0x00,  // Code for char 6
13         0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x20, 0x7C, 0x00, 0x00, 0x78, 0x3C, 0x00, 0x00, 0x7E, 0x3C, 0x00, 0x80, 0x7F, 0x3C, 0x00, 0xE0, 0x3F, 0x3C, 0x00, 0xF8, 0x3F, 0x3C, 0x00, 0xFE, 0x1F, 0x3C, 0x80, 0xFF, 0x0F, 0x3C, 0xE0, 0xFF, 0x01, 0x3C, 0xF8, 0x7F, 0x00, 0x3C, 0xFE, 0x0F, 0x00, 0xFC, 0xFF, 0x03, 0x00, 0xFC, 0xFF, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,  // Code for char 7
14         0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0xFC, 0x07, 0xF0, 0x1F, 0xFE, 0x1F, 0xF8, 0x3F, 0xFF, 0x1F, 0xFC, 0xBF, 0xFF, 0x3F, 0xFE, 0xFF, 0xFF, 0x3F, 0xFE, 0xFF, 0x0F, 0x7E, 0x1F, 0xFE, 0x03, 0x7C, 0x0F, 0xFC, 0x01, 0x78, 0x0F, 0xF8, 0x01, 0x78, 0x0F, 0xF8, 0x01, 0x78, 0x0F, 0xF8, 0x03, 0x78, 0x1F, 0xFC, 0x07, 0x7C, 0xFF, 0xFF, 0x0F, 0x3E, 0xFE, 0xFF, 0xFF, 0x3F, 0xFE, 0xDF, 0xFF, 0x1F, 0xFC, 0xCF, 0xFF, 0x0F, 0xF8, 0x87, 0xFF, 0x07, 0xF0, 0x01, 0xFF, 0x03, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 8
15         0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0xF0, 0xFF, 0x01, 0x60, 0xF8, 0xFF, 0x03, 0xE0, 0xFC, 0xFF, 0x07, 0xF0, 0xFC, 0xFF, 0x07, 0xF0, 0x7E, 0xE0, 0x0F, 0xF8, 0x1E, 0x80, 0x0F, 0x78, 0x0F, 0x00, 0x0F, 0x7C, 0x0F, 0x00, 0x0F, 0x7C, 0x0F, 0x00, 0x0F, 0x3E, 0x0F, 0x00, 0x0F, 0x3F, 0x1F, 0x00, 0x87, 0x1F, 0x3F, 0x80, 0xE7, 0x1F, 0xFE, 0xC1, 0xFB, 0x0F, 0xFE, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0x03, 0xF8, 0xFF, 0xFF, 0x01, 0xF0, 0xFF, 0x7F, 0x00, 0xC0, 0xFF, 0x1F, 0x00, 0x00, 0xFF, 0x03, 0x00,  // Code for char 9
16         0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0xC0, 0x07, 0xF0, 0x07, 0xE0, 0x0F, 0xF8, 0x07, 0xF0, 0x0F, 0xF8, 0x07, 0xF0, 0x0F, 0xF8, 0x07, 0xF0, 0x0F, 0xF8, 0x07, 0xF0, 0x0F, 0xF8, 0x03, 0xF0, 0x07, 0xF0, 0x01, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00   // Code for char :
17 };
18
19 // Based on https://github.com/adafruit/Adafruit_SSD1306
20
21 #define SSD1306_SETLOWCOLUMN 0x00
22 #define SSD1306_SETHIGHCOLUMN 0x10
23 #define SSD1306_MEMORYMODE 0x20
24 #define SSD1306_SETSTARTLINE 0x40
25 #define SSD1306_SETCONTRAST 0x81
26 #define SSD1306_CHARGEPUMP 0x8D
27 #define SSD1306_SEGREMAP 0xA0
28 #define SSD1306_DISPLAYALLON_RESUME 0xA4
29 #define SSD1306_DISPLAYALLON 0xA5
30 #define SSD1306_NORMALDISPLAY 0xA6
31 #define SSD1306_INVERTDISPLAY 0xA7
32 #define SSD1306_SETMULTIPLEX 0xA8
33 #define SSD1306_DISPLAYOFF 0xAE
34 #define SSD1306_DISPLAYON 0xAF
35 #define SSD1306_SETSTARTPAGE 0xB0
36 #define SSD1306_COMSCANINC 0xC0
37 #define SSD1306_COMSCANDEC 0xC8
38 #define SSD1306_SETDISPLAYOFFSET 0xD3
39 #define SSD1306_SETCOMPINS 0xDA
40 #define SSD1306_SETVCOMDETECT 0xDB
41 #define SSD1306_SETDISPLAYCLOCKDIV 0xD5
42 #define SSD1306_SETPRECHARGE 0xD9
43 #define SSD1306_NOP 0xE3
44
45 static const byte display_init_cmds[] = {
46   SSD1306_DISPLAYOFF,
47   SSD1306_SETDISPLAYCLOCKDIV, 0x80,  // the suggested ratio 0x80
48   SSD1306_SETMULTIPLEX, 0x1F,        // ratio 32
49   SSD1306_SETDISPLAYOFFSET,0x0,      // no offset
50   SSD1306_SETSTARTLINE | 0x0,        // line #0
51   SSD1306_CHARGEPUMP, 0x14,          // internal vcc
52   SSD1306_MEMORYMODE, 0x02,          // page mode
53   SSD1306_SEGREMAP | 0x0,            // column 0 mapped to SEG0
54   SSD1306_COMSCANINC,                // column scan direction not reversed
55   SSD1306_SETCOMPINS, 0x02,          // sequential COM pins, disable remap
56   SSD1306_SETCONTRAST, 0x7F,         // contrast level 127
57   SSD1306_SETPRECHARGE, 0xF1,        // pre-charge period (1, 15)
58   SSD1306_SETVCOMDETECT, 0x40,       // vcomh regulator level-
59   SSD1306_DISPLAYALLON_RESUME,
60   SSD1306_NORMALDISPLAY,
61   SSD1306_DISPLAYON,
62 };
63
64 static void display_send_byte(byte d)
65 {
66   while (!LL_I2C_IsActiveFlag_TXE(I2C2))
67     ;
68   LL_I2C_TransmitData8(I2C2, d);
69 }
70
71 static void display_cmd(byte cmd)
72 {
73   LL_I2C_GenerateStartCondition(I2C2);
74   while (!LL_I2C_IsActiveFlag_SB(I2C2))
75     ;
76   LL_I2C_TransmitData8(I2C2, 0x78);             // Address
77   while (!LL_I2C_IsActiveFlag_ADDR(I2C2))
78     ;
79   LL_I2C_ClearFlag_ADDR(I2C2);
80   display_send_byte(0x00);                      // Will send a command
81   display_send_byte(cmd);
82   while (!LL_I2C_IsActiveFlag_TXE(I2C2))
83     ;
84   LL_I2C_GenerateStopCondition(I2C2);
85 }
86
87 static void display_data_start(void)
88 {
89   LL_I2C_GenerateStartCondition(I2C2);
90   while (!LL_I2C_IsActiveFlag_SB(I2C2))
91     ;
92   LL_I2C_TransmitData8(I2C2, 0x78);             // Address
93   while (!LL_I2C_IsActiveFlag_ADDR(I2C2))
94     ;
95   LL_I2C_ClearFlag_ADDR(I2C2);
96   display_send_byte(0x40);                      // Will send data
97 }
98
99 static void display_data(byte d)
100 {
101   display_send_byte(d);
102 }
103
104 static void display_data_end(void)
105 {
106   while (!LL_I2C_IsActiveFlag_TXE(I2C2))
107     ;
108   LL_I2C_GenerateStopCondition(I2C2);
109 }
110
111 void display_init(void)
112 {
113   for (uint i=0; i < sizeof(display_init_cmds); i++)
114     display_cmd(display_init_cmds[i]);
115
116   for (uint p=0; p<4; p++)
117     {
118       display_cmd(SSD1306_SETSTARTPAGE + p);
119       display_cmd(SSD1306_SETHIGHCOLUMN);
120       display_cmd(SSD1306_SETLOWCOLUMN);
121       display_data_start();
122       for (uint i=0; i<128; i++)
123         display_data(0);
124       display_data_end();
125     }
126 }
127
128 void display_counter(uint cnt)
129 {
130   byte d[5];
131   for (uint i=0; i<4; i++)
132     {
133       d[3-i] = cnt % 10;
134       cnt /= 10;
135     }
136   d[4] = d[3];
137   d[3] = d[2];
138   d[2] = 10;
139
140   for (uint p=0; p<4; p++)
141     {
142       display_cmd(SSD1306_SETSTARTPAGE + p);
143       display_cmd(SSD1306_SETHIGHCOLUMN);
144       display_cmd(SSD1306_SETLOWCOLUMN);
145       display_data_start();
146       for (uint i=0; i<5; i++)
147         {
148           for (uint j=0; j<23; j++)
149             {
150               byte x = Gentium23x32[(23*4+1)*d[i] + 1 + 4*j + p];
151               display_data(x);
152             }
153           display_data(0);
154           display_data(0);
155           display_data(0);
156         }
157       display_data_end();
158     }
159 }
160
161 void display_buffer(byte *buf)
162 {
163   for (uint p=0; p<4; p++)
164     {
165       display_cmd(SSD1306_SETSTARTPAGE + p);
166       display_cmd(SSD1306_SETHIGHCOLUMN);
167       display_cmd(SSD1306_SETLOWCOLUMN);
168       display_data_start();
169       for (uint i=0; i<5; i++)
170         {
171           uint ch = buf[i];
172           if (ch <= 10)
173             {
174               for (uint j=0; j<23; j++)
175                 {
176                   byte x = Gentium23x32[(23*4+1)*ch + 1 + 4*j + p];
177                   display_data(x);
178                 }
179             }
180           else
181             {
182               for (uint j=0; j<23; j++)
183                 display_data(0);
184             }
185           display_data(0);
186           display_data(0);
187           display_data(0);
188         }
189       display_data_end();
190     }
191 }