lpc824lite 采集温湿度压强数据显示至oled12864,通w5500与用户进行TCP交互

Dependencies:   mbed WIZnet_Library AM2320 BME280

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?

UserRevisionLine numberNew 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 }