14 #define LCD6749_BUFSIZE 7
21 } seg16font[65] PROGMEM = {
24 {
'1', 0b0000011000000100 },
25 {
'2', 0b1101110000111000 },
26 {
'3', 0b1001111000111000 },
27 {
'4', 0b0010011000111000 },
28 {
'5', 0b1011101000111000 },
29 {
'6', 0b1111101000111000 },
30 {
'7', 0b0001100001111100 },
31 {
'8', 0b1111111000111000 },
32 {
'9', 0b1011111000111000 },
33 {
'0', 0b1111111001010100 },
34 {
'+', 0b0000000010111010 },
35 {
'-', 0b0000000000111000 },
36 {
'*', 0b0000000111111111 },
37 {
'/', 0b0000000001010100 },
38 {
'.', 0b0000100000000000 },
39 {
')', 0b0000000001000001 },
40 {
'$', 0b1011101010111010 },
41 {
'(', 0b0000000100000100 },
42 {
'A', 0b0111111000111000 },
43 {
'B', 0b1111100100011100 },
44 {
'C', 0b1111100000000000 },
45 {
'D', 0b1111111000000000 },
46 {
'E', 0b1111100000011000 },
47 {
'F', 0b0111100000011000 },
48 {
'G', 0b1111101000100000 },
49 {
'H', 0b0110011000111000 },
50 {
'I', 0b1001100010010010 },
51 {
'J', 0b1000111000000000 },
52 {
'K', 0b0110000100011100 },
53 {
'L', 0b1110000000000000 },
54 {
'M', 0b0110011000010101 },
55 {
'N', 0b0110011100010001 },
56 {
'O', 0b1111111000000000 },
57 {
'P', 0b0111110000111000 },
58 {
'Q', 0b1111111100000000 },
59 {
'R', 0b0111000100001100 },
60 {
'S', 0b1011101000111000 },
61 {
'T', 0b0001100010010010 },
62 {
'U', 0b1110011000000000 },
63 {
'V', 0b0110100001010100 },
64 {
'W', 0b0110011101010000 },
65 {
'X', 0b0000000101010101 },
66 {
'Y', 0b0000000010010101 },
67 {
'Z', 0b1001100001010100 },
68 {
'}', 0b0000000001011001 },
69 {
'_', 0b1000000000000000 },
70 {
'{', 0b0000000100110100 },
71 {
'b', 0b1110001000111000 },
72 {
'c', 0b1100000000111000 },
73 {
'd', 0b1100011000111000 },
74 {
'h', 0b0110001000111000 },
75 {
'l', 0b0110000000000000 },
76 {
'm', 0b0100001010111000 },
77 {
'n', 0b0100001000111000 },
78 {
'o', 0b1100001000111000 },
79 {
'r', 0b0100000000011000 },
80 {
't', 0b1110000000011000 },
81 {
'u', 0b1100001000000000 },
82 {
'v', 0b0100000001000000 },
83 {
'w', 0b1100001010000000 },
84 {
'[', 0b1111100000000000 },
85 {
'|', 0b0000000010010010 },
86 {
']', 0b1001111000000000 },
88 {
'1', 0b0110000001000000 },
89 {
'2', 0b1101110000111000 },
90 {
'3', 0b1111100000111000 },
91 {
'4', 0b0000001010111010 },
92 {
'5', 0b1011101000111000 },
93 {
'6', 0b1011111000111000 },
94 {
'7', 0b1000000001111010 },
95 {
'8', 0b1111111000111000 },
96 {
'9', 0b1111101000111000 },
97 {
'0', 0b1111111001010100 },
98 {
'+', 0b0000000010111010 },
99 {
'-', 0b0000000000111000 },
100 {
'*', 0b0000000111111111 },
101 {
'/', 0b0000000001010100 },
102 {
'.', 0b0000100000000000 },
103 {
'(', 0b0000000001000001 },
104 {
'$', 0b1011101010111010 },
105 {
')', 0b0000000100000100 },
106 {
'A', 0b1110011000111000 },
107 {
'B', 0b1111100010011010 },
108 {
'C', 0b1001111000000000 },
109 {
'D', 0b1111100010010010 },
110 {
'E', 0b1001111000110000 },
111 {
'F', 0b1000011000110000 },
112 {
'G', 0b1011111000001000 },
113 {
'H', 0b0110011000111000 },
114 {
'I', 0b1001100010010010 },
115 {
'J', 0b1000100010010010 },
116 {
'K', 0b0000000011010011 },
117 {
'L', 0b0001111000000000 },
118 {
'M', 0b0110011101010000 },
119 {
'N', 0b0110011100010001 },
120 {
'O', 0b1111111000000000 },
121 {
'P', 0b1100011000111000 },
122 {
'Q', 0b1111111000000001 },
123 {
'R', 0b1100011000110001 },
124 {
'S', 0b1011101000111000 },
125 {
'T', 0b1000000010010010 },
126 {
'U', 0b0111111000000000 },
127 {
'V', 0b0000011001010100 },
128 {
'W', 0b0110011000010101 },
129 {
'X', 0b0000000101010101 },
130 {
'Y', 0b0000000101010010 },
131 {
'Z', 0b1001100001010100 },
132 {
'{', 0b0000000001011001 },
133 {
'_', 0b0001100000000000 },
134 {
'}', 0b0000000100110100 },
135 {
'b', 0b0011111000111000 },
136 {
'c', 0b0001110000111000 },
137 {
'd', 0b0111110000111000 },
138 {
'h', 0b0010011000111000 },
139 {
'l', 0b0000111000000000 },
140 {
'm', 0b0010010000101010 },
141 {
'n', 0b0010010000111000 },
142 {
'o', 0b0011110000111000 },
143 {
'r', 0b0000010000110000 },
144 {
't', 0b0001000010111010 },
145 {
'u', 0b0011110000000000 },
146 {
'v', 0b0000010000000100 },
147 {
'w', 0b0010010000000101 },
148 {
'[', 0b1001111000000000 },
149 {
'|', 0b0000000010010010 },
150 {
']', 0b1111100000000000 },
152 {
' ', 0b0000000000000000 },
156 const uint8_t segmap[3][16] PROGMEM= {
158 { 0x60, 0x62, 0x63, 0x53, 0x47, 0x46, 0x44, 0x50,
159 0x54, 0x61, 0x45, 0x51, 0x55, 0x52, 0x56, 0x57 },
160 { 0x40, 0x42, 0x43, 0x33, 0x27, 0x26, 0x24, 0x30,
161 0x34, 0x41, 0x25, 0x31, 0x35, 0x32, 0x36, 0x37 },
162 { 0x14, 0x16, 0x17, 0x07, 0x03, 0x02, 0x00, 0x04,
163 0x10, 0x15, 0x01, 0x05, 0x11, 0x06, 0x12, 0x13 }
165 { 0x14, 0x16, 0x17, 0x07, 0x03, 0x02, 0x00, 0x04,
166 0x10, 0x15, 0x01, 0x05, 0x11, 0x06, 0x12, 0x13 },
167 { 0x40, 0x42, 0x43, 0x33, 0x27, 0x26, 0x24, 0x30,
168 0x34, 0x41, 0x25, 0x31, 0x35, 0x32, 0x36, 0x37 },
169 { 0x60, 0x62, 0x63, 0x53, 0x47, 0x46, 0x44, 0x50,
170 0x54, 0x61, 0x45, 0x51, 0x55, 0x52, 0x56, 0x57 }
174 template<u
int8_t CS, u
int8_t WR, u
int8_t DT>
178 enum dots { NO_DOT, SINGLE_DOT, DOUBLE_DOT, BOTH_DOTS };
181 uint8_t _cs, _wr, _data, _lcdbuffer[LCD6749_BUFSIZE];
183 void CS_low() { digitalWrite(_cs, LOW); delayMicroseconds(1); }
184 void CS_high() { delayMicroseconds(1); digitalWrite(_cs, HIGH); }
185 void DATA(uint8_t x) {
if ((x)==0) digitalWrite(_data, LOW);
else digitalWrite(_data, HIGH); }
186 void WR_pulse() { digitalWrite(_wr, LOW); delayMicroseconds(3); digitalWrite(_wr, HIGH); delayMicroseconds(3); }
187 void clearBuffer(
void) { memset(_lcdbuffer, 0, LCD6749_BUFSIZE); }
190 uint16_t char2seg(
char c) {
191 for (uint8_t j=0; pgm_read_byte(&(seg16font[j]).c); j++) {
192 if (pgm_read_byte(&(seg16font[j]).c) == c) {
193 return (pgm_read_word(&(seg16font[j]).s));
199 void updateDisplay(uint8_t dot) {
205 for (uint8_t i = 0; i < 6; i++) { DATA(0); WR_pulse(); }
208 if (dot & 0x01) _lcdbuffer[2]|=0b00000010;
210 if (dot & 0x01) _lcdbuffer[2]|=0b00001000;
212 if (dot & 0x02) _lcdbuffer[2]|=0b00000110;
213 for (uint8_t i=0; i<LCD6749_BUFSIZE; i++) {
216 DATA(_lcdbuffer[i] & mask);
225 void updateBuffer(uint8_t pos,
char c) {
227 uint16_t mask= 0x8000;
228 for ( ; segno<16; segno++, mask>>=1) {
229 if (char2seg(c) & mask) {
230 uint8_t code= pgm_read_byte(&(segmap[pos][segno]));
231 _lcdbuffer[code>>4] |= 1<<(code&7);
236 void sendCmd(uint8_t cmd) {
252 LCD6749 () : _cs(0), _wr(0), _data(0) {}
259 pinMode(_cs, OUTPUT);
260 pinMode(_wr, OUTPUT);
261 pinMode(_data, OUTPUT);
272 updateDisplay(NO_DOT);
275 void printChar(uint8_t pos,
char c, uint8_t dot) {
276 updateBuffer(pos, c);
280 void printV(uint8_t value) {
281 printWithUnit(value, SINGLE_DOT,
'V');
284 void printWithUnit(uint8_t value, uint8_t dot,
char c) {
287 snprintf(localBuffer, 3,
"%2i", value);
288 updateBuffer(0, value < 10 ?
'0' : localBuffer[0]);
289 updateBuffer(1,localBuffer[1]);
294 void printText(
const char * t, uint8_t dot=NO_DOT) {
299 if ( t[2]==
'.' ) dot = SINGLE_DOT;
300 if ( t[2]==
':' ) dot = DOUBLE_DOT;
304 if ( t[1]==
'.' ) dot = SINGLE_DOT;
305 if ( t[1]==
':' ) dot = DOUBLE_DOT;
310 for (uint8_t i = 0; i < min(strlen(t), dot > NO_DOT ? 4 : 3); i++) {
312 if (dot > NO_DOT && i == 2) i++;
314 if (dot > NO_DOT && i == 1) i++;
316 updateBuffer(j, t[i]);
323 void printNumberAsFloat(int16_t number) {
325 number = (number + 5) / 10;
326 printNumber(number,
false, NO_DOT);
327 }
else if (number < -99) {
328 number = (number - 5) / 10;
329 printNumber(number ,
false, NO_DOT);
331 printNumber(number,
false, SINGLE_DOT);
335 void printNumber(int16_t number,
bool leadingZero) {
336 printNumber(number, leadingZero, NO_DOT);
339 void printNumber(int16_t number,
bool leadingZero, uint8_t dot) {
341 char localBuffer[4]={};
342 snprintf(localBuffer, 4,
"%3i", number);
343 for (uint8_t i = 0; i < strlen(localBuffer); i++) {
344 if (localBuffer[i] == 32 && leadingZero ==
true) localBuffer[i] =
'0';
345 updateBuffer(i, localBuffer[i]);