![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
lpc824lite 采集温湿度压强数据显示至oled12864,通w5500与用户进行TCP交互
Dependencies: mbed WIZnet_Library AM2320 BME280
OLED/CriusOLED.h@2:82785740745d, 2018-02-11 (annotated)
- Committer:
- dadangjia
- Date:
- Sun Feb 11 00:52:50 2018 +0000
- Revision:
- 2:82785740745d
- Parent:
- 0:ef802f772981
lpc824 w5500 sd1306 am2320 bemp280
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dadangjia | 0:ef802f772981 | 1 | /* ============================================ |
dadangjia | 0:ef802f772981 | 2 | Modified Code from Crius |
dadangjia | 0:ef802f772981 | 3 | The CriusOLED Hardware MUST be modified for correct function of ACK |
dadangjia | 0:ef802f772981 | 4 | Copyright (c) 2014 Michael Ruck michael@ruck.com |
dadangjia | 0:ef802f772981 | 5 | |
dadangjia | 0:ef802f772981 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy |
dadangjia | 0:ef802f772981 | 7 | of this software and associated documentation files (the "Software"), to deal |
dadangjia | 0:ef802f772981 | 8 | in the Software without restriction, including without limitation the rights |
dadangjia | 0:ef802f772981 | 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
dadangjia | 0:ef802f772981 | 10 | copies of the Software, and to permit persons to whom the Software is |
dadangjia | 0:ef802f772981 | 11 | furnished to do so, subject to the following conditions: |
dadangjia | 0:ef802f772981 | 12 | |
dadangjia | 0:ef802f772981 | 13 | The above copyright notice and this permission notice shall be included in |
dadangjia | 0:ef802f772981 | 14 | all copies or substantial portions of the Software. |
dadangjia | 0:ef802f772981 | 15 | |
dadangjia | 0:ef802f772981 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
dadangjia | 0:ef802f772981 | 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
dadangjia | 0:ef802f772981 | 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
dadangjia | 0:ef802f772981 | 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
dadangjia | 0:ef802f772981 | 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
dadangjia | 0:ef802f772981 | 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
dadangjia | 0:ef802f772981 | 22 | THE SOFTWARE. |
dadangjia | 0:ef802f772981 | 23 | =============================================== |
dadangjia | 0:ef802f772981 | 24 | */ |
dadangjia | 0:ef802f772981 | 25 | #include "./data.h" |
dadangjia | 0:ef802f772981 | 26 | #define OLED_ADDR (0x78) |
dadangjia | 0:ef802f772981 | 27 | |
dadangjia | 0:ef802f772981 | 28 | I2C i2c(I2C_SDA, I2C_SCL); |
dadangjia | 0:ef802f772981 | 29 | |
dadangjia | 0:ef802f772981 | 30 | void displayOn(void); |
dadangjia | 0:ef802f772981 | 31 | void displayOff(void); |
dadangjia | 0:ef802f772981 | 32 | void SendByte(unsigned char data); |
dadangjia | 0:ef802f772981 | 33 | void sendcommand(unsigned char com); |
dadangjia | 0:ef802f772981 | 34 | void SendByte(unsigned char com); |
dadangjia | 0:ef802f772981 | 35 | void printBigNumber(unsigned char s, int X, int Y); |
dadangjia | 0:ef802f772981 | 36 | void SendByteXY(unsigned char data, int X, int Y); |
dadangjia | 0:ef802f772981 | 37 | |
dadangjia | 0:ef802f772981 | 38 | |
dadangjia | 0:ef802f772981 | 39 | //==========================================================// |
dadangjia | 0:ef802f772981 | 40 | // Turns display on. |
dadangjia | 0:ef802f772981 | 41 | void displayOn(void) |
dadangjia | 0:ef802f772981 | 42 | { |
dadangjia | 0:ef802f772981 | 43 | sendcommand(0xaf); //display on |
dadangjia | 0:ef802f772981 | 44 | } |
dadangjia | 0:ef802f772981 | 45 | |
dadangjia | 0:ef802f772981 | 46 | //==========================================================// |
dadangjia | 0:ef802f772981 | 47 | // Turns display off. |
dadangjia | 0:ef802f772981 | 48 | void displayOff(void) |
dadangjia | 0:ef802f772981 | 49 | { |
dadangjia | 0:ef802f772981 | 50 | sendcommand(0xae); //display off |
dadangjia | 0:ef802f772981 | 51 | } |
dadangjia | 0:ef802f772981 | 52 | //==========================================================// |
dadangjia | 0:ef802f772981 | 53 | // Actually this sends a byte, not a char to draw in the display. |
dadangjia | 0:ef802f772981 | 54 | // Display's chars uses 8 byte font the small ones and 96 bytes |
dadangjia | 0:ef802f772981 | 55 | // for the big number font. |
dadangjia | 0:ef802f772981 | 56 | void SendByte(unsigned char data) |
dadangjia | 0:ef802f772981 | 57 | { |
dadangjia | 0:ef802f772981 | 58 | //Create a temporary buffer |
dadangjia | 0:ef802f772981 | 59 | char buff[2]; |
dadangjia | 0:ef802f772981 | 60 | |
dadangjia | 0:ef802f772981 | 61 | //Load the control byte and 8-bit data |
dadangjia | 0:ef802f772981 | 62 | buff[0] = (0x40); |
dadangjia | 0:ef802f772981 | 63 | buff[1] = data; |
dadangjia | 0:ef802f772981 | 64 | |
dadangjia | 0:ef802f772981 | 65 | //Write the data |
dadangjia | 0:ef802f772981 | 66 | i2c.write(OLED_ADDR, buff, 2); |
dadangjia | 0:ef802f772981 | 67 | |
dadangjia | 0:ef802f772981 | 68 | } |
dadangjia | 0:ef802f772981 | 69 | |
dadangjia | 0:ef802f772981 | 70 | //==========================================================// |
dadangjia | 0:ef802f772981 | 71 | // Used to send commands to the display. |
dadangjia | 0:ef802f772981 | 72 | void sendcommand(unsigned char com) |
dadangjia | 0:ef802f772981 | 73 | { |
dadangjia | 0:ef802f772981 | 74 | //Create a temporary buffer |
dadangjia | 0:ef802f772981 | 75 | char buff[2]; |
dadangjia | 0:ef802f772981 | 76 | |
dadangjia | 0:ef802f772981 | 77 | //Load the control byte and 8-bit command |
dadangjia | 0:ef802f772981 | 78 | buff[0] = 0x00; |
dadangjia | 0:ef802f772981 | 79 | buff[1] = com; |
dadangjia | 0:ef802f772981 | 80 | |
dadangjia | 0:ef802f772981 | 81 | //Write the command |
dadangjia | 0:ef802f772981 | 82 | i2c.write(OLED_ADDR, buff, 2); |
dadangjia | 0:ef802f772981 | 83 | } |
dadangjia | 0:ef802f772981 | 84 | //==========================================================// |
dadangjia | 0:ef802f772981 | 85 | // Set the cursor position in a 16 COL * 8 ROW map. |
dadangjia | 0:ef802f772981 | 86 | void setXY(unsigned char row,unsigned char col) |
dadangjia | 0:ef802f772981 | 87 | { |
dadangjia | 0:ef802f772981 | 88 | sendcommand(0xb0+row); //set page address |
dadangjia | 0:ef802f772981 | 89 | sendcommand(0x00+(8*col&0x0f)); //set low col address |
dadangjia | 0:ef802f772981 | 90 | sendcommand(0x10+((8*col>>4)&0x0f)); //set high col address |
dadangjia | 0:ef802f772981 | 91 | } |
dadangjia | 0:ef802f772981 | 92 | //==========================================================// |
dadangjia | 0:ef802f772981 | 93 | // Clears the display by sendind 0 to all the screen map. |
dadangjia | 0:ef802f772981 | 94 | void clear_display(void) |
dadangjia | 0:ef802f772981 | 95 | { |
dadangjia | 0:ef802f772981 | 96 | unsigned char i,k; |
dadangjia | 0:ef802f772981 | 97 | for(k=0; k<8; k++) { |
dadangjia | 0:ef802f772981 | 98 | setXY(k,0); |
dadangjia | 0:ef802f772981 | 99 | { |
dadangjia | 0:ef802f772981 | 100 | for(i=0; i<128; i++) { //clear all COL |
dadangjia | 0:ef802f772981 | 101 | SendByte(0); //clear all COL |
dadangjia | 0:ef802f772981 | 102 | //delay(10); |
dadangjia | 0:ef802f772981 | 103 | } |
dadangjia | 0:ef802f772981 | 104 | } |
dadangjia | 0:ef802f772981 | 105 | } |
dadangjia | 0:ef802f772981 | 106 | } |
dadangjia | 0:ef802f772981 | 107 | //==========================================================// |
dadangjia | 0:ef802f772981 | 108 | // Resets display depending on the actual mode. |
dadangjia | 0:ef802f772981 | 109 | void reset_display(void) |
dadangjia | 0:ef802f772981 | 110 | { |
dadangjia | 0:ef802f772981 | 111 | displayOff(); |
dadangjia | 0:ef802f772981 | 112 | clear_display(); |
dadangjia | 0:ef802f772981 | 113 | |
dadangjia | 0:ef802f772981 | 114 | |
dadangjia | 0:ef802f772981 | 115 | displayOn(); |
dadangjia | 0:ef802f772981 | 116 | } |
dadangjia | 0:ef802f772981 | 117 | //==========================================================// |
dadangjia | 0:ef802f772981 | 118 | |
dadangjia | 0:ef802f772981 | 119 | void sendImage() |
dadangjia | 0:ef802f772981 | 120 | { |
dadangjia | 0:ef802f772981 | 121 | reset_display(); |
dadangjia | 0:ef802f772981 | 122 | for(int i=0; i<128*8; i++) // show 128* 64 Logo |
dadangjia | 0:ef802f772981 | 123 | SendByte(logo[i]); |
dadangjia | 0:ef802f772981 | 124 | |
dadangjia | 0:ef802f772981 | 125 | } |
dadangjia | 0:ef802f772981 | 126 | //==========================================================// |
dadangjia | 0:ef802f772981 | 127 | void printBigTime(char *s) |
dadangjia | 0:ef802f772981 | 128 | { |
dadangjia | 0:ef802f772981 | 129 | |
dadangjia | 0:ef802f772981 | 130 | int Y=0; |
dadangjia | 0:ef802f772981 | 131 | int lon = strlen(s); |
dadangjia | 0:ef802f772981 | 132 | if(lon == 3) { |
dadangjia | 0:ef802f772981 | 133 | Y = 0; |
dadangjia | 0:ef802f772981 | 134 | } else if (lon == 2) { |
dadangjia | 0:ef802f772981 | 135 | Y = 3; |
dadangjia | 0:ef802f772981 | 136 | } else if (lon == 1) { |
dadangjia | 0:ef802f772981 | 137 | Y = 6; |
dadangjia | 0:ef802f772981 | 138 | } |
dadangjia | 0:ef802f772981 | 139 | |
dadangjia | 0:ef802f772981 | 140 | int X = 2; |
dadangjia | 0:ef802f772981 | 141 | while(*s) { |
dadangjia | 0:ef802f772981 | 142 | printBigNumber(*s, X, Y); |
dadangjia | 0:ef802f772981 | 143 | |
dadangjia | 0:ef802f772981 | 144 | Y+=3; |
dadangjia | 0:ef802f772981 | 145 | X=2; |
dadangjia | 0:ef802f772981 | 146 | setXY(X,Y); |
dadangjia | 0:ef802f772981 | 147 | *s++; |
dadangjia | 0:ef802f772981 | 148 | } |
dadangjia | 0:ef802f772981 | 149 | } |
dadangjia | 0:ef802f772981 | 150 | |
dadangjia | 0:ef802f772981 | 151 | |
dadangjia | 0:ef802f772981 | 152 | //==========================================================// |
dadangjia | 0:ef802f772981 | 153 | // Prints a display big number (96 bytes) in coordinates X Y, |
dadangjia | 0:ef802f772981 | 154 | // being multiples of 8. This means we have 16 COLS (0-15) |
dadangjia | 0:ef802f772981 | 155 | // and 8 ROWS (0-7). |
dadangjia | 0:ef802f772981 | 156 | void printBigNumber(unsigned char s, int X, int Y) |
dadangjia | 0:ef802f772981 | 157 | { |
dadangjia | 0:ef802f772981 | 158 | setXY(X,Y); |
dadangjia | 0:ef802f772981 | 159 | int salto=0; |
dadangjia | 0:ef802f772981 | 160 | for(int i=0; i<96; i++) { |
dadangjia | 0:ef802f772981 | 161 | if(s == ' ') { |
dadangjia | 0:ef802f772981 | 162 | SendByte(0); |
dadangjia | 0:ef802f772981 | 163 | } else |
dadangjia | 0:ef802f772981 | 164 | SendByte(bigNumbers[s-0x30][i]); |
dadangjia | 0:ef802f772981 | 165 | |
dadangjia | 0:ef802f772981 | 166 | if(salto == 23) { |
dadangjia | 0:ef802f772981 | 167 | salto = 0; |
dadangjia | 0:ef802f772981 | 168 | X++; |
dadangjia | 0:ef802f772981 | 169 | setXY(X,Y); |
dadangjia | 0:ef802f772981 | 170 | } else { |
dadangjia | 0:ef802f772981 | 171 | salto++; |
dadangjia | 0:ef802f772981 | 172 | } |
dadangjia | 0:ef802f772981 | 173 | } |
dadangjia | 0:ef802f772981 | 174 | } |
dadangjia | 0:ef802f772981 | 175 | //==========================================================// |
dadangjia | 0:ef802f772981 | 176 | // Prints a display char (not just a byte) in coordinates X Y, |
dadangjia | 0:ef802f772981 | 177 | // being multiples of 8. This means we have 16 COLS (0-15) |
dadangjia | 0:ef802f772981 | 178 | // and 8 ROWS (0-7). |
dadangjia | 0:ef802f772981 | 179 | void SendByteXY(unsigned char data, int X, int Y) |
dadangjia | 0:ef802f772981 | 180 | { |
dadangjia | 0:ef802f772981 | 181 | i2c.start(); |
dadangjia | 0:ef802f772981 | 182 | i2c.write(OLED_ADDR); |
dadangjia | 0:ef802f772981 | 183 | i2c.write(0x40); |
dadangjia | 0:ef802f772981 | 184 | |
dadangjia | 0:ef802f772981 | 185 | for(int i=0; i<8; i++) |
dadangjia | 0:ef802f772981 | 186 | i2c.write((int)(myFont[data-0x20]+i)); // <<------------------------------------- |
dadangjia | 0:ef802f772981 | 187 | |
dadangjia | 0:ef802f772981 | 188 | i2c.stop(); // stop transmitting |
dadangjia | 0:ef802f772981 | 189 | } |
dadangjia | 0:ef802f772981 | 190 | //==========================================================// |
dadangjia | 0:ef802f772981 | 191 | // Prints a string regardless the cursor position. |
dadangjia | 0:ef802f772981 | 192 | void sendStr(unsigned char *s) |
dadangjia | 0:ef802f772981 | 193 | { |
dadangjia | 0:ef802f772981 | 194 | unsigned char i=0; |
dadangjia | 0:ef802f772981 | 195 | while(*s) { |
dadangjia | 0:ef802f772981 | 196 | for(i=0; i<8; i++) { |
dadangjia | 0:ef802f772981 | 197 | SendByte(myFont[*s-0x20][i]); |
dadangjia | 0:ef802f772981 | 198 | } |
dadangjia | 0:ef802f772981 | 199 | *s++; |
dadangjia | 0:ef802f772981 | 200 | } |
dadangjia | 0:ef802f772981 | 201 | } |
dadangjia | 0:ef802f772981 | 202 | //==========================================================// |
dadangjia | 0:ef802f772981 | 203 | // Prints a string in coordinates X Y, being multiples of 8. |
dadangjia | 0:ef802f772981 | 204 | // This means we have 16 COLS (0-15) and 8 ROWS (0-7). |
dadangjia | 0:ef802f772981 | 205 | void sendStrXY( char *s, int X, int Y) |
dadangjia | 0:ef802f772981 | 206 | { |
dadangjia | 0:ef802f772981 | 207 | setXY(X,Y); |
dadangjia | 0:ef802f772981 | 208 | unsigned char i=0; |
dadangjia | 0:ef802f772981 | 209 | while(*s) { |
dadangjia | 0:ef802f772981 | 210 | for(i=0; i<8; i++) { |
dadangjia | 0:ef802f772981 | 211 | SendByte(myFont[*s-0x20][i]); |
dadangjia | 0:ef802f772981 | 212 | } |
dadangjia | 0:ef802f772981 | 213 | *s++; |
dadangjia | 0:ef802f772981 | 214 | } |
dadangjia | 0:ef802f772981 | 215 | } |
dadangjia | 0:ef802f772981 | 216 | |
dadangjia | 0:ef802f772981 | 217 | |
dadangjia | 0:ef802f772981 | 218 | //==========================================================// |
dadangjia | 0:ef802f772981 | 219 | // Inits oled and draws logo at startup |
dadangjia | 0:ef802f772981 | 220 | void init_OLED(void) |
dadangjia | 0:ef802f772981 | 221 | { |
dadangjia | 0:ef802f772981 | 222 | sendcommand(0xae); //display off |
dadangjia | 0:ef802f772981 | 223 | sendcommand(0xa6); //Set Normal Display (default) |
dadangjia | 0:ef802f772981 | 224 | // Adafruit Init sequence for 128x64 OLED module |
dadangjia | 0:ef802f772981 | 225 | sendcommand(0xAE); //DISPLAYOFF |
dadangjia | 0:ef802f772981 | 226 | sendcommand(0xD5); //SETDISPLAYCLOCKDIV |
dadangjia | 0:ef802f772981 | 227 | sendcommand(0x80); // the suggested ratio 0x80 |
dadangjia | 0:ef802f772981 | 228 | sendcommand(0xA8); //SSD1306_SETMULTIPLEX |
dadangjia | 0:ef802f772981 | 229 | sendcommand(0x3F); |
dadangjia | 0:ef802f772981 | 230 | sendcommand(0xD3); //SETDISPLAYOFFSET |
dadangjia | 0:ef802f772981 | 231 | sendcommand(0x0); //no offset |
dadangjia | 0:ef802f772981 | 232 | sendcommand(0x40 | 0x0); //SETSTARTLINE |
dadangjia | 0:ef802f772981 | 233 | sendcommand(0x8D); //CHARGEPUMP |
dadangjia | 0:ef802f772981 | 234 | sendcommand(0x14); |
dadangjia | 0:ef802f772981 | 235 | sendcommand(0x20); //MEMORYMODE |
dadangjia | 0:ef802f772981 | 236 | sendcommand(0x00); //0x0 act like ks0108 |
dadangjia | 0:ef802f772981 | 237 | |
dadangjia | 0:ef802f772981 | 238 | sendcommand(0xA0 | 0x1); //SEGREMAP //Rotate screen 180 deg |
dadangjia | 0:ef802f772981 | 239 | //sendcommand(0xA0); |
dadangjia | 0:ef802f772981 | 240 | |
dadangjia | 0:ef802f772981 | 241 | sendcommand(0xC8); //COMSCANDEC Rotate screen 180 Deg |
dadangjia | 0:ef802f772981 | 242 | //sendcommand(0xC0); |
dadangjia | 0:ef802f772981 | 243 | |
dadangjia | 0:ef802f772981 | 244 | sendcommand(0xDA); //0xDA |
dadangjia | 0:ef802f772981 | 245 | sendcommand(0x12); //COMSCANDEC |
dadangjia | 0:ef802f772981 | 246 | sendcommand(0x81); //SETCONTRAS |
dadangjia | 0:ef802f772981 | 247 | sendcommand(0xCF); // |
dadangjia | 0:ef802f772981 | 248 | sendcommand(0xd9); //SETPRECHARGE |
dadangjia | 0:ef802f772981 | 249 | sendcommand(0xF1); |
dadangjia | 0:ef802f772981 | 250 | sendcommand(0xDB); //SETVCOMDETECT |
dadangjia | 0:ef802f772981 | 251 | sendcommand(0x40); |
dadangjia | 0:ef802f772981 | 252 | sendcommand(0xA4); //DISPLAYALLON_RESUME |
dadangjia | 0:ef802f772981 | 253 | sendcommand(0xA6); //NORMALDISPLAY |
dadangjia | 0:ef802f772981 | 254 | |
dadangjia | 0:ef802f772981 | 255 | clear_display(); |
dadangjia | 0:ef802f772981 | 256 | sendcommand(0x2e); // stop scroll |
dadangjia | 0:ef802f772981 | 257 | //----------------------------REVERSE comments----------------------------// |
dadangjia | 0:ef802f772981 | 258 | // sendcommand(0xa0); //seg re-map 0->127(default) |
dadangjia | 0:ef802f772981 | 259 | // sendcommand(0xa1); //seg re-map 127->0 |
dadangjia | 0:ef802f772981 | 260 | // sendcommand(0xc8); |
dadangjia | 0:ef802f772981 | 261 | // delay(1000); |
dadangjia | 0:ef802f772981 | 262 | //----------------------------REVERSE comments----------------------------// |
dadangjia | 0:ef802f772981 | 263 | // sendcommand(0xa7); //Set Inverse Display |
dadangjia | 0:ef802f772981 | 264 | // sendcommand(0xae); //display off |
dadangjia | 0:ef802f772981 | 265 | sendcommand(0x20); //Set Memory Addressing Mode |
dadangjia | 0:ef802f772981 | 266 | sendcommand(0x00); //Set Memory Addressing Mode ab Horizontal addressing mode |
dadangjia | 0:ef802f772981 | 267 | // sendcommand(0x02); // Set Memory Addressing Mode ab Page addressing mode(RESET) |
dadangjia | 0:ef802f772981 | 268 | |
dadangjia | 0:ef802f772981 | 269 | setXY(0,0); |
dadangjia | 0:ef802f772981 | 270 | |
dadangjia | 0:ef802f772981 | 271 | sendcommand(0xaf); //display on |
dadangjia | 0:ef802f772981 | 272 | } |