1
+
2
+ #if defined(ARDUINO) && ARDUINO >= 100
3
+ #include " Arduino.h"
4
+ #else
5
+ #include " WProgram.h"
6
+ #endif
7
+
8
+ #include " TM1628.h"
9
+ byte _curpos = 0x00 ;
10
+ byte buffer[14 ] = {0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 };
11
+ const byte seg_addr[7 ]={0x00 ,0x01 ,0x07 ,0x02 ,0x03 ,0x04 ,0x05 };// no bit of digital segments
12
+ // SG0 SG1 SG2 SG3 SG4 SG5 SG6 SG7 DVD VCD MP3 PLY PAU PBC RET DTS DDD CL1 CL2 //name -|
13
+ const byte led_addr[19 ]={0x03 ,0x0B ,0x0D ,0x07 ,0x05 ,0x09 ,0x0D ,0x01 ,0x01 ,0x03 ,0x05 ,0x09 ,0x0b ,0x07 ,0x00 ,0x08 ,0x06 ,0x02 ,0x04 };// adress -| for the signs's and disc's leds
14
+ const byte led_val[19 ]= {0x01 ,0x01 ,0x01 ,0x01 ,0x01 ,0x01 ,0x02 ,0x01 ,0x02 ,0x02 ,0x02 ,0x02 ,0x02 ,0x02 ,0x40 ,0x40 ,0x40 ,0x40 ,0x40 };// byte -|
15
+
16
+ TM1628::TM1628 (byte _dio_pin, byte _clk_pin, byte _stb_pin) {
17
+ this ->_dio_pin = _dio_pin;
18
+ this ->_clk_pin = _clk_pin;
19
+ this ->_stb_pin = _stb_pin;
20
+
21
+ pinMode (_dio_pin, OUTPUT);
22
+ pinMode (_clk_pin, OUTPUT);
23
+ pinMode (_stb_pin, OUTPUT);
24
+
25
+ digitalWrite (_stb_pin, HIGH);
26
+ digitalWrite (_clk_pin, HIGH);
27
+
28
+ sendCommand (0x40 );
29
+ sendCommand (0x80 );
30
+
31
+ digitalWrite (_stb_pin, LOW);
32
+ send (0xC0 );
33
+ clear ();
34
+ digitalWrite (_stb_pin, HIGH);
35
+ }
36
+
37
+ void TM1628::begin (boolean active = true , byte intensity = 1 ) {
38
+ sendCommand (0x80 | (active ? 8 : 0 ) | min (7 , intensity));
39
+ }
40
+
41
+ void TM1628::update () {
42
+ for (int i=0 ; i<14 ; i++)
43
+ sendData (i, buffer[i]);
44
+ }
45
+
46
+ void TM1628::setTime (int hour,int min,int sec) {
47
+
48
+ if (hour >= 100 ) setSeg (0 , (hour/100 ));
49
+ if (hour >= 10 ) setSeg (1 , (hour%100 )/10 );
50
+ setSeg (2 , (hour%100 )%10 );
51
+ setSeg (3 , (min/10 ));
52
+ setSeg (4 , (min%10 ));
53
+ setSeg (5 , (sec/10 ));
54
+ setSeg (6 , (sec%10 ));
55
+ update ();
56
+ }
57
+
58
+ void TM1628::clear () {
59
+ for (int i=0 ; i<14 ; i++)
60
+ buffer[i]=0x00 ;
61
+ _curpos=0x00 ;
62
+ update ();
63
+ }
64
+
65
+ void TM1628::setLED (byte led){
66
+ buffer[led_addr[led]] = buffer[led_addr[led]] ^ led_val[led];
67
+ update ();
68
+ }
69
+
70
+ void TM1628::setLEDon (byte led){
71
+ buffer[led_addr[led]] |= led_val[led];// = buffer[led_addr[led]] | led_val[led];
72
+ update ();
73
+ }
74
+
75
+ void TM1628::setLEDoff (byte led){
76
+ buffer[led_addr[led]] &= 0xFF - led_val[led];// = buffer[led_addr[led]] & (0xFF - led_val[led]);
77
+ update ();
78
+ }
79
+
80
+ void TM1628::setDisc (boolean onoff){
81
+ if (onoff) {
82
+ for (int i=0 ;i<8 ;i++)// turn on all disc segments
83
+ buffer[led_addr[i]] = buffer[led_addr[i]] | led_val[i];
84
+ } else {
85
+ for (int i=0 ;i<8 ;i++)
86
+ buffer[led_addr[i]] = buffer[led_addr[i]] & (0xFF - led_val[i]);
87
+ }
88
+ update ();
89
+ }
90
+
91
+ byte TM1628::getButtons () {
92
+ byte keys = 0 ;
93
+
94
+ digitalWrite (_stb_pin, LOW);
95
+ send (0x42 );
96
+ for (int i = 0 ; i < 5 ; i++) {
97
+ keys |= receive () << i;
98
+ }
99
+ digitalWrite (_stb_pin, HIGH);
100
+
101
+ return keys;
102
+ }
103
+
104
+ void TM1628::write (byte chr){
105
+ if (_curpos<0x07 ) {
106
+ setChar (_curpos, chr);
107
+ _curpos++;
108
+ }
109
+ }
110
+
111
+ void TM1628::setCursor (byte pos){
112
+ _curpos = pos;
113
+ }
114
+ /* ********** mid level **********/
115
+ void TM1628::sendData (byte addr, byte data) {
116
+ sendCommand (0x44 );
117
+ digitalWrite (_stb_pin, LOW);
118
+ send (0xC0 | addr);
119
+ send (data);
120
+ digitalWrite (_stb_pin, HIGH);
121
+ }
122
+
123
+ void TM1628::sendCommand (byte data) {
124
+ digitalWrite (_stb_pin, LOW);
125
+ send (data);
126
+ digitalWrite (_stb_pin, HIGH);
127
+ }
128
+
129
+ void TM1628::setSeg (byte addr, byte num) {
130
+ for (int i=0 ; i<7 ; i++){
131
+ bitWrite (buffer[i*2 ], seg_addr[addr], bitRead (NUMBER_FONT[num],i));
132
+ }
133
+ }
134
+
135
+ void TM1628::setChar (byte addr, byte chr) {
136
+ for (int i=0 ; i<7 ; i++){
137
+ bitWrite (buffer[i*2 ], seg_addr[addr], bitRead (FONT_DEFAULT[chr - 0x20 ],i));
138
+ }
139
+ update ();
140
+ }
141
+ /* *********** low level **********/
142
+ void TM1628::send (byte data) {
143
+ for (int i = 0 ; i < 8 ; i++) {
144
+ digitalWrite (_clk_pin, LOW);
145
+ digitalWrite (_dio_pin, data & 1 ? HIGH : LOW);
146
+ data >>= 1 ;
147
+ digitalWrite (_clk_pin, HIGH);
148
+ }
149
+ }
150
+
151
+ byte TM1628::receive () {
152
+ byte temp = 0 ;
153
+
154
+ // Pull-up on
155
+ pinMode (_dio_pin, INPUT);
156
+ digitalWrite (_dio_pin, HIGH);
157
+
158
+ for (int i = 0 ; i < 8 ; i++) {
159
+ temp >>= 1 ;
160
+
161
+ digitalWrite (_clk_pin, LOW);
162
+
163
+ if (digitalRead (_dio_pin)) {
164
+ temp |= 0x80 ;
165
+ }
166
+
167
+ digitalWrite (_clk_pin, HIGH);
168
+ }
169
+
170
+ // Pull-up off
171
+ pinMode (_dio_pin, OUTPUT);
172
+ digitalWrite (_dio_pin, LOW);
173
+
174
+ return temp;
175
+ }
0 commit comments