eBoard ๐Ÿ‰  โ‘ โ‘งโ‘จ
Written for SIA 2017/2018
eagle_LCD.h
Go to the documentation of this file.
1 #ifndef EAGLE_EBOARD_HELPLIB_LCD
2  #define EAGLE_EBOARD_HELPLIB_LCD
3 
12 //=====================================================================================================================================================
13 // Memory
14 //=====================================================================================================================================================
15 
16 
17  PROGMEM const byte basicFont[][8] = {
18  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
19  {0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00},
20  {0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00},
21  {0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00},
22  {0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00},
23  {0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00},
24  {0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00},
25  {0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00},
26  {0x00,0x1C,0x22,0x41,0x00,0x00,0x00,0x00},
27  {0x00,0x41,0x22,0x1C,0x00,0x00,0x00,0x00},
28  {0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00,0x00},
29  {0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00},
30  {0x00,0xA0,0x60,0x00,0x00,0x00,0x00,0x00},
31  {0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00},
32  {0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00},
33  {0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00},
34  {0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00},
35  {0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00},
36  {0x00,0x62,0x51,0x49,0x49,0x46,0x00,0x00},
37  {0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x00},
38  {0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00},
39  {0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00},
40  {0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00},
41  {0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00},
42  {0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00},
43  {0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00},
44  {0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00},
45  {0x00,0x00,0xAC,0x6C,0x00,0x00,0x00,0x00},
46  {0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00},
47  {0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00},
48  {0x00,0x41,0x22,0x14,0x08,0x00,0x00,0x00},
49  {0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00},
50  {0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00},
51  {0x00,0x7E,0x09,0x09,0x09,0x7E,0x00,0x00},
52  {0x00,0x7F,0x49,0x49,0x49,0x36,0x00,0x00},
53  {0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00},
54  {0x00,0x7F,0x41,0x41,0x22,0x1C,0x00,0x00},
55  {0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00},
56  {0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00},
57  {0x00,0x3E,0x41,0x41,0x51,0x72,0x00,0x00},
58  {0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00},
59  {0x00,0x41,0x7F,0x41,0x00,0x00,0x00,0x00},
60  {0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00},
61  {0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00},
62  {0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00},
63  {0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00},
64  {0x00,0x7F,0x04,0x08,0x10,0x7F,0x00,0x00},
65  {0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00},
66  {0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00},
67  {0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00},
68  {0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00},
69  {0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00},
70  {0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00},
71  {0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00},
72  {0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00},
73  {0x00,0x3F,0x40,0x38,0x40,0x3F,0x00,0x00},
74  {0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00},
75  {0x00,0x03,0x04,0x78,0x04,0x03,0x00,0x00},
76  {0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00},
77  {0x00,0x7F,0x41,0x41,0x00,0x00,0x00,0x00},
78  {0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00},
79  {0x00,0x41,0x41,0x7F,0x00,0x00,0x00,0x00},
80  {0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00},
81  {0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00},
82  {0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00},
83  {0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00},
84  {0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00},
85  {0x00,0x38,0x44,0x44,0x28,0x00,0x00,0x00},
86  {0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00},
87  {0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00},
88  {0x00,0x08,0x7E,0x09,0x02,0x00,0x00,0x00},
89  {0x00,0x18,0xA4,0xA4,0xA4,0x7C,0x00,0x00},
90  {0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00},
91  {0x00,0x00,0x7D,0x00,0x00,0x00,0x00,0x00},
92  {0x00,0x80,0x84,0x7D,0x00,0x00,0x00,0x00},
93  {0x00,0x7F,0x10,0x28,0x44,0x00,0x00,0x00},
94  {0x00,0x41,0x7F,0x40,0x00,0x00,0x00,0x00},
95  {0x00,0x7C,0x04,0x18,0x04,0x78,0x00,0x00},
96  {0x00,0x7C,0x08,0x04,0x7C,0x00,0x00,0x00},
97  {0x00,0x38,0x44,0x44,0x38,0x00,0x00,0x00},
98  {0x00,0xFC,0x24,0x24,0x18,0x00,0x00,0x00},
99  {0x00,0x18,0x24,0x24,0xFC,0x00,0x00,0x00},
100  {0x00,0x00,0x7C,0x08,0x04,0x00,0x00,0x00},
101  {0x00,0x48,0x54,0x54,0x24,0x00,0x00,0x00},
102  {0x00,0x04,0x7F,0x44,0x00,0x00,0x00,0x00},
103  {0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00},
104  {0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00},
105  {0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00},
106  {0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00},
107  {0x00,0x1C,0xA0,0xA0,0x7C,0x00,0x00,0x00},
108  {0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00},
109  {0x00,0x08,0x36,0x41,0x00,0x00,0x00,0x00},
110  {0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00},
111  {0x00,0x41,0x36,0x08,0x00,0x00,0x00,0x00},
112  {0x00,0x02,0x01,0x01,0x02,0x01,0x00,0x00},
113  {0x00,0x02,0x05,0x05,0x02,0x00,0x00,0x00}
114  };
115 
116 //=====================================================================================================================================================
117 // Macro Definitions
118 //=====================================================================================================================================================
119 
120  //Definition of OLED Constants
122  #define LCD_COMMAND_MODE 0x80
123  #define LCD_DATA_MODE 0x40
125  #define LCD_COMMAND_DISPLAY_OFF 0xAE
127  #define LCD_COMMAND_DISPLAY_ON 0xAF
129  #define LCD_COMMAND_BLACK_BACKGROUND 0xA6
131  #define LCD_COMMAND_WHITE_BACKGROUND 0xA7
133  #define LCD_COMMAND_SET_BRIGHTNESS 0x81
135  #define LCD_PAGE_ADDRESSING 0x02
137  #define LCD_HORIZONTAL_ADDRESSING 0x00
139  //The regulator
141  #define LCD_COMMAND_CHARGE_PUMP_SETTING 0x8d
142  #define LCD_COMMAND_CHARGE_PUMP_ENABLE 0x14
144 
145  #ifndef LCD_WIDTH
146  #define LCD_WIDTH 128
148  #endif
149  #ifndef LCD_HEIGHT
150  #define LCD_HEIGHT 64
152  #endif
153 
154 //=====================================================================================================================================================
155 // LCD
156 //=====================================================================================================================================================
157 
158  //-------------------------------------------------------------------------------------------------------------------------------------------------
159  // class
160  //-------------------------------------------------------------------------------------------------------------------------------------------------
161 
203  struct LCD {
204  #if EBOARD_NANO == 0
205 
213  LCD(SoccerBoard &soccerBoard, optVAL_t id=0x3C);
214  #else
215  LCD(optVAL_t id=0x3C);
216  #endif
217 
231  bool changeID(optVAL_t newID = 0x3C);
242  bool clear(void);
248  void print(const char* data);
254  void print(int data);
262  void print(optVAL_t line, optVAL_t col, const char* data);
270  void print(optVAL_t line, optVAL_t col, int data);
279  void lightOn(void);
288  void lightOff(void);
299  bool reset(void);
300 
301  //added features
314  bool init(void);
324  void drawBitmap(const unsigned char *bitmap, byte posX, byte posY, byte hiX, byte hiY);
332  void changeMode(bool newMode = true);
346  bool setCursor(byte posX = 0x0, byte posY = 0x0);
359  bool changeBrightness (byte val = 0x64);
369  void changeBackground(bool newBackground = false);
372  private:
376  byte pX;
379  byte pY;
381  bool _cI;
382 
389  void s2Cmd(optVAL_t o, optVAL_t t);
402  bool s1Cmd(optVAL_t o);
408  void s1Dat(optVAL_t o);
409 
410  };
412 
413  //-------------------------------------------------------------------------------------------------------------------------------------------------
414  // definitions
415  //-------------------------------------------------------------------------------------------------------------------------------------------------
416 
417  #if EBOARD_NANO == 0x0
418  LCD::LCD(SoccerBoard &soccerBoard, optVAL_t id) {
419  this->_cI = false;
420  this->ID = id;
421  //this->init();
422  }
423  #else
424  LCD::LCD( optVAL_t id) {
425  this->_cI = false;
426  this->ID = id;
427  //this->init();
428  }
429  #endif
430  bool LCD::changeID(optVAL_t newID) {
431  this->ID = newID;
432  return this->init();
433  }
434  bool LCD::clear(void) {
435  if(!this->_cI) this->init();
436  for(byte i = 0; i < 8; i++){
437  //maybe *8
438  setCursor(0,i);
439 
440  for (byte j = 0; j < 128; j++)
441  this->s1Dat(0);
442  }
443  return setCursor(0,0);
444  }
445  void LCD::print(optVAL_t line, optVAL_t col, const char *data) {
446  if(!this->_cI) this->init();
447  byte i = 0x0;
448  if(col < ((LCD_WIDTH-1)/8.0) && line < ((LCD_HEIGHT-1)/8.0)) {
449  setCursor(col,line);
450  }
451  while(data[i] && (pX*8) < LCD_WIDTH){
452  //Serial.print(data[i]); Serial.print(" ");
453  //Serial.print(i); Serial.print(" "); Serial.print(pX); Serial.print(" ");
454  //Serial.println(this->pY);
455  if(data[i] == '\n' || this->pX >= LCD_WIDTH) {
456  setCursor(0,(pY+1));
457  } else if (this->pY >= LCD_HEIGHT){
458  setCursor(0,0);
459  }
460  if(data[i] < 32 || data[i] > 127){ i++; continue;}
461  for (byte j = 0; j < 8; j++){
462  this->s1Dat(pgm_read_byte(&basicFont[data[i]-32][j]));
463  }
464  i++;this->pX++;
465  }
466  }
467  void LCD::print(optVAL_t line, optVAL_t col, int data){
468  char buffer[11] = "";
469  itoa(data,buffer,10);
470  this->print(line,col,buffer);
471  }
472  void LCD::lightOn(void) {
473  this->changeBrightness(255);
474  }
475  void LCD::lightOff(void) {
476  this->changeBrightness(0);
477  }
478  bool LCD::reset(void) {
479  return this->clear();
480  }
481  void LCD::print(int data) {this->print(255,255,data);}
482  void LCD::print(const char* data) {this->print(255,255,data);}
483  bool LCD::init() {
484  #ifdef HIGHSPEED
485  TWBR = 0xC;
486  #endif
487  this->_cI = true;
489  this->changeMode(false);
490  this->changeBackground(false);
491  this->changeBrightness(255);
492  this->s2Cmd(0x20,LCD_PAGE_ADDRESSING);
493  this->changeMode(true);
494 
495  //this->print("eBoard \n written by \n EagleoutIce");
496  return this->clear();
497  }
498 
499  void LCD::drawBitmap(const unsigned char *bitmap, byte posX, byte posY, byte hiX, byte hiY){
500  if(!this->_cI) this->init();
501  setCursor(posX,posY);
502  byte col = 0x0;
503  for(int i = 0x0; i < (hiX * 8 * hiY); i++){
504  this->s1Dat(pgm_read_byte(&bitmap[i]));
505  if(++col == (hiX * 8)) {
506  col = 0x0;
507  setCursor(posX,++posY);
508  }
509  }
510  }
511  void LCD::changeMode(bool newMode) {
512  if(!this->_cI) this->init();
513  if(newMode) this->s1Cmd(LCD_COMMAND_DISPLAY_ON);
514  else this->s1Cmd(LCD_COMMAND_DISPLAY_OFF);
515  }
516  bool LCD::setCursor(byte posX, byte posY) {
517  if(!this->_cI) this->init();
518  this->s2Cmd((0x00 + (8 *posX & 0x0F)),(0x10 + ((8 * posX >> 4) & 0x0F))); //lower and higher address
519  this->pX = posX; this->pY = posY;
520  return this->s1Cmd(0xB0 + posY);
521  }
522 
523  bool LCD::changeBrightness(byte val) {
524  if(!this->_cI) this->init();
525  this->s2Cmd(0x81,val); //brightness mode
526  Wire.beginTransmission(this->ID);
527  return (Wire.endTransmission() == 0);
528  }
529  void LCD::changeBackground(bool newBackground) {
530  if(!this->_cI) this->init();
531  if(newBackground) this->s1Cmd(LCD_COMMAND_WHITE_BACKGROUND);
533  }
534 
535  void LCD::s2Cmd(optVAL_t o, optVAL_t t){
536  if(!this->_cI) this->init();
537  this->s1Cmd(o); this->s1Cmd(t);
538  }
539 
540  bool LCD::s1Cmd(optVAL_t C) {
541  if(!this->_cI) this->init();
542  Wire.beginTransmission(this->ID);
543  Wire.write(LCD_COMMAND_MODE); Wire.write(C);
544  return (Wire.endTransmission()==0);
545  }
546  void LCD::s1Dat(optVAL_t o){
547  if(!this->_cI) this->init();
548  Wire.beginTransmission(this->ID);
549  Wire.write(LCD_DATA_MODE); Wire.write(o);
550  Wire.endTransmission();
551  }
553 #endif
[COPY&PASTE] This is the SoccerBoard ghost struct :D
#define LCD_COMMAND_CHARGE_PUMP_ENABLE
Definition: eagle_LCD.h:143
byte pY
posY
Definition: eagle_LCD.h:379
void s2Cmd(optVAL_t o, optVAL_t t)
this function will execute two cmd sends without starting and without ending the transmission ...
#define LCD_COMMAND_MODE
Definition: eagle_LCD.h:122
bool _cI
called_guard
Definition: eagle_LCD.h:381
bool reset(void)
clears the screen
void changeMode(bool newMode=true)
enable or disable the display
bool init(void)
initializes the Display called by:
#define LCD_COMMAND_DISPLAY_ON
Definition: eagle_LCD.h:128
byte pX
the addressing mode (page/horizontal)
Definition: eagle_LCD.h:377
#define LCD_COMMAND_CHARGE_PUMP_SETTING
Definition: eagle_LCD.h:141
#define LCD_COMMAND_BLACK_BACKGROUND
Definition: eagle_LCD.h:130
bool setCursor(byte posX=0x0, byte posY=0x0)
set the position of the cursor
LCD(SoccerBoard &soccerBoard, optVAL_t id=0x3C)
The constructor.
void changeBackground(bool newBackground=false)
changes the background of the display
optVAL_t ID
ID of the Display.
Definition: eagle_LCD.h:371
#define LCD_WIDTH
Definition: eagle_LCD.h:147
#define LCD_COMMAND_DISPLAY_OFF
Definition: eagle_LCD.h:126
void s1Dat(optVAL_t o)
this function will execute one dat send without starting and without ending the transmission ...
#define LCD_COMMAND_WHITE_BACKGROUND
Definition: eagle_LCD.h:132
void lightOn(void)
enable the backlight
void lightOff(void)
disable the backlight
bool clear(void)
clears the LCD
bool s1Cmd(optVAL_t o)
this function will execute one cmd send without starting and without ending the transmission ...
TwoWire Wire
this is the well-known Arduino Wire Interface, just a little bit &#39;modified&#39; ;P
bool changeBrightness(byte val=0x64)
changes the brightness of the display
bool changeID(optVAL_t newID=0x3C)
changes the address of the LCD display talked to
PROGMEM const byte basicFont[][8]
Definition: eagle_LCD.h:17
int optVAL_t
Definition: eBoard.h:132
void print(const char *data)
prints a string to the display
void drawBitmap(const unsigned char *bitmap, byte posX, byte posY, byte hiX, byte hiY)
draws a bitmap representet as an array of bytes
#define LCD_DATA_MODE
Definition: eagle_LCD.h:124
#define LCD_HEIGHT
Definition: eagle_LCD.h:151
[I2C] [LCD] This is used to add support for OLED displays connected to the &#39;SoccerBoard&#39; ...
Definition: eagle_LCD.h:203
#define LCD_PAGE_ADDRESSING
Definition: eagle_LCD.h:136