11 #include <AlarmClock.h>
12 #ifndef __LCD4SEGHT1621_H__
13 #define __LCD4SEGHT1621_H__
15 #define LCD4SEG_BUFSIZE 4
18 #define BIAS 0x52 //0b1000 0101 0010
19 #define SYSDIS 0X00 //0b1000 0000 0000
20 #define SYSEN 0X02 //0b1000 0000 0010
21 #define LCDOFF 0X04 //0b1000 0000 0100
22 #define LCDON 0X06 //0b1000 0000 0110
23 #define XTAL 0x28 //0b1000 0010 1000
24 #define RC256 0X30 //0b1000 0011 0000
25 #define TONEON 0X12 //0b1000 0001 0010
26 #define TONEOFF 0X10 //0b1000 0001 0000
27 #define WDTDIS1 0X0A //0b1000 0000 1010
31 template<u
int8_t CS, u
int8_t WR, u
int8_t DT>
34 uint8_t _cs, _wr, _data, _bufferMem;
35 char _localBuffer[LCD4SEG_BUFSIZE];
36 uint8_t _lcdbuffer[LCD4SEG_BUFSIZE];
38 void sendCmd(
byte command) {
39 digitalWrite(_cs, LOW);
43 for (uint8_t i = 0; i <12; i ++){
44 digitalWrite(_wr, LOW);
45 digitalWrite(_data, (cmd & 0x800) ? HIGH : LOW);
47 digitalWrite(_wr, HIGH);
49 digitalWrite(_cs, HIGH);
52 void update(uint8_t type) {
53 memset(_lcdbuffer, 0, LCD4SEG_BUFSIZE);
56 for (
int i = 0 ; i < LCD4SEG_BUFSIZE; i ++){
57 switch(_localBuffer[i]){
71 _lcdbuffer[i] = 0b11111100;
74 _lcdbuffer[i] = 0b01100000;
77 _lcdbuffer[i] = 0b11011010;
80 _lcdbuffer[i] = 0b11110010;
83 _lcdbuffer[i] = 0b01100110;
86 _lcdbuffer[i] = 0b10110110;
89 _lcdbuffer[i] = 0b10111110;
92 _lcdbuffer[i] = 0b11100000;
95 _lcdbuffer[i] = 0b11111110;
98 _lcdbuffer[i] = 0b11110110;
101 _lcdbuffer[i] = 0b00000010;
104 _lcdbuffer[i] = 0b00000000;
111 _lcdbuffer[2] = 0b00001010;
112 _lcdbuffer[3] = 0b01101110;
116 _lcdbuffer[1]|= 0b00000001;
117 _lcdbuffer[3] = 0b10011101;
121 _lcdbuffer[0] = 0b00111111;
122 _lcdbuffer[1] = 0b00011100;
123 _lcdbuffer[2] = 0b00111010;
124 _lcdbuffer[3] = 0b00000000;
130 digitalWrite(_cs, LOW);
131 for(
int i = 0 ;i < 9;i ++){
132 digitalWrite(_wr, LOW);
133 digitalWrite(_data, (cmd & 0x100) ? HIGH : LOW);
135 digitalWrite(_wr, HIGH);
139 for (
int i =0; i < 8; i++){
140 for (
int j =0; j<4;j++){
141 digitalWrite(_wr,LOW);
142 _bufferMem =_lcdbuffer[j]<<i;
143 digitalWrite(_data, (_bufferMem & 0x80) ? HIGH : LOW);
144 digitalWrite(_wr, HIGH);
147 digitalWrite(_cs, HIGH);
151 LCD4SEG () : _cs(0), _wr(0), _data(0),_bufferMem(0) {}
158 pinMode(_cs, OUTPUT);
159 pinMode(_wr, OUTPUT);
160 pinMode(_data, OUTPUT);
171 uint16_t cmd = 0x140;
173 digitalWrite(_cs, LOW);
174 for (uint8_t i =0; i<9; i++){
175 digitalWrite(_wr, LOW);
176 digitalWrite(_data, (cmd & 0x100) ? HIGH : LOW);
178 digitalWrite(_wr, HIGH);
181 for (uint8_t i =0 ; i<32; i++){
182 digitalWrite(_wr, LOW);
183 digitalWrite(_data, LOW);
184 digitalWrite(_wr, HIGH);
186 digitalWrite(_cs, HIGH);
189 void printH(uint8_t number){
190 if (number > 99){ number = 99; }
191 snprintf(_localBuffer, 3,
"%2i", number);
195 void printC(int16_t number){
196 snprintf(_localBuffer, 4,
"%3i", number);
198 if (number < 0) _localBuffer[0] =
'-';
199 if (number < 10) _localBuffer[1] =
'0';
209 template<
class LCDTYPE>
212 typedef LCDTYPE LcdType;
218 uint8_t _toggleTimeSecs;
221 LCDToggleTH () :
Alarm(0), _screenNum(0), _t(0), _h(0), _toggleTimeSecs(10), _lowBat(
false) { async(
true); }
231 void setValues(int16_t t, uint8_t h,
bool b) {
238 void setToggleTime(uint8_t time) {
239 _toggleTimeSecs = time;
240 sysclock.cancel(*
this);
241 set(seconds2ticks(_toggleTimeSecs));
245 void displayValues() {
246 switch (_screenNum) {
258 if (_screenNum > (_lowBat ? 2 : 1)) _screenNum = 0;
261 virtual void trigger (__attribute__((unused))
AlarmClock& clock) {
262 set(seconds2ticks(_toggleTimeSecs));