iforce2d Chris / Mbed 2 deprecated ubxDistanceMeter

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers u8g_dev_st7565_lm6059.c Source File

u8g_dev_st7565_lm6059.c

00001 /*
00002 
00003   u8g_dev_st7565_lm6059.c (Adafruit display)
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_lm6059_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   0x0a3,                        /* 0x0a2: LCD bias 1/9 (suggested for the LM6063), 0x0a3: Used by Adafruit, 0x0a2 does not work */
00051   /* the LM6059 vs LM6063, ADC and SHL have inverted settings */
00052   0x0a0,                        /* 0x0a1: ADC set to normal (suggested for the LM6059), 0x0a0: Used by Adafruit -> normal mode */
00053   0x0c8,                            /* common output mode: set scan direction normal operation/SHL Select, 0x0c0 --> SHL = 0, normal, 0x0c8 --> SHL = 1 */
00054   0x060,                        /* set display start line */
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   0x026,                        /* set V0 voltage resistor ratio to 6 (Adafruit Value, no info from LM6063 Manual) */
00066   
00067   0x0a6,                           /* display normal, bit val 0: LCD pixel off. */
00068   
00069   0x081,                        /* set contrast */
00070   0x018,                        /* contrast value*/
00071   
00072   /*0x0ac,*/                        /* indicator */
00073   /*0x000,*/                        /* disable */
00074   
00075   0x0af,                        /* display on */
00076 
00077   U8G_ESC_DLY(100),       /* delay 100 ms */
00078   0x0a5,                        /* display all points, ST7565 */
00079   U8G_ESC_DLY(100),       /* delay 100 ms */
00080   U8G_ESC_DLY(100),       /* delay 100 ms */
00081   0x0a4,                        /* normal display */
00082   U8G_ESC_CS(0),             /* disable chip */
00083   U8G_ESC_END                /* end of sequence */
00084 };
00085 
00086 static const uint8_t u8g_dev_st7565_lm6059_data_start[] PROGMEM = {
00087   U8G_ESC_ADR(0),           /* instruction mode */
00088   U8G_ESC_CS(1),             /* enable chip */
00089   0x010,        /* set upper 4 bit of the col adr to 0 */
00090   0x001,        /* set lower 4 bit of the col adr  */      
00091   U8G_ESC_END                /* end of sequence */
00092 };
00093 
00094 static const uint8_t u8g_dev_st7565_lm6059_sleep_on[] PROGMEM = {
00095   U8G_ESC_ADR(0),           /* instruction mode */
00096   U8G_ESC_CS(1),             /* enable chip */
00097   0x0ac,        /* static indicator off */
00098   0x000,                        /* indicator register set (not sure if this is required) */
00099   0x0ae,        /* display off */      
00100   0x0a5,        /* all points on */      
00101   U8G_ESC_CS(1),             /* disable chip */
00102   U8G_ESC_END                /* end of sequence */
00103 };
00104 
00105 static const uint8_t u8g_dev_st7565_lm6059_sleep_off[] PROGMEM = {
00106   U8G_ESC_ADR(0),           /* instruction mode */
00107   U8G_ESC_CS(1),             /* enable chip */
00108   0x0a4,        /* all points off */      
00109   0x0af,        /* display on */      
00110   U8G_ESC_DLY(50),       /* delay 50 ms */
00111   U8G_ESC_CS(1),             /* disable chip */
00112   U8G_ESC_END                /* end of sequence */
00113 };
00114 
00115 
00116 uint8_t u8g_dev_st7565_lm6059_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
00117 {
00118   switch(msg)
00119   {
00120     case U8G_DEV_MSG_INIT:
00121       u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS);
00122       u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_lm6059_init_seq);
00123       break;
00124     case U8G_DEV_MSG_STOP:
00125       break;
00126     case U8G_DEV_MSG_PAGE_NEXT:
00127       {
00128         u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
00129         u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_lm6059_data_start);    
00130         u8g_WriteByte(u8g, dev, 0x0b0 | pb->p.page); /* select current page (ST7565R) */
00131         u8g_SetAddress(u8g, dev, 1);           /* data mode */
00132         if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
00133           return 0;
00134         u8g_SetChipSelect(u8g, dev, 0);
00135       }
00136       break;
00137     case U8G_DEV_MSG_CONTRAST:
00138       u8g_SetChipSelect(u8g, dev, 1);
00139       u8g_SetAddress(u8g, dev, 0);          /* instruction mode */
00140       u8g_WriteByte(u8g, dev, 0x081);
00141       u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2);
00142       u8g_SetChipSelect(u8g, dev, 0);      
00143       return 1;
00144     case U8G_DEV_MSG_SLEEP_ON:
00145       u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_lm6059_sleep_on);    
00146       return 1;
00147     case U8G_DEV_MSG_SLEEP_OFF:
00148       u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_lm6059_sleep_off);    
00149       return 1;
00150   }
00151   return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
00152 }
00153 
00154 uint8_t u8g_dev_st7565_lm6059_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
00155 {
00156   switch(msg)
00157   {
00158     case U8G_DEV_MSG_INIT:
00159       u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS);
00160       u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_lm6059_init_seq);
00161       break;
00162     case U8G_DEV_MSG_STOP:
00163       break;
00164     case U8G_DEV_MSG_PAGE_NEXT:
00165       {
00166         u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
00167     
00168         u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_lm6059_data_start);    
00169         u8g_WriteByte(u8g, dev, 0x0b0 | (2*pb->p.page)); /* select current page (ST7565R) */
00170         u8g_SetAddress(u8g, dev, 1);           /* data mode */
00171     u8g_WriteSequence(u8g, dev, pb->width, pb->buf); 
00172         u8g_SetChipSelect(u8g, dev, 0);
00173 
00174     u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_lm6059_data_start);    
00175         u8g_WriteByte(u8g, dev, 0x0b0 | (2*pb->p.page+1)); /* select current page (ST7565R) */
00176         u8g_SetAddress(u8g, dev, 1);           /* data mode */
00177     u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); 
00178         u8g_SetChipSelect(u8g, dev, 0);
00179       }
00180       break;
00181     case U8G_DEV_MSG_CONTRAST:
00182       u8g_SetChipSelect(u8g, dev, 1);
00183       u8g_SetAddress(u8g, dev, 0);          /* instruction mode */
00184       u8g_WriteByte(u8g, dev, 0x081);
00185       u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2);
00186       u8g_SetChipSelect(u8g, dev, 0);      
00187       return 1;
00188     case U8G_DEV_MSG_SLEEP_ON:
00189       u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_lm6059_sleep_on);    
00190       return 1;
00191     case U8G_DEV_MSG_SLEEP_OFF:
00192       u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_lm6059_sleep_off);    
00193       return 1;
00194   }
00195   return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg);
00196 }
00197 
00198 U8G_PB_DEV(u8g_dev_st7565_lm6059_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_lm6059_fn, U8G_COM_SW_SPI);
00199 U8G_PB_DEV(u8g_dev_st7565_lm6059_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_lm6059_fn, U8G_COM_HW_SPI);
00200 
00201 
00202 uint8_t u8g_dev_st7565_lm6059_2x_buf[WIDTH*2] U8G_NOCOMMON ; 
00203 u8g_pb_t u8g_dev_st7565_lm6059_2x_pb = { {16, HEIGHT, 0, 0, 0},  WIDTH, u8g_dev_st7565_lm6059_2x_buf}; 
00204 u8g_dev_t u8g_dev_st7565_lm6059_2x_sw_spi = { u8g_dev_st7565_lm6059_2x_fn, &u8g_dev_st7565_lm6059_2x_pb, U8G_COM_SW_SPI };
00205 u8g_dev_t u8g_dev_st7565_lm6059_2x_hw_spi = { u8g_dev_st7565_lm6059_2x_fn, &u8g_dev_st7565_lm6059_2x_pb, U8G_COM_HW_SPI };
00206