29 Timeout backlight_timeout;
30 Timeout debug_timeout;
31 int backlight_on_time;
32 int backlight_off_time;
35 char multipage_length = 0;
36 char preserve_line_1 [17];
37 char preserve_line_2 [17];
44 Display::Display(PinName sda, PinName scl, PinName reset, PinName backlight) : Stream(
"display"), _i2c(sda,scl), _reset(reset), _backlight(backlight) {
50 int Display::i2c_message(
char byte){
54 int ret=_i2c.write(LCD_ADDRESS,bytes,2);
59 int Display::disp_putc(
int c){
63 _i2c.write(LCD_ADDRESS,message,2);
68 void Display::init_display(
char mode){
91 for(
int i=0;i<16;i++){
105 init_timeout.attach(
this,&Display::post_init,0.3);}
114 void Display::post_init(){
120 sprintf(line,
"VERSION %1.2f", SOFTWARE_VERSION_CODE );
123 init_timeout.attach(
this,&Display::post_post_init,0.3);
126 void Display::post_post_init(){
132 size_t length = strlen(message);
133 if (length > 16) length = 16;
134 char to_send [length+1];
136 for(
int i=0;i<length;i++){
137 to_send[i+1] = message[i];
139 _i2c.write(LCD_ADDRESS,to_send,length+1);
142 for(
int i=c_column;i<16;i++){
144 if(c_row == 0) preserve_line_1[i] = message[count];
145 else preserve_line_2[i] = message[count];
150 if(c_column>15) c_column=15;
155 char to_send [length+1];
157 for(
int i=0;i<length;i++){
158 to_send[i+1] = message[i];
160 _i2c.write(LCD_ADDRESS,to_send,length+1);
163 for(
int i=c_column;i<16;i++){
165 if(c_row == 0) preserve_line_1[i] = message[count];
166 else preserve_line_2[i] = message[count];
171 if(c_column>15) c_column=15;
175 if(row < 2 && column < 16){
176 char pos = 128 +((row * 64)+column);
199 if(brightness > 1) brightness = 0;
200 if(brightness < 0) brightness = 0;
201 backlight_brightness = brightness;
202 if(backlight_brightness == 1) {
203 backlight_timeout.detach();
206 if(backlight_brightness == 0){
207 backlight_timeout.detach();
210 backlight_on_time = (int) (10000.0f * backlight_brightness);
211 backlight_off_time = 10000 - backlight_on_time;
214 backlight_timeout.attach_us(
this,&Display::IF_backlight_toggle,backlight_off_time);
219 void Display::IF_backlight_toggle(){
220 if(backlight_step == 0){
223 backlight_timeout.attach_us(
this,&Display::IF_backlight_toggle,backlight_on_time);
227 backlight_timeout.attach_us(
this,&Display::IF_backlight_toggle,backlight_off_time);
231 for(
int i=0;i<16;i++){
232 preserve_line_1[i] = 0x20;
233 preserve_line_2[i] = 0x20;
244 void Display::debug_page(
char * message,
char length){
249 char multipage_mode = 0;
255 strncpy(line_1+1, message, 16);
256 char f_length = length - 16;
261 strncpy(line_2+1, message+16, f_length);
263 line_2[f_length+1]=0;
264 _i2c.write(LCD_ADDRESS,line_1,17);
266 _i2c.write(LCD_ADDRESS,line_2,f_length+1);
268 strncpy(line_1+1, message, length);
269 _i2c.write(LCD_ADDRESS,line_1,length+1);
271 if(multipage_mode == 1){
272 strncpy(multipage, message + 32, length - 32);
273 multipage_length = length - 32;
274 debug_timeout.attach(
this,&Display::IF_debug_multipage,PAGE_TIME);
275 }
else debug_timeout.attach(
this,&Display::IF_restore_page,CLEAR_TIME);
278 void Display::IF_restore_page(){
285 strncpy(line_1+1, preserve_line_1, 16);
286 strncpy(line_2+1, preserve_line_2, 16);
287 _i2c.write(LCD_ADDRESS,line_1,17);
289 _i2c.write(LCD_ADDRESS,line_2,17);
293 void Display::IF_debug_multipage(){
296 char multipage_mode = 0;
301 if(multipage_length > 16){
302 strncpy(line_1+1, multipage, 16);
303 char f_length = multipage_length - 16;
308 strncpy(line_2+1, multipage+16, f_length);
310 line_2[f_length+1]=0;
311 _i2c.write(LCD_ADDRESS,line_1,17);
313 _i2c.write(LCD_ADDRESS,line_2,f_length+1);
315 strncpy(line_1+1, multipage, multipage_length);
316 _i2c.write(LCD_ADDRESS,line_1,multipage_length+1);
318 if(multipage_mode == 1){
320 strncpy(temp, multipage + 32, multipage_length - 32);
321 multipage_length -= 32;
322 strncpy(multipage, temp, multipage_length);
323 debug_timeout.attach(
this,&Display::IF_debug_multipage,PAGE_TIME);
324 }
else debug_timeout.attach(
this,&Display::IF_restore_page,CLEAR_TIME);
327 void Display::_set_display(){
329 if(display_on>0) mode += 4;
330 if(cursor_on>0) mode += 2;
331 if(blink_on>0) mode ++;
336 int Display::_putc (
int c) {
341 int Display::_getc (
void) {
void write_string(char *message)
void set_position(char row, char column)
void set_display(char enable)
void set_cursor(char enable)
void set_backlight_brightness(float brightness)
void set_blink(char enable)