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_st7565_64128n.c
00001 /* 00002 00003 u8g_dev_st7565_64128n.c (Displaytech) 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 128 00040 #define HEIGHT 64 00041 #define PAGE_HEIGHT 8 00042 00043 /* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */ 00044 static const uint8_t u8g_dev_st7565_64128n_init_seq[] PROGMEM = { 00045 U8G_ESC_CS(0), /* disable chip */ 00046 U8G_ESC_ADR(0), /* instruction mode */ 00047 U8G_ESC_CS(1), /* enable chip */ 00048 U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/ 00049 00050 0x0A2, /* 0x0a2: LCD bias 1/9 (according to Displaytech 64128N datasheet) */ 00051 0x0A0, /* Normal ADC Select (according to Displaytech 64128N datasheet) */ 00052 00053 0x0c8, /* common output mode: set scan direction normal operation/SHL Select, 0x0c0 --> SHL = 0, normal, 0x0c8 --> SHL = 1 */ 00054 0x040, /* Display start line for Displaytech 64128N */ 00055 00056 0x028 | 0x04, /* power control: turn on voltage converter */ 00057 U8G_ESC_DLY(50), /* delay 50 ms */ 00058 00059 0x028 | 0x06, /* power control: turn on voltage regulator */ 00060 U8G_ESC_DLY(50), /* delay 50 ms */ 00061 00062 0x028 | 0x07, /* power control: turn on voltage follower */ 00063 U8G_ESC_DLY(50), /* delay 50 ms */ 00064 00065 0x010, /* Set V0 voltage resistor ratio. Setting for controlling brightness of Displaytech 64128N */ 00066 00067 0x0a6, /* display normal, bit val 0: LCD pixel off. */ 00068 00069 0x081, /* set contrast */ 00070 0x01e, /* Contrast value. Setting for controlling brightness of Displaytech 64128N */ 00071 00072 00073 0x0af, /* display on */ 00074 00075 U8G_ESC_DLY(100), /* delay 100 ms */ 00076 0x0a5, /* display all points, ST7565 */ 00077 U8G_ESC_DLY(100), /* delay 100 ms */ 00078 U8G_ESC_DLY(100), /* delay 100 ms */ 00079 0x0a4, /* normal display */ 00080 U8G_ESC_CS(0), /* disable chip */ 00081 U8G_ESC_END /* end of sequence */ 00082 }; 00083 00084 static const uint8_t u8g_dev_st7565_64128n_data_start[] PROGMEM = { 00085 U8G_ESC_ADR(0), /* instruction mode */ 00086 U8G_ESC_CS(1), /* enable chip */ 00087 0x010, /* set upper 4 bit of the col adr to 0x10 */ 00088 0x000, /* set lower 4 bit of the col adr to 0x00. Changed for DisplayTech 64128N */ 00089 U8G_ESC_END /* end of sequence */ 00090 }; 00091 00092 static const uint8_t u8g_dev_st7565_64128n_sleep_on[] PROGMEM = { 00093 U8G_ESC_ADR(0), /* instruction mode */ 00094 U8G_ESC_CS(1), /* enable chip */ 00095 0x0ac, /* static indicator off */ 00096 0x000, /* indicator register set (not sure if this is required) */ 00097 0x0ae, /* display off */ 00098 0x0a5, /* all points on */ 00099 U8G_ESC_CS(1), /* disable chip */ 00100 U8G_ESC_END /* end of sequence */ 00101 }; 00102 00103 static const uint8_t u8g_dev_st7565_64128n_sleep_off[] PROGMEM = { 00104 U8G_ESC_ADR(0), /* instruction mode */ 00105 U8G_ESC_CS(1), /* enable chip */ 00106 0x0a4, /* all points off */ 00107 0x0af, /* display on */ 00108 U8G_ESC_DLY(50), /* delay 50 ms */ 00109 U8G_ESC_CS(1), /* disable chip */ 00110 U8G_ESC_END /* end of sequence */ 00111 }; 00112 00113 uint8_t u8g_dev_st7565_64128n_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) 00114 { 00115 switch(msg) 00116 { 00117 case U8G_DEV_MSG_INIT: 00118 u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS); 00119 u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_init_seq); 00120 break; 00121 case U8G_DEV_MSG_STOP: 00122 break; 00123 case U8G_DEV_MSG_PAGE_NEXT: 00124 { 00125 u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); 00126 u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_data_start); 00127 u8g_WriteByte(u8g, dev, 0x0b0 | pb->p.page); /* select current page (ST7565R) */ 00128 u8g_SetAddress(u8g, dev, 1); /* data mode */ 00129 if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 ) 00130 return 0; 00131 u8g_SetChipSelect(u8g, dev, 0); 00132 } 00133 break; 00134 case U8G_DEV_MSG_CONTRAST: 00135 u8g_SetChipSelect(u8g, dev, 1); 00136 u8g_SetAddress(u8g, dev, 0); /* instruction mode */ 00137 u8g_WriteByte(u8g, dev, 0x081); 00138 u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); 00139 u8g_SetChipSelect(u8g, dev, 0); 00140 return 1; 00141 case U8G_DEV_MSG_SLEEP_ON: 00142 u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_sleep_on); 00143 return 1; 00144 case U8G_DEV_MSG_SLEEP_OFF: 00145 u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_sleep_off); 00146 return 1; 00147 } 00148 return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); 00149 } 00150 00151 uint8_t u8g_dev_st7565_64128n_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) 00152 { 00153 switch(msg) 00154 { 00155 case U8G_DEV_MSG_INIT: 00156 u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS); 00157 u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_init_seq); 00158 break; 00159 case U8G_DEV_MSG_STOP: 00160 break; 00161 case U8G_DEV_MSG_PAGE_NEXT: 00162 { 00163 u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); 00164 00165 u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_data_start); 00166 u8g_WriteByte(u8g, dev, 0x0b0 | (2*pb->p.page)); /* select current page (ST7565R) */ 00167 u8g_SetAddress(u8g, dev, 1); /* data mode */ 00168 u8g_WriteSequence(u8g, dev, pb->width, pb->buf); 00169 u8g_SetChipSelect(u8g, dev, 0); 00170 00171 u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_data_start); 00172 u8g_WriteByte(u8g, dev, 0x0b0 | (2*pb->p.page+1)); /* select current page (ST7565R) */ 00173 u8g_SetAddress(u8g, dev, 1); /* data mode */ 00174 u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); 00175 u8g_SetChipSelect(u8g, dev, 0); 00176 } 00177 break; 00178 case U8G_DEV_MSG_CONTRAST: 00179 u8g_SetChipSelect(u8g, dev, 1); 00180 u8g_SetAddress(u8g, dev, 0); /* instruction mode */ 00181 u8g_WriteByte(u8g, dev, 0x081); 00182 u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); 00183 u8g_SetChipSelect(u8g, dev, 0); 00184 return 1; 00185 case U8G_DEV_MSG_SLEEP_ON: 00186 u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_sleep_on); 00187 return 1; 00188 case U8G_DEV_MSG_SLEEP_OFF: 00189 u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_sleep_off); 00190 return 1; 00191 } 00192 return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); 00193 } 00194 00195 U8G_PB_DEV(u8g_dev_st7565_64128n_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_64128n_fn, U8G_COM_SW_SPI); 00196 U8G_PB_DEV(u8g_dev_st7565_64128n_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_64128n_fn, U8G_COM_HW_SPI); 00197 U8G_PB_DEV(u8g_dev_st7565_64128n_parallel, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_64128n_fn, U8G_COM_PARALLEL); 00198 00199 uint8_t u8g_dev_st7565_64128n_2x_buf[WIDTH*2] U8G_NOCOMMON ; 00200 u8g_pb_t u8g_dev_st7565_64128n_2x_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_st7565_64128n_2x_buf}; 00201 u8g_dev_t u8g_dev_st7565_64128n_2x_sw_spi = { u8g_dev_st7565_64128n_2x_fn, &u8g_dev_st7565_64128n_2x_pb, U8G_COM_SW_SPI }; 00202 u8g_dev_t u8g_dev_st7565_64128n_2x_hw_spi = { u8g_dev_st7565_64128n_2x_fn, &u8g_dev_st7565_64128n_2x_pb, U8G_COM_HW_SPI }; 00203 u8g_dev_t u8g_dev_st7565_64128n_2x_hw_parallel = { u8g_dev_st7565_64128n_2x_fn, &u8g_dev_st7565_64128n_2x_pb, U8G_COM_PARALLEL }; 00204
Generated on Tue Jul 12 2022 17:30:57 by
1.7.2