Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
u8g_dev_uc1610_dogxl160.c
00001 /* 00002 00003 u8g_dev_uc1610_dogxl160.c 00004 00005 Universal 8bit Graphics Library 00006 00007 Copyright (c) 2011, olikraus@gmail.com 00008 All rights reserved. 00009 00010 Redistribution and use in source and binary forms, with or without modification, 00011 are permitted provided that the following conditions are met: 00012 00013 * Redistributions of source code must retain the above copyright notice, this list 00014 of conditions and the following disclaimer. 00015 00016 * Redistributions in binary form must reproduce the above copyright notice, this 00017 list of conditions and the following disclaimer in the documentation and/or other 00018 materials provided with the distribution. 00019 00020 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 00021 CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 00022 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 00023 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00024 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 00025 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00026 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 00027 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00028 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00029 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 00030 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00031 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 00032 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00033 00034 00035 */ 00036 00037 #include "u8g.h" 00038 00039 #define WIDTH 160 00040 #define HEIGHT 104 00041 00042 static const uint8_t u8g_dev_uc1610_dogxl160_init_seq[] PROGMEM = { 00043 U8G_ESC_CS(0), /* disable chip */ 00044 U8G_ESC_ADR(0), /* instruction mode */ 00045 U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */ 00046 U8G_ESC_CS(1), /* enable chip */ 00047 0x0f1, /* set display height-1 */ 00048 0x067, /* */ 00049 0x0c0, /* SEG & COM normal */ 00050 0x040, /* set display start line */ 00051 0x050, /* */ 00052 0x02b, /* set panelloading */ 00053 0x0eb, /* set bias 1/2 */ 00054 0x081, /* set contrast */ 00055 0x05f, /* */ 00056 0x089, /* set auto increment */ 00057 0x0a6, /* normal pixel mode */ 00058 0x0d3, /* 0xd3=40% RMS separation for gray levels */ 00059 0x0af, /* display on */ 00060 U8G_ESC_DLY(100), /* delay 100 ms */ 00061 0x0a5, /* display all points, ST7565, UC1610 */ 00062 U8G_ESC_DLY(100), /* delay 100 ms */ 00063 U8G_ESC_DLY(100), /* delay 100 ms */ 00064 0x0a4, /* normal display */ 00065 00066 00067 U8G_ESC_CS(0), /* disable chip */ 00068 U8G_ESC_END /* end of sequence */ 00069 }; 00070 00071 static const uint8_t u8g_dev_uc1610_dogxl160_data_start[] PROGMEM = { 00072 U8G_ESC_ADR(0), /* instruction mode */ 00073 U8G_ESC_CS(1), /* enable chip */ 00074 0x010, /* set upper 4 bit of the col adr to 0 */ 00075 0x000, /* set lower 4 bit of the col adr to 0 */ 00076 U8G_ESC_END /* end of sequence */ 00077 }; 00078 00079 static uint8_t u8g_dev_1to2(uint8_t n) 00080 { 00081 register uint8_t a,b,c; 00082 a = n; 00083 a &= 1; 00084 n <<= 1; 00085 b = n; 00086 b &= 4; 00087 n <<= 1; 00088 c = n; 00089 c &= 16; 00090 n <<= 1; 00091 n &= 64; 00092 n |= a; 00093 n |= b; 00094 n |= c; 00095 n |= n << 1; 00096 return n; 00097 } 00098 00099 uint8_t u8g_dev_uc1610_dogxl160_bw_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) 00100 { 00101 switch(msg) 00102 { 00103 case U8G_DEV_MSG_INIT: 00104 u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); 00105 u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_init_seq); 00106 break; 00107 case U8G_DEV_MSG_STOP: 00108 break; 00109 case U8G_DEV_MSG_PAGE_NEXT: 00110 { 00111 int i; 00112 u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); 00113 u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start); 00114 u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*2) ); /* select current page 1/2 (UC1610) */ 00115 u8g_SetAddress(u8g, dev, 1); /* data mode */ 00116 for( i = 0; i < WIDTH; i++ ) 00117 { 00118 u8g_WriteByte(u8g, dev, u8g_dev_1to2( ((uint8_t *)(pb->buf))[i] ) ); 00119 } 00120 00121 u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start); 00122 u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*2+1) ); /* select current page 2/2 (UC1610) */ 00123 u8g_SetAddress(u8g, dev, 1); /* data mode */ 00124 for( i = 0; i < WIDTH; i++ ) 00125 { 00126 u8g_WriteByte(u8g, dev, u8g_dev_1to2( ((uint8_t *)(pb->buf))[i] >> 4 ) ); 00127 } 00128 00129 u8g_SetChipSelect(u8g, dev, 0); 00130 } 00131 break; 00132 case U8G_DEV_MSG_CONTRAST: 00133 u8g_SetChipSelect(u8g, dev, 1); 00134 u8g_SetAddress(u8g, dev, 0); /* instruction mode */ 00135 u8g_WriteByte(u8g, dev, 0x081); 00136 u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1); 00137 u8g_SetChipSelect(u8g, dev, 0); 00138 return 1; 00139 } 00140 return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); 00141 } 00142 00143 uint8_t u8g_dev_uc1610_dogxl160_gr_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) 00144 { 00145 switch(msg) 00146 { 00147 case U8G_DEV_MSG_INIT: 00148 u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); 00149 u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_init_seq); 00150 break; 00151 case U8G_DEV_MSG_STOP: 00152 break; 00153 case U8G_DEV_MSG_PAGE_NEXT: 00154 { 00155 u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); 00156 u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start); 00157 u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page) ); /* select current page (UC1610) */ 00158 u8g_SetAddress(u8g, dev, 1); /* data mode */ 00159 if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 ) 00160 return 0; 00161 u8g_SetChipSelect(u8g, dev, 0); 00162 } 00163 break; 00164 case U8G_DEV_MSG_CONTRAST: 00165 u8g_SetChipSelect(u8g, dev, 1); 00166 u8g_SetAddress(u8g, dev, 0); /* instruction mode */ 00167 u8g_WriteByte(u8g, dev, 0x081); 00168 u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1); 00169 u8g_SetChipSelect(u8g, dev, 0); 00170 return 1; 00171 } 00172 return u8g_dev_pb8v2_base_fn(u8g, dev, msg, arg); 00173 } 00174 00175 uint8_t u8g_dev_uc1610_dogxl160_2x_bw_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) 00176 { 00177 switch(msg) 00178 { 00179 case U8G_DEV_MSG_INIT: 00180 u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); 00181 u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_init_seq); 00182 break; 00183 case U8G_DEV_MSG_STOP: 00184 break; 00185 case U8G_DEV_MSG_PAGE_NEXT: 00186 { 00187 int i; 00188 u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); 00189 00190 u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start); 00191 u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*4) ); /* select current page 1/2 (UC1610) */ 00192 u8g_SetAddress(u8g, dev, 1); /* data mode */ 00193 for( i = 0; i < WIDTH; i++ ) 00194 { 00195 u8g_WriteByte(u8g, dev, u8g_dev_1to2( ((uint8_t *)(pb->buf))[i] ) ); 00196 } 00197 00198 u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start); 00199 u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*4+1) ); /* select current page 2/2 (UC1610) */ 00200 u8g_SetAddress(u8g, dev, 1); /* data mode */ 00201 for( i = 0; i < WIDTH; i++ ) 00202 { 00203 u8g_WriteByte(u8g, dev, u8g_dev_1to2( ((uint8_t *)(pb->buf))[i] >> 4 ) ); 00204 } 00205 00206 u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start); 00207 u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*4+2) ); /* select current page 1/2 (UC1610) */ 00208 u8g_SetAddress(u8g, dev, 1); /* data mode */ 00209 for( i = 0; i < WIDTH; i++ ) 00210 { 00211 u8g_WriteByte(u8g, dev, u8g_dev_1to2( ((uint8_t *)((uint8_t *)(pb->buf)+WIDTH))[i] ) ); 00212 } 00213 00214 u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start); 00215 u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*4+3) ); /* select current page 2/2 (UC1610) */ 00216 u8g_SetAddress(u8g, dev, 1); /* data mode */ 00217 for( i = 0; i < WIDTH; i++ ) 00218 { 00219 u8g_WriteByte(u8g, dev, u8g_dev_1to2( ((uint8_t *)((uint8_t *)(pb->buf)+WIDTH))[i] >> 4 ) ); 00220 } 00221 00222 u8g_SetChipSelect(u8g, dev, 0); 00223 } 00224 break; 00225 case U8G_DEV_MSG_CONTRAST: 00226 u8g_SetChipSelect(u8g, dev, 1); 00227 u8g_SetAddress(u8g, dev, 0); /* instruction mode */ 00228 u8g_WriteByte(u8g, dev, 0x081); 00229 u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1); 00230 u8g_SetChipSelect(u8g, dev, 0); 00231 return 1; 00232 } 00233 return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); 00234 } 00235 00236 uint8_t u8g_dev_uc1610_dogxl160_2x_gr_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) 00237 { 00238 switch(msg) 00239 { 00240 case U8G_DEV_MSG_INIT: 00241 u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); 00242 u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_init_seq); 00243 break; 00244 case U8G_DEV_MSG_STOP: 00245 break; 00246 case U8G_DEV_MSG_PAGE_NEXT: 00247 { 00248 u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); 00249 00250 u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start); 00251 u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*2) ); /* select current page (UC1610) */ 00252 u8g_SetAddress(u8g, dev, 1); /* data mode */ 00253 if ( u8g_WriteSequence(u8g, dev, WIDTH, pb->buf) == 0 ) 00254 return 0; 00255 00256 u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start); 00257 u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*2+1) ); /* select current page (UC1610) */ 00258 u8g_SetAddress(u8g, dev, 1); /* data mode */ 00259 if ( u8g_WriteSequence(u8g, dev, WIDTH, (uint8_t *)(pb->buf)+WIDTH) == 0 ) 00260 return 0; 00261 00262 u8g_SetChipSelect(u8g, dev, 0); 00263 } 00264 break; 00265 case U8G_DEV_MSG_CONTRAST: 00266 u8g_SetChipSelect(u8g, dev, 1); 00267 u8g_SetAddress(u8g, dev, 0); /* instruction mode */ 00268 u8g_WriteByte(u8g, dev, 0x081); 00269 u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1); 00270 u8g_SetChipSelect(u8g, dev, 0); 00271 return 1; 00272 } 00273 return u8g_dev_pb16v2_base_fn(u8g, dev, msg, arg); 00274 } 00275 00276 U8G_PB_DEV(u8g_dev_uc1610_dogxl160_bw_sw_spi, WIDTH, HEIGHT, 8, u8g_dev_uc1610_dogxl160_bw_fn, U8G_COM_SW_SPI); 00277 U8G_PB_DEV(u8g_dev_uc1610_dogxl160_bw_hw_spi, WIDTH, HEIGHT, 8, u8g_dev_uc1610_dogxl160_bw_fn, U8G_COM_HW_SPI); 00278 00279 U8G_PB_DEV(u8g_dev_uc1610_dogxl160_gr_sw_spi, WIDTH, HEIGHT, 4, u8g_dev_uc1610_dogxl160_gr_fn, U8G_COM_SW_SPI); 00280 U8G_PB_DEV(u8g_dev_uc1610_dogxl160_gr_hw_spi, WIDTH, HEIGHT, 4, u8g_dev_uc1610_dogxl160_gr_fn, U8G_COM_HW_SPI); 00281 00282 uint8_t u8g_dev_uc1610_dogxl160_2x_bw_buf[WIDTH*2] U8G_NOCOMMON ; 00283 u8g_pb_t u8g_dev_uc1610_dogxl160_2x_bw_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_uc1610_dogxl160_2x_bw_buf}; 00284 u8g_dev_t u8g_dev_uc1610_dogxl160_2x_bw_sw_spi = { u8g_dev_uc1610_dogxl160_2x_bw_fn, &u8g_dev_uc1610_dogxl160_2x_bw_pb, U8G_COM_SW_SPI }; 00285 u8g_dev_t u8g_dev_uc1610_dogxl160_2x_bw_hw_spi = { u8g_dev_uc1610_dogxl160_2x_bw_fn, &u8g_dev_uc1610_dogxl160_2x_bw_pb, U8G_COM_HW_SPI }; 00286 00287 uint8_t u8g_dev_uc1610_dogxl160_2x_gr_buf[WIDTH*2] U8G_NOCOMMON ; 00288 u8g_pb_t u8g_dev_uc1610_dogxl160_2x_gr_pb = { {8, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_uc1610_dogxl160_2x_gr_buf}; 00289 u8g_dev_t u8g_dev_uc1610_dogxl160_2x_gr_sw_spi = { u8g_dev_uc1610_dogxl160_2x_gr_fn, &u8g_dev_uc1610_dogxl160_2x_gr_pb, U8G_COM_SW_SPI }; 00290 u8g_dev_t u8g_dev_uc1610_dogxl160_2x_gr_hw_spi = { u8g_dev_uc1610_dogxl160_2x_gr_fn, &u8g_dev_uc1610_dogxl160_2x_gr_pb, U8G_COM_HW_SPI }; 00291
Generated on Tue Jul 12 2022 17:30:57 by
1.7.2