hadif azli / Mbed 2 deprecated TEST123

Dependencies:   mbed Blynk

Committer:
lixianyu
Date:
Fri Jun 10 15:20:20 2016 +0000
Revision:
0:d8f4c441e032
u8glib???????????i2c???

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lixianyu 0:d8f4c441e032 1 /*
lixianyu 0:d8f4c441e032 2
lixianyu 0:d8f4c441e032 3 u8g_dev_ht1632.c
lixianyu 0:d8f4c441e032 4
lixianyu 0:d8f4c441e032 5 1-Bit (BW) Driver for HT1632 controller
lixianyu 0:d8f4c441e032 6
lixianyu 0:d8f4c441e032 7 Universal 8bit Graphics Library
lixianyu 0:d8f4c441e032 8
lixianyu 0:d8f4c441e032 9 Copyright (c) 2013, olikraus@gmail.com
lixianyu 0:d8f4c441e032 10 All rights reserved.
lixianyu 0:d8f4c441e032 11
lixianyu 0:d8f4c441e032 12 Redistribution and use in source and binary forms, with or without modification,
lixianyu 0:d8f4c441e032 13 are permitted provided that the following conditions are met:
lixianyu 0:d8f4c441e032 14
lixianyu 0:d8f4c441e032 15 * Redistributions of source code must retain the above copyright notice, this list
lixianyu 0:d8f4c441e032 16 of conditions and the following disclaimer.
lixianyu 0:d8f4c441e032 17
lixianyu 0:d8f4c441e032 18 * Redistributions in binary form must reproduce the above copyright notice, this
lixianyu 0:d8f4c441e032 19 list of conditions and the following disclaimer in the documentation and/or other
lixianyu 0:d8f4c441e032 20 materials provided with the distribution.
lixianyu 0:d8f4c441e032 21
lixianyu 0:d8f4c441e032 22 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
lixianyu 0:d8f4c441e032 23 CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
lixianyu 0:d8f4c441e032 24 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
lixianyu 0:d8f4c441e032 25 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
lixianyu 0:d8f4c441e032 26 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
lixianyu 0:d8f4c441e032 27 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
lixianyu 0:d8f4c441e032 28 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
lixianyu 0:d8f4c441e032 29 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
lixianyu 0:d8f4c441e032 30 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
lixianyu 0:d8f4c441e032 31 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
lixianyu 0:d8f4c441e032 32 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
lixianyu 0:d8f4c441e032 33 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
lixianyu 0:d8f4c441e032 34 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
lixianyu 0:d8f4c441e032 35
lixianyu 0:d8f4c441e032 36
lixianyu 0:d8f4c441e032 37
lixianyu 0:d8f4c441e032 38 U8G_PIN_NONE can be used as argument
lixianyu 0:d8f4c441e032 39
lixianyu 0:d8f4c441e032 40 uint8_t u8g_InitSPI(u8g_t *u8g, u8g_dev_t *dev, uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset)
lixianyu 0:d8f4c441e032 41 {
lixianyu 0:d8f4c441e032 42 ...
lixianyu 0:d8f4c441e032 43 u8g->pin_list[U8G_PI_SCK] = sck;
lixianyu 0:d8f4c441e032 44 u8g->pin_list[U8G_PI_MOSI] = mosi;
lixianyu 0:d8f4c441e032 45 u8g->pin_list[U8G_PI_CS] = cs;
lixianyu 0:d8f4c441e032 46 u8g->pin_list[U8G_PI_A0] = a0;
lixianyu 0:d8f4c441e032 47 u8g->pin_list[U8G_PI_RESET] = reset;
lixianyu 0:d8f4c441e032 48
lixianyu 0:d8f4c441e032 49 mapping
lixianyu 0:d8f4c441e032 50
lixianyu 0:d8f4c441e032 51 #define DATA_PIN --> U8G_PI_MOSI
lixianyu 0:d8f4c441e032 52 #define WR_PIN --> U8G_PI_SCK
lixianyu 0:d8f4c441e032 53 #define CS_PIN --> U8G_PI_CS
lixianyu 0:d8f4c441e032 54 U8G_PI_A0 --> not used
lixianyu 0:d8f4c441e032 55 U8G_PI_RESET --> not used
lixianyu 0:d8f4c441e032 56
lixianyu 0:d8f4c441e032 57 Usage:
lixianyu 0:d8f4c441e032 58
lixianyu 0:d8f4c441e032 59 u8g_InitSPI(&u8g, &u8g_dev_ht1632_24x16, WR_PIN, DATA_IN, CS_PIN, U8G_PIN_NONE, U8G_PIN_NONE)
lixianyu 0:d8f4c441e032 60
lixianyu 0:d8f4c441e032 61 */
lixianyu 0:d8f4c441e032 62
lixianyu 0:d8f4c441e032 63 #include "u8g.h"
lixianyu 0:d8f4c441e032 64
lixianyu 0:d8f4c441e032 65 #define WIDTH 24
lixianyu 0:d8f4c441e032 66 #define HEIGHT 16
lixianyu 0:d8f4c441e032 67 #define PAGE_HEIGHT 16
lixianyu 0:d8f4c441e032 68
lixianyu 0:d8f4c441e032 69 /* http://forum.arduino.cc/index.php?topic=168537.0 */
lixianyu 0:d8f4c441e032 70
lixianyu 0:d8f4c441e032 71 #define HT1632_CMD_SYSDIS 0x00 // CMD= 0000-0000-x Turn off oscil
lixianyu 0:d8f4c441e032 72 #define HT1632_CMD_SYSON 0x01 // CMD= 0000-0001-x Enable system oscil
lixianyu 0:d8f4c441e032 73 #define HT1632_CMD_LEDOFF 0x02 // CMD= 0000-0010-x LED duty cycle gen off
lixianyu 0:d8f4c441e032 74 #define HT1632_CMD_LEDON 0x03 // CMD= 0000-0011-x LEDs ON
lixianyu 0:d8f4c441e032 75 #define HT1632_CMD_BLOFF 0x08 // CMD= 0000-1000-x Blink OFF
lixianyu 0:d8f4c441e032 76 #define HT1632_CMD_BLON 0x09 // CMD= 0000-1001-x Blink On
lixianyu 0:d8f4c441e032 77 #define HT1632_CMD_SLVMD 0x10 // CMD= 0001-00xx-x Slave Mode
lixianyu 0:d8f4c441e032 78 #define HT1632_CMD_MSTMD 0x14 // CMD= 0001-01xx-x Master Mode
lixianyu 0:d8f4c441e032 79 #define HT1632_CMD_RCCLK 0x18 // CMD= 0001-10xx-x Use on-chip clock
lixianyu 0:d8f4c441e032 80 #define HT1632_CMD_EXTCLK 0x1C // CMD= 0001-11xx-x Use external clock
lixianyu 0:d8f4c441e032 81 #define HT1632_CMD_COMS00 0x20 // CMD= 0010-ABxx-x commons options
lixianyu 0:d8f4c441e032 82 #define HT1632_CMD_COMS01 0x24 // CMD= 0010-ABxx-x commons options
lixianyu 0:d8f4c441e032 83 #define HT1632_CMD_COMS10 0x28 // CMD= 0010-ABxx-x commons options
lixianyu 0:d8f4c441e032 84 #define HT1632_CMD_COMS11 0x2C // P-MOS OUTPUT AND 16COMMON OPTION
lixianyu 0:d8f4c441e032 85 #define HT1632_CMD_PWM 0xA0 // CMD= 101x-PPPP-x PWM duty cycle
lixianyu 0:d8f4c441e032 86
lixianyu 0:d8f4c441e032 87 #define HT1632_ID_CMD 4 /* ID = 100 - Commands */
lixianyu 0:d8f4c441e032 88 #define HT1632_ID_RD 6 /* ID = 110 - Read RAM */
lixianyu 0:d8f4c441e032 89 #define HT1632_ID_WR 5 /* ID = 101 - Write RAM */
lixianyu 0:d8f4c441e032 90
lixianyu 0:d8f4c441e032 91 #define HT1632_ID_LEN 3 // IDs are 3 bits
lixianyu 0:d8f4c441e032 92 #define HT1632_CMD_LEN 8 // CMDs are 8 bits
lixianyu 0:d8f4c441e032 93 #define HT1632_DATA_LEN 8 // Data are 4*2 bits
lixianyu 0:d8f4c441e032 94 #define HT1632_ADDR_LEN 7 // Address are 7 bits
lixianyu 0:d8f4c441e032 95
lixianyu 0:d8f4c441e032 96 #if defined(ARDUINO)
lixianyu 0:d8f4c441e032 97
lixianyu 0:d8f4c441e032 98 #if ARDUINO < 100
lixianyu 0:d8f4c441e032 99 #include <WProgram.h>
lixianyu 0:d8f4c441e032 100 #else
lixianyu 0:d8f4c441e032 101 #include <Arduino.h>
lixianyu 0:d8f4c441e032 102 #endif
lixianyu 0:d8f4c441e032 103
lixianyu 0:d8f4c441e032 104 //#define WR_PIN 3
lixianyu 0:d8f4c441e032 105 //#define DATA_PIN 2
lixianyu 0:d8f4c441e032 106 //#define CS_PIN 4
lixianyu 0:d8f4c441e032 107
lixianyu 0:d8f4c441e032 108 void ht1632_write_data_MSB(u8g_t *u8g, uint8_t cnt, uint8_t data, uint8_t extra)
lixianyu 0:d8f4c441e032 109 {
lixianyu 0:d8f4c441e032 110 int8_t i;
lixianyu 0:d8f4c441e032 111 uint8_t data_pin = u8g->pin_list[U8G_PI_MOSI];
lixianyu 0:d8f4c441e032 112 uint8_t wr_pin = u8g->pin_list[U8G_PI_SCK];
lixianyu 0:d8f4c441e032 113
lixianyu 0:d8f4c441e032 114 for(i = cnt - 1; i >= 0; i--)
lixianyu 0:d8f4c441e032 115 {
lixianyu 0:d8f4c441e032 116 if ((data >> i) & 1)
lixianyu 0:d8f4c441e032 117 {
lixianyu 0:d8f4c441e032 118 digitalWrite(data_pin, HIGH);
lixianyu 0:d8f4c441e032 119 }
lixianyu 0:d8f4c441e032 120 else
lixianyu 0:d8f4c441e032 121 {
lixianyu 0:d8f4c441e032 122 digitalWrite(data_pin, LOW);
lixianyu 0:d8f4c441e032 123 }
lixianyu 0:d8f4c441e032 124
lixianyu 0:d8f4c441e032 125 digitalWrite(wr_pin, LOW);
lixianyu 0:d8f4c441e032 126 u8g_MicroDelay();
lixianyu 0:d8f4c441e032 127 digitalWrite(wr_pin, HIGH);
lixianyu 0:d8f4c441e032 128 u8g_MicroDelay();
lixianyu 0:d8f4c441e032 129 }
lixianyu 0:d8f4c441e032 130
lixianyu 0:d8f4c441e032 131 // Send an extra bit
lixianyu 0:d8f4c441e032 132 if (extra)
lixianyu 0:d8f4c441e032 133 {
lixianyu 0:d8f4c441e032 134 digitalWrite(data_pin, HIGH);
lixianyu 0:d8f4c441e032 135 digitalWrite(wr_pin, LOW);
lixianyu 0:d8f4c441e032 136 u8g_MicroDelay();
lixianyu 0:d8f4c441e032 137 digitalWrite(wr_pin, HIGH);
lixianyu 0:d8f4c441e032 138 u8g_MicroDelay();
lixianyu 0:d8f4c441e032 139 }
lixianyu 0:d8f4c441e032 140 }
lixianyu 0:d8f4c441e032 141
lixianyu 0:d8f4c441e032 142 void ht1632_write_data(u8g_t *u8g, uint8_t cnt, uint8_t data)
lixianyu 0:d8f4c441e032 143 {
lixianyu 0:d8f4c441e032 144 uint8_t i;
lixianyu 0:d8f4c441e032 145 uint8_t data_pin = u8g->pin_list[U8G_PI_MOSI];
lixianyu 0:d8f4c441e032 146 uint8_t wr_pin = u8g->pin_list[U8G_PI_SCK];
lixianyu 0:d8f4c441e032 147 for (i = 0; i < cnt; i++)
lixianyu 0:d8f4c441e032 148 {
lixianyu 0:d8f4c441e032 149
lixianyu 0:d8f4c441e032 150 if ((data >> i) & 1) {
lixianyu 0:d8f4c441e032 151 digitalWrite(data_pin, HIGH);
lixianyu 0:d8f4c441e032 152 }
lixianyu 0:d8f4c441e032 153 else {
lixianyu 0:d8f4c441e032 154 digitalWrite(data_pin, LOW);
lixianyu 0:d8f4c441e032 155 }
lixianyu 0:d8f4c441e032 156
lixianyu 0:d8f4c441e032 157 digitalWrite(wr_pin, LOW);
lixianyu 0:d8f4c441e032 158 u8g_MicroDelay();
lixianyu 0:d8f4c441e032 159 digitalWrite(wr_pin, HIGH);
lixianyu 0:d8f4c441e032 160 u8g_MicroDelay();
lixianyu 0:d8f4c441e032 161 }
lixianyu 0:d8f4c441e032 162 }
lixianyu 0:d8f4c441e032 163
lixianyu 0:d8f4c441e032 164
lixianyu 0:d8f4c441e032 165 void ht1632_init(u8g_t *u8g)
lixianyu 0:d8f4c441e032 166 {
lixianyu 0:d8f4c441e032 167 //uint8_t i;
lixianyu 0:d8f4c441e032 168 uint8_t data_pin = u8g->pin_list[U8G_PI_MOSI];
lixianyu 0:d8f4c441e032 169 uint8_t wr_pin = u8g->pin_list[U8G_PI_SCK];
lixianyu 0:d8f4c441e032 170 uint8_t cs_pin = u8g->pin_list[U8G_PI_CS];
lixianyu 0:d8f4c441e032 171 pinMode(data_pin, OUTPUT);
lixianyu 0:d8f4c441e032 172 pinMode(wr_pin, OUTPUT);
lixianyu 0:d8f4c441e032 173 pinMode(cs_pin, OUTPUT);
lixianyu 0:d8f4c441e032 174
lixianyu 0:d8f4c441e032 175 digitalWrite(data_pin, HIGH);
lixianyu 0:d8f4c441e032 176 digitalWrite(wr_pin, HIGH);
lixianyu 0:d8f4c441e032 177 digitalWrite(cs_pin, HIGH);
lixianyu 0:d8f4c441e032 178
lixianyu 0:d8f4c441e032 179 digitalWrite(cs_pin, LOW);
lixianyu 0:d8f4c441e032 180 /* init display once after startup */
lixianyu 0:d8f4c441e032 181 ht1632_write_data_MSB(u8g, 3, HT1632_ID_CMD, false); // IDs are 3 bits
lixianyu 0:d8f4c441e032 182 ht1632_write_data_MSB(u8g, 8, HT1632_CMD_SYSDIS, true); // 8 bits
lixianyu 0:d8f4c441e032 183 ht1632_write_data_MSB(u8g, 8, HT1632_CMD_SYSON, true); // 8 bits
lixianyu 0:d8f4c441e032 184 ht1632_write_data_MSB(u8g, 8, HT1632_CMD_COMS11, true); // 8 bits
lixianyu 0:d8f4c441e032 185 ht1632_write_data_MSB(u8g, 8, HT1632_CMD_LEDON, true); // 8 bits
lixianyu 0:d8f4c441e032 186 ht1632_write_data_MSB(u8g, 8, HT1632_CMD_BLOFF, true); // 8 bits
lixianyu 0:d8f4c441e032 187 ht1632_write_data_MSB(u8g, 8, HT1632_CMD_PWM+15, true); // 8 bits
lixianyu 0:d8f4c441e032 188 digitalWrite(cs_pin, HIGH);
lixianyu 0:d8f4c441e032 189
lixianyu 0:d8f4c441e032 190 /* removed following (debug) code */
lixianyu 0:d8f4c441e032 191 /*
lixianyu 0:d8f4c441e032 192 digitalWrite(cs_pin, LOW);
lixianyu 0:d8f4c441e032 193 ht1632_write_data_MSB(u8g, 3, HT1632_ID_WR, false); // Send "write to display" command
lixianyu 0:d8f4c441e032 194 ht1632_write_data_MSB(u8g, 7, 0, false);
lixianyu 0:d8f4c441e032 195 for(i = 0; i<48; ++i)
lixianyu 0:d8f4c441e032 196 {
lixianyu 0:d8f4c441e032 197 ht1632_write_data(u8g, 8, 0xFF);
lixianyu 0:d8f4c441e032 198 }
lixianyu 0:d8f4c441e032 199 digitalWrite(cs_pin, HIGH);
lixianyu 0:d8f4c441e032 200 */
lixianyu 0:d8f4c441e032 201 }
lixianyu 0:d8f4c441e032 202
lixianyu 0:d8f4c441e032 203 /*
lixianyu 0:d8f4c441e032 204 page: 0=data contain lines 0..16, 1=data contain lines 16..32 (a 24x16 display will only have page 0)
lixianyu 0:d8f4c441e032 205 cnt: width of the display
lixianyu 0:d8f4c441e032 206 data: pointer to a buffer with 2*cnt bytes.
lixianyu 0:d8f4c441e032 207 */
lixianyu 0:d8f4c441e032 208 void ht1632_transfer_data(u8g_t *u8g, uint8_t page, uint8_t cnt, uint8_t *data)
lixianyu 0:d8f4c441e032 209 {
lixianyu 0:d8f4c441e032 210 uint8_t addr;
lixianyu 0:d8f4c441e032 211 uint8_t cs_pin = u8g->pin_list[U8G_PI_CS];
lixianyu 0:d8f4c441e032 212 /* send data to the ht1632 */
lixianyu 0:d8f4c441e032 213 digitalWrite(cs_pin, LOW);
lixianyu 0:d8f4c441e032 214 ht1632_write_data_MSB(u8g, 3, HT1632_ID_WR, false); // Send "write to display" command
lixianyu 0:d8f4c441e032 215 ht1632_write_data_MSB(u8g, 7, page*2*cnt, false);
lixianyu 0:d8f4c441e032 216
lixianyu 0:d8f4c441e032 217 // Operating in progressive addressing mode
lixianyu 0:d8f4c441e032 218 for (addr = 0; addr < cnt; addr++)
lixianyu 0:d8f4c441e032 219 {
lixianyu 0:d8f4c441e032 220 ht1632_write_data(u8g, 8, data[addr]);
lixianyu 0:d8f4c441e032 221 ht1632_write_data(u8g, 8, data[addr+cnt]);
lixianyu 0:d8f4c441e032 222 }
lixianyu 0:d8f4c441e032 223 digitalWrite(cs_pin, HIGH);
lixianyu 0:d8f4c441e032 224 }
lixianyu 0:d8f4c441e032 225
lixianyu 0:d8f4c441e032 226 /* value is between 0...15 */
lixianyu 0:d8f4c441e032 227 void ht1632_set_contrast(u8g_t *u8g, uint8_t value)
lixianyu 0:d8f4c441e032 228 {
lixianyu 0:d8f4c441e032 229 uint8_t cs_pin = u8g->pin_list[U8G_PI_CS];
lixianyu 0:d8f4c441e032 230 digitalWrite(cs_pin, LOW);
lixianyu 0:d8f4c441e032 231 ht1632_write_data_MSB(u8g, 3, HT1632_ID_CMD, false);
lixianyu 0:d8f4c441e032 232 ht1632_write_data_MSB(u8g, 8, HT1632_CMD_PWM + value, false);
lixianyu 0:d8f4c441e032 233 digitalWrite(cs_pin, HIGH);
lixianyu 0:d8f4c441e032 234 }
lixianyu 0:d8f4c441e032 235
lixianyu 0:d8f4c441e032 236 #else
lixianyu 0:d8f4c441e032 237 void ht1632_init(u8g_t *u8g)
lixianyu 0:d8f4c441e032 238 {
lixianyu 0:d8f4c441e032 239 }
lixianyu 0:d8f4c441e032 240
lixianyu 0:d8f4c441e032 241 void ht1632_transfer_data(u8g_t *u8g, uint8_t page, uint8_t cnt, uint8_t *data)
lixianyu 0:d8f4c441e032 242 {
lixianyu 0:d8f4c441e032 243 }
lixianyu 0:d8f4c441e032 244
lixianyu 0:d8f4c441e032 245 void ht1632_set_contrast(u8g_t *u8g, uint8_t value)
lixianyu 0:d8f4c441e032 246 {
lixianyu 0:d8f4c441e032 247 }
lixianyu 0:d8f4c441e032 248
lixianyu 0:d8f4c441e032 249 #endif /* ARDUINO */
lixianyu 0:d8f4c441e032 250
lixianyu 0:d8f4c441e032 251
lixianyu 0:d8f4c441e032 252 uint8_t u8g_dev_ht1632_24x16_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
lixianyu 0:d8f4c441e032 253 {
lixianyu 0:d8f4c441e032 254 switch(msg)
lixianyu 0:d8f4c441e032 255 {
lixianyu 0:d8f4c441e032 256 case U8G_DEV_MSG_INIT:
lixianyu 0:d8f4c441e032 257 ht1632_init(u8g);
lixianyu 0:d8f4c441e032 258 break;
lixianyu 0:d8f4c441e032 259 case U8G_DEV_MSG_STOP:
lixianyu 0:d8f4c441e032 260 break;
lixianyu 0:d8f4c441e032 261 case U8G_DEV_MSG_PAGE_NEXT:
lixianyu 0:d8f4c441e032 262 {
lixianyu 0:d8f4c441e032 263 u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
lixianyu 0:d8f4c441e032 264
lixianyu 0:d8f4c441e032 265 /* current page: pb->p.page */
lixianyu 0:d8f4c441e032 266 /* ptr to the buffer: pb->buf */
lixianyu 0:d8f4c441e032 267 ht1632_transfer_data(u8g, pb->p.page, WIDTH, pb->buf);
lixianyu 0:d8f4c441e032 268 }
lixianyu 0:d8f4c441e032 269 break;
lixianyu 0:d8f4c441e032 270 case U8G_DEV_MSG_CONTRAST:
lixianyu 0:d8f4c441e032 271 /* values passed to SetContrast() are between 0 and 255, scale down to 0...15 */
lixianyu 0:d8f4c441e032 272 ht1632_set_contrast(u8g, (*(uint8_t *)arg) >> 4);
lixianyu 0:d8f4c441e032 273 return 1;
lixianyu 0:d8f4c441e032 274 }
lixianyu 0:d8f4c441e032 275 return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg);
lixianyu 0:d8f4c441e032 276 }
lixianyu 0:d8f4c441e032 277
lixianyu 0:d8f4c441e032 278 uint8_t u8g_dev_ht1632_24x16_buf[WIDTH*2] U8G_NOCOMMON ;
lixianyu 0:d8f4c441e032 279 u8g_pb_t u8g_dev_ht1632_24x16_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ht1632_24x16_buf};
lixianyu 0:d8f4c441e032 280 u8g_dev_t u8g_dev_ht1632_24x16 = { u8g_dev_ht1632_24x16_fn, &u8g_dev_ht1632_24x16_pb, u8g_com_null_fn };
lixianyu 0:d8f4c441e032 281
lixianyu 0:d8f4c441e032 282