Roqyun KO / Mbed 2 deprecated MeringueCitron

Dependencies:   mbed DHT

Committer:
certvert
Date:
Mon Jan 07 10:58:16 2019 +0000
Revision:
0:091e1a699d64
The final version of Polytech EISE3 industrial project ; ; Adafruit screen 128x64 - i2c programmed, finite state machine, etc.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
certvert 0:091e1a699d64 1 #include "ADA326.h"
certvert 0:091e1a699d64 2 #include "LCDGraphics.h"
certvert 0:091e1a699d64 3 #include "mbed.h"
certvert 0:091e1a699d64 4
certvert 0:091e1a699d64 5
certvert 0:091e1a699d64 6 #define SSD1306_LCDHEIGHT 64
certvert 0:091e1a699d64 7 #define SSD1306_LCDWIDTH 128
certvert 0:091e1a699d64 8
certvert 0:091e1a699d64 9 #define SSD1306_SETCONTRAST 0x81
certvert 0:091e1a699d64 10 #define SSD1306_DISPLAYALLON_RESUME 0xA4
certvert 0:091e1a699d64 11 #define SSD1306_DISPLAYALLON 0xA5
certvert 0:091e1a699d64 12 #define SSD1306_NORMALDISPLAY 0xA6
certvert 0:091e1a699d64 13 #define SSD1306_INVERTDISPLAY 0xA7
certvert 0:091e1a699d64 14 #define SSD1306_DISPLAYOFF 0xAE
certvert 0:091e1a699d64 15 #define SSD1306_DISPLAYON 0xAF
certvert 0:091e1a699d64 16
certvert 0:091e1a699d64 17 #define SSD1306_SETDISPLAYOFFSET 0xD3
certvert 0:091e1a699d64 18 #define SSD1306_SETCOMPINS 0xDA
certvert 0:091e1a699d64 19
certvert 0:091e1a699d64 20 #define SSD1306_SETVCOMDETECT 0xDB
certvert 0:091e1a699d64 21
certvert 0:091e1a699d64 22 #define SSD1306_SETDISPLAYCLOCKDIV 0xD5
certvert 0:091e1a699d64 23 #define SSD1306_SETPRECHARGE 0xD9
certvert 0:091e1a699d64 24
certvert 0:091e1a699d64 25 #define SSD1306_SETMULTIPLEX 0xA8
certvert 0:091e1a699d64 26
certvert 0:091e1a699d64 27 #define SSD1306_SETLOWCOLUMN 0x00
certvert 0:091e1a699d64 28 #define SSD1306_SETHIGHCOLUMN 0x10
certvert 0:091e1a699d64 29
certvert 0:091e1a699d64 30 #define SSD1306_SETSTARTLINE 0x40
certvert 0:091e1a699d64 31
certvert 0:091e1a699d64 32 #define SSD1306_MEMORYMODE 0x20
certvert 0:091e1a699d64 33 #define SSD1306_COLUMNADDR 0x21
certvert 0:091e1a699d64 34 #define SSD1306_PAGEADDR 0x22
certvert 0:091e1a699d64 35
certvert 0:091e1a699d64 36 #define SSD1306_COMSCANINC 0xC0
certvert 0:091e1a699d64 37 #define SSD1306_COMSCANDEC 0xC8
certvert 0:091e1a699d64 38
certvert 0:091e1a699d64 39 #define SSD1306_SEGREMAP 0xA0
certvert 0:091e1a699d64 40
certvert 0:091e1a699d64 41 #define SSD1306_CHARGEPUMP 0x8D
certvert 0:091e1a699d64 42
certvert 0:091e1a699d64 43 #define SSD1306_EXTERNALVCC 0x1
certvert 0:091e1a699d64 44 #define SSD1306_SWITCHCAPVCC 0x2
certvert 0:091e1a699d64 45
certvert 0:091e1a699d64 46 // Scrolling #defines
certvert 0:091e1a699d64 47 #define SSD1306_ACTIVATE_SCROLL 0x2F
certvert 0:091e1a699d64 48 #define SSD1306_DEACTIVATE_SCROLL 0x2E
certvert 0:091e1a699d64 49 #define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3
certvert 0:091e1a699d64 50 #define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26
certvert 0:091e1a699d64 51 #define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27
certvert 0:091e1a699d64 52 #define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
certvert 0:091e1a699d64 53 #define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A
certvert 0:091e1a699d64 54
certvert 0:091e1a699d64 55 #define BLACK 0
certvert 0:091e1a699d64 56 #define WHITE 1
certvert 0:091e1a699d64 57 #define INVERSE 2
certvert 0:091e1a699d64 58
certvert 0:091e1a699d64 59
certvert 0:091e1a699d64 60
certvert 0:091e1a699d64 61 extern Serial pc;
certvert 0:091e1a699d64 62 DigitalOut reset(D3);
certvert 0:091e1a699d64 63
certvert 0:091e1a699d64 64 #ifdef _ADA326_VER_I2C_
certvert 0:091e1a699d64 65 #define I2C_ADDR (0x3D << 1)
certvert 0:091e1a699d64 66 extern I2C i2c;
certvert 0:091e1a699d64 67 #endif
certvert 0:091e1a699d64 68 Ada326::Ada326():
certvert 0:091e1a699d64 69 LCDGraphics(SSD1306_LCDWIDTH,SSD1306_LCDHEIGHT, MAX_PAGE)
certvert 0:091e1a699d64 70 {
certvert 0:091e1a699d64 71 pc.baud(9600);
certvert 0:091e1a699d64 72 #ifdef _ADA326_VER_I2C_
certvert 0:091e1a699d64 73 pc.printf("ADA326 : Initialize I2C\r\n");
certvert 0:091e1a699d64 74 pc.printf("ADA326 : %d x %d\r\n", width, height);
certvert 0:091e1a699d64 75 i2c.frequency(400000);
certvert 0:091e1a699d64 76 #endif
certvert 0:091e1a699d64 77 }
certvert 0:091e1a699d64 78 void Ada326::display_on()
certvert 0:091e1a699d64 79 {
certvert 0:091e1a699d64 80 initialize();
certvert 0:091e1a699d64 81 }
certvert 0:091e1a699d64 82 void Ada326::display_off()
certvert 0:091e1a699d64 83 {
certvert 0:091e1a699d64 84
certvert 0:091e1a699d64 85 #ifdef _ADA326_VER_I2C_
certvert 0:091e1a699d64 86 i2c.start();
certvert 0:091e1a699d64 87 #endif
certvert 0:091e1a699d64 88 ssd1306_command(SSD1306_DISPLAYOFF); // 0xAE
certvert 0:091e1a699d64 89 #ifdef _ADA326_VER_I2C_
certvert 0:091e1a699d64 90 i2c.stop();
certvert 0:091e1a699d64 91 #endif
certvert 0:091e1a699d64 92 }
certvert 0:091e1a699d64 93 void Ada326::initialize()
certvert 0:091e1a699d64 94 {
certvert 0:091e1a699d64 95
certvert 0:091e1a699d64 96 // Setup reset pin direction (used by both SPI and I2C)
certvert 0:091e1a699d64 97 reset = 1;
certvert 0:091e1a699d64 98 // VDD (3.3V) goes high at start, lets just chill for a ms
certvert 0:091e1a699d64 99 wait_ms(1);
certvert 0:091e1a699d64 100 // bring reset low
certvert 0:091e1a699d64 101 reset = 0;
certvert 0:091e1a699d64 102 // wait 10ms
certvert 0:091e1a699d64 103 wait_ms(10);
certvert 0:091e1a699d64 104 // bring out of reset
certvert 0:091e1a699d64 105 reset = 1;
certvert 0:091e1a699d64 106
certvert 0:091e1a699d64 107 #ifdef _ADA326_VER_I2C_
certvert 0:091e1a699d64 108 i2c.start();
certvert 0:091e1a699d64 109 #endif
certvert 0:091e1a699d64 110 ssd1306_command(SSD1306_DISPLAYOFF); // 0xAE
certvert 0:091e1a699d64 111 ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV); // 0xD5
certvert 0:091e1a699d64 112 ssd1306_command(0x80); // the suggested ratio 0x80
certvert 0:091e1a699d64 113
certvert 0:091e1a699d64 114 ssd1306_command(SSD1306_CHARGEPUMP); // 0x8D
certvert 0:091e1a699d64 115 ssd1306_command(0x14);
certvert 0:091e1a699d64 116 ssd1306_command(SSD1306_MEMORYMODE); // 0x20
certvert 0:091e1a699d64 117 ssd1306_command(0x00);
certvert 0:091e1a699d64 118 ssd1306_command(SSD1306_COMSCANDEC); // Write Pixels Downward.
certvert 0:091e1a699d64 119 ssd1306_command(SSD1306_SEGREMAP|0x1); // Write Pixels Rightward.
certvert 0:091e1a699d64 120
certvert 0:091e1a699d64 121 ssd1306_command(SSD1306_NORMALDISPLAY);
certvert 0:091e1a699d64 122 ssd1306_command(SSD1306_DISPLAYON);//--turn on oled panel
certvert 0:091e1a699d64 123 #ifdef _ADA326_VER_I2C_
certvert 0:091e1a699d64 124 i2c.stop();
certvert 0:091e1a699d64 125 #endif
certvert 0:091e1a699d64 126 }
certvert 0:091e1a699d64 127 // Send command through i2c communication
certvert 0:091e1a699d64 128 void Ada326::ssd1306_command(uint8_t cmd)
certvert 0:091e1a699d64 129 {
certvert 0:091e1a699d64 130 char data[] = {0x00, cmd};
certvert 0:091e1a699d64 131 i2c.write(I2C_ADDR, data, 2);
certvert 0:091e1a699d64 132 wait_us(1);
certvert 0:091e1a699d64 133 }
certvert 0:091e1a699d64 134 // Wipe out all pixels (display pitch black)
certvert 0:091e1a699d64 135 void Ada326::clear(bool show)
certvert 0:091e1a699d64 136 {
certvert 0:091e1a699d64 137 for (uint16_t page = 0; page < MAX_PAGE; page++)
certvert 0:091e1a699d64 138 for (uint16_t seg=0; seg < width; seg++)
certvert 0:091e1a699d64 139 screen[seg][page] = 0x0;
certvert 0:091e1a699d64 140 if(show)
certvert 0:091e1a699d64 141 display();
certvert 0:091e1a699d64 142 }
certvert 0:091e1a699d64 143 // Renew display
certvert 0:091e1a699d64 144 void Ada326::display()
certvert 0:091e1a699d64 145 {
certvert 0:091e1a699d64 146
certvert 0:091e1a699d64 147 #ifdef _ADA326_VER_I2C_
certvert 0:091e1a699d64 148 i2c.start();
certvert 0:091e1a699d64 149 #endif
certvert 0:091e1a699d64 150 // Let screen know that the entire display is used. (128x64)
certvert 0:091e1a699d64 151 ssd1306_command(SSD1306_COLUMNADDR);
certvert 0:091e1a699d64 152 ssd1306_command(0); // Column start address (0 = reset)
certvert 0:091e1a699d64 153 ssd1306_command(SSD1306_LCDWIDTH-1); // Column end address (127 = reset)
certvert 0:091e1a699d64 154
certvert 0:091e1a699d64 155 ssd1306_command(SSD1306_PAGEADDR);
certvert 0:091e1a699d64 156 ssd1306_command(0); // Page start address (0 = reset)
certvert 0:091e1a699d64 157 ssd1306_command(7); // Page end address (8th page)
certvert 0:091e1a699d64 158
certvert 0:091e1a699d64 159 // Signal to write pixels on the screen.
certvert 0:091e1a699d64 160 i2c.write(I2C_ADDR);
certvert 0:091e1a699d64 161 i2c.write(0x40);
certvert 0:091e1a699d64 162 wait_us(10);
certvert 0:091e1a699d64 163 int error;
certvert 0:091e1a699d64 164 // Write in consecutive manner.
certvert 0:091e1a699d64 165 for (uint16_t page = 0; page < MAX_PAGE; page++) {
certvert 0:091e1a699d64 166 for (uint16_t seg=0; seg < width; seg++) {
certvert 0:091e1a699d64 167 #ifdef _ADA326_VER_I2C_
certvert 0:091e1a699d64 168 error =i2c.write(screen[seg][page]);
certvert 0:091e1a699d64 169 #elif _ADA326_VER_SPI_
certvert 0:091e1a699d64 170 #endif
certvert 0:091e1a699d64 171 if (error != 1)
certvert 0:091e1a699d64 172 pc.printf("Error occured.\r\n");
certvert 0:091e1a699d64 173 }
certvert 0:091e1a699d64 174 }
certvert 0:091e1a699d64 175 #ifdef _ADA326_VER_I2C_
certvert 0:091e1a699d64 176 i2c.stop();
certvert 0:091e1a699d64 177 #endif
certvert 0:091e1a699d64 178
certvert 0:091e1a699d64 179 }
certvert 0:091e1a699d64 180 uint16_t Ada326::getWidth()
certvert 0:091e1a699d64 181 {
certvert 0:091e1a699d64 182 return SSD1306_LCDWIDTH;
certvert 0:091e1a699d64 183 }
certvert 0:091e1a699d64 184 uint16_t Ada326::getHeight()
certvert 0:091e1a699d64 185 {
certvert 0:091e1a699d64 186 return SSD1306_LCDHEIGHT;
certvert 0:091e1a699d64 187 }
certvert 0:091e1a699d64 188 // Replicate screen on the pc terminal. (Debugging purpose)
certvert 0:091e1a699d64 189 void Ada326::serial_display()
certvert 0:091e1a699d64 190 {
certvert 0:091e1a699d64 191 for (uint16_t y = 0; y < height; y++) {
certvert 0:091e1a699d64 192 for (uint16_t x = 0; x < width; x++) {
certvert 0:091e1a699d64 193 pc.printf("%d", (screen[x][y / page] >> y % com_per_page) & 0x1);
certvert 0:091e1a699d64 194 }
certvert 0:091e1a699d64 195 pc.printf("\r\n");
certvert 0:091e1a699d64 196 }
certvert 0:091e1a699d64 197 }