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  inline void lightOn(void);
288  inline 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 
431  bool LCD::changeID(optVAL_t newID) {
432  this->ID = newID;
433  return this->init();
434  }
435  bool LCD::clear(void) {
436  if(!this->_cI) this->init();
437  for(byte i = 0; i < 8; i++){
438  //maybe *8
439  setCursor(0,i);
440 
441  for (byte j = 0; j < 128; j++)
442  this->s1Dat(0);
443  }
444  return setCursor(0,0);
445  }
446  void LCD::print(optVAL_t line, optVAL_t col, const char *data) {
447  if(!this->_cI) this->init();
448  byte i = 0x0;
449  if(col < ((LCD_WIDTH-1)/8.0) && line < ((LCD_HEIGHT-1)/8.0)) {
450  setCursor(col,line);
451  }
452  while(data[i] && (pX*8) < LCD_WIDTH){
453  //Serial.print(data[i]); Serial.print(" ");
454  //Serial.print(i); Serial.print(" "); Serial.print(pX); Serial.print(" ");
455  //Serial.println(this->pY);
456  if(data[i] == '\n' || this->pX >= LCD_WIDTH) {
457  setCursor(0,(pY+1));
458  } else if (this->pY >= LCD_HEIGHT){
459  setCursor(0,0);
460  }
461  if(data[i] < 32 || data[i] > 127){ i++; continue;}
462  for (byte j = 0; j < 8; j++){
463  this->s1Dat(pgm_read_byte(&basicFont[data[i]-32][j]));
464  }
465  i++;this->pX++;
466  }
467  }
468  void LCD::print(optVAL_t line, optVAL_t col, int data){
469  char buffer[11] = "";
470  itoa(data,buffer,10);
471  this->print(line,col,buffer);
472  }
473  void LCD::lightOn(void) {
474  this->changeBrightness(255);
475  }
476  void LCD::lightOff(void) {
477  this->changeBrightness(0);
478  }
479  bool LCD::reset(void) {
480  return this->clear();
481  }
482  void LCD::print(int data) {this->print(255,255,data);}
483  void LCD::print(const char* data) {this->print(255,255,data);}
484  bool LCD::init() {
485  #ifdef HIGHSPEED
486  TWBR = 0xC;
487  #endif
488  this->_cI = true;
490  this->changeMode(false);
491  this->changeBackground(false);
492  this->changeBrightness(255);
493  this->s2Cmd(0x20,LCD_PAGE_ADDRESSING);
494  this->changeMode(true);
495 
496  //this->print("eBoard \n written by \n EagleoutIce");
497  return this->clear();
498  }
499 
500  void LCD::drawBitmap(const unsigned char *bitmap, byte posX, byte posY, byte hiX, byte hiY){
501  if(!this->_cI) this->init();
502  setCursor(posX,posY);
503  byte col = 0x0;
504  for(int i = 0x0; i < (hiX * 8 * hiY); i++){
505  this->s1Dat(pgm_read_byte(&bitmap[i]));
506  if(++col == (hiX * 8)) {
507  col = 0x0;
508  setCursor(posX,++posY);
509  }
510  }
511  }
512  void LCD::changeMode(bool newMode) {
513  if(!this->_cI) this->init();
514  if(newMode) this->s1Cmd(LCD_COMMAND_DISPLAY_ON);
515  else this->s1Cmd(LCD_COMMAND_DISPLAY_OFF);
516  }
517  bool LCD::setCursor(byte posX, byte posY) {
518  if(!this->_cI) this->init();
519  this->s2Cmd((0x00 + (8 *posX & 0x0F)),(0x10 + ((8 * posX >> 4) & 0x0F))); //lower and higher address
520  this->pX = posX; this->pY = posY;
521  return this->s1Cmd(0xB0 + posY);
522  }
523 
524  bool LCD::changeBrightness(byte val) {
525  if(!this->_cI) this->init();
526  this->s2Cmd(0x81,val); //brightness mode
527  Wire.beginTransmission(this->ID);
528  return (Wire.endTransmission() == 0);
529  }
530  void LCD::changeBackground(bool newBackground) {
531  if(!this->_cI) this->init();
532  if(newBackground) this->s1Cmd(LCD_COMMAND_WHITE_BACKGROUND);
534  }
535 
536  void LCD::s2Cmd(optVAL_t o, optVAL_t t){
537  if(!this->_cI) this->init();
538  this->s1Cmd(o); this->s1Cmd(t);
539  }
540 
541  bool LCD::s1Cmd(optVAL_t C) {
542  if(!this->_cI) this->init();
543  Wire.beginTransmission(this->ID);
544  Wire.write(LCD_COMMAND_MODE); Wire.write(C);
545  return (Wire.endTransmission()==0);
546  }
547  void LCD::s1Dat(optVAL_t o){
548  if(!this->_cI) this->init();
549  Wire.beginTransmission(this->ID);
550  Wire.write(LCD_DATA_MODE); Wire.write(o);
551  Wire.endTransmission();
552  }
554 #endif
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:137
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