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_lc7981_160x80.c
00001 /* 00002 00003 u8g_dev_lc7981_160x80.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 80 00041 #define PAGE_HEIGHT 8 00042 00043 00044 /* 00045 code ideas: 00046 https://github.com/vsergeev/embedded-drivers/tree/master/avr-lc7981 00047 data sheets: 00048 http://www.lcd-module.de/eng/pdf/zubehoer/lc7981.pdf 00049 http://www.lcd-module.de/pdf/grafik/w160-6.pdf 00050 */ 00051 00052 static const uint8_t u8g_dev_lc7981_160x80_init_seq[] PROGMEM = { 00053 U8G_ESC_CS(0), /* disable chip */ 00054 U8G_ESC_ADR(1), /* instruction mode */ 00055 U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/ 00056 U8G_ESC_CS(1), /* enable chip */ 00057 U8G_ESC_DLY(50), /* delay 50 ms */ 00058 00059 00060 U8G_ESC_ADR(1), /* instruction mode */ 00061 0x000, /* mode register */ 00062 U8G_ESC_ADR(0), /* data mode */ 00063 0x032, /* display on (bit 5), master mode on (bit 4), graphics mode on (bit 1)*/ 00064 00065 U8G_ESC_ADR(1), /* instruction mode */ 00066 0x001, /* character/bits per pixel pitch */ 00067 U8G_ESC_ADR(0), /* data mode */ 00068 0x007, /* 8 bits per pixel */ 00069 00070 U8G_ESC_ADR(1), /* instruction mode */ 00071 0x002, /* number of chars/byte width of the screen */ 00072 U8G_ESC_ADR(0), /* data mode */ 00073 WIDTH/8-1, /* 8 bits per pixel */ 00074 00075 U8G_ESC_ADR(1), /* instruction mode */ 00076 0x003, /* time division */ 00077 U8G_ESC_ADR(0), /* data mode */ 00078 0x07f, /* */ 00079 00080 U8G_ESC_ADR(1), /* instruction mode */ 00081 0x008, /* display start low */ 00082 U8G_ESC_ADR(0), /* data mode */ 00083 0x000, /* */ 00084 00085 U8G_ESC_ADR(1), /* instruction mode */ 00086 0x009, /* display start high */ 00087 U8G_ESC_ADR(0), /* data mode */ 00088 0x000, /* */ 00089 00090 U8G_ESC_DLY(10), /* delay 10 ms */ 00091 00092 U8G_ESC_CS(0), /* disable chip */ 00093 U8G_ESC_END /* end of sequence */ 00094 }; 00095 00096 uint8_t u8g_dev_lc7981_160x80_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) 00097 { 00098 switch(msg) 00099 { 00100 case U8G_DEV_MSG_INIT: 00101 u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_NONE); 00102 u8g_WriteEscSeqP(u8g, dev, u8g_dev_lc7981_160x80_init_seq); 00103 break; 00104 case U8G_DEV_MSG_STOP: 00105 break; 00106 case U8G_DEV_MSG_PAGE_NEXT: 00107 { 00108 uint8_t y, i; 00109 uint16_t disp_ram_adr; 00110 uint8_t *ptr; 00111 u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); 00112 00113 u8g_SetAddress(u8g, dev, 1); /* cmd mode */ 00114 u8g_SetChipSelect(u8g, dev, 1); 00115 y = pb->p.page_y0; 00116 ptr = pb->buf; 00117 disp_ram_adr = WIDTH/8; 00118 disp_ram_adr *= y; 00119 for( i = 0; i < 8; i ++ ) 00120 { 00121 u8g_SetAddress(u8g, dev, 1); /* cmd mode */ 00122 u8g_WriteByte(u8g, dev, 0x00a ); /* display ram (cursor) address low byte */ 00123 u8g_SetAddress(u8g, dev, 0); /* data mode */ 00124 u8g_WriteByte(u8g, dev, disp_ram_adr & 0x0ff ); 00125 00126 u8g_SetAddress(u8g, dev, 1); /* cmd mode */ 00127 u8g_WriteByte(u8g, dev, 0x00b ); /* display ram (cursor) address hight byte */ 00128 u8g_SetAddress(u8g, dev, 0); /* data mode */ 00129 u8g_WriteByte(u8g, dev, disp_ram_adr >> 8 ); 00130 00131 u8g_SetAddress(u8g, dev, 1); /* cmd mode */ 00132 u8g_WriteByte(u8g, dev, 0x00c ); /* write data */ 00133 u8g_SetAddress(u8g, dev, 0); /* data mode */ 00134 u8g_WriteSequence(u8g, dev, WIDTH/8, ptr); 00135 ptr += WIDTH/8; 00136 disp_ram_adr += WIDTH/8; 00137 } 00138 u8g_SetChipSelect(u8g, dev, 0); 00139 } 00140 break; 00141 } 00142 return u8g_dev_pb8h1f_base_fn(u8g, dev, msg, arg); 00143 } 00144 00145 U8G_PB_DEV(u8g_dev_lc7981_160x80_8bit, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_lc7981_160x80_fn, U8G_COM_FAST_PARALLEL); 00146 00147 00148
Generated on Tue Jul 12 2022 17:30:57 by
1.7.2