iforce2d Chris / Mbed 2 deprecated ubxDistanceMeter

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers u8g_dev_lc7981_160x80.c Source File

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