Contiki 2.6

lcd.h

Go to the documentation of this file.
00001 /*
00002  *  Copyright (c) 2008  Swedish Institute of Computer Science
00003  *  All rights reserved.
00004  *
00005  *  Redistribution and use in source and binary forms, with or without
00006  *  modification, are permitted provided that the following conditions are met:
00007  *
00008  *  * Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  *  * Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in
00012  *    the documentation and/or other materials provided with the
00013  *    distribution.
00014  *  * Neither the name of the copyright holders nor the names of
00015  *    contributors may be used to endorse or promote products derived
00016  *    from this software without specific prior written permission.
00017  *
00018  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00019  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00020  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00021  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00022  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00023  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00024  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00025  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00026  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00027  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00028  * POSSIBILITY OF SUCH DAMAGE.
00029  */
00030 /**
00031  * \file
00032  *
00033  * \brief
00034  *      This file provides Raven LCD support.
00035  *
00036  * \author
00037  *      Mike Vidales mavida404@gmail.com
00038  *
00039  */
00040 
00041 #ifndef __LCD_H__
00042 #define __LCD_H__
00043 
00044 #include <avr/io.h>
00045 #include <avr/interrupt.h>
00046 #include <avr/pgmspace.h>
00047 
00048 #include <stdint.h>
00049 #include <stdbool.h>
00050 #include <stdlib.h>
00051 #include <stdio.h>
00052 #include <string.h>
00053 
00054 
00055 #define LCD_SYMBOL_FISRT      0
00056 #define LCD_SYMBOL_COUNT     34
00057 
00058 /* Duplicate usage of segments */
00059 #define LCD_SYMBOL_ARR_UP  LCD_SYMBOL_ENV_OP
00060 #define LCD_SYMBOL_ARR_DN  LCD_SYMBOL_ENV_CL
00061 
00062 #define LCD_CLCK_FRQ    32768
00063 
00064 /** @name Constant defines for making seg_map[] table */
00065 /** @{ */
00066 /*
00067  - a -
00068  f   b
00069  |-g-|
00070  e   c
00071  - d -
00072 */
00073 #define NUM_LCD_SYMBOL_A 0x01
00074 #define NUM_LCD_SYMBOL_B 0x02
00075 #define NUM_LCD_SYMBOL_C 0x04
00076 #define NUM_LCD_SYMBOL_D 0x08
00077 #define NUM_LCD_SYMBOL_E 0x10
00078 #define NUM_LCD_SYMBOL_F 0x20
00079 #define NUM_LCD_SYMBOL_G 0x40
00080 /** @} */
00081 
00082 /** @name Constant defines for indexing seg_map[] table */
00083 /** @{ */
00084 #define LCD_SEV_SEG_INDEX_0     (0)
00085 #define LCD_SEV_SEG_INDEX_1     (1)
00086 #define LCD_SEV_SEG_INDEX_2     (2)
00087 #define LCD_SEV_SEG_INDEX_3     (3)
00088 #define LCD_SEV_SEG_INDEX_4     (4)
00089 #define LCD_SEV_SEG_INDEX_5     (5)
00090 #define LCD_SEV_SEG_INDEX_6     (6)
00091 #define LCD_SEV_SEG_INDEX_7     (7)
00092 #define LCD_SEV_SEG_INDEX_8     (8)
00093 #define LCD_SEV_SEG_INDEX_9     (9)
00094 #define LCD_SEV_SEG_INDEX_A     (10)
00095 #define LCD_SEV_SEG_INDEX_B     (11)
00096 #define LCD_SEV_SEG_INDEX_C     (12)
00097 #define LCD_SEV_SEG_INDEX_D     (13)
00098 #define LCD_SEV_SEG_INDEX_E     (14)
00099 #define LCD_SEV_SEG_INDEX_F     (15)
00100 #define LCD_SEV_SEG_INDEX_SPACE (16)
00101 #define LCD_SEV_SEG_INDEX_MINUS (17)
00102 /** @} */
00103 
00104 #define lcd_symbol_set_all() lcd_symbol_set_group(0, sizeof(lcd_symbol_chart))
00105 #define lcd_symbol_clr_all() lcd_symbol_clr_group(0, sizeof(lcd_symbol_chart))
00106 
00107 typedef enum {
00108     LCD_NUM_PADDING_ZERO,
00109     LCD_NUM_PADDING_SPACE
00110 } lcd_padding_t;
00111 
00112 typedef enum {
00113 /*  name               = (bit_number << bit_number_offset) | mem_offset*/
00114     /* Raven */
00115     LCD_SYMBOL_RAVEN   = (7<<5) |  3,
00116 
00117     /* Audio */
00118     LCD_SYMBOL_BELL    = (2<<5) | 17,
00119     LCD_SYMBOL_TONE    = (6<<5) | 17,
00120     LCD_SYMBOL_MIC     = (3<<5) |  3,
00121     LCD_SYMBOL_SPEAKER = (2<<5) | 18,
00122 
00123     /* Status */
00124     LCD_SYMBOL_KEY     = (3<<5) |  2,
00125     LCD_SYMBOL_ATT     = (7<<5) |  2,
00126 
00127     /* Time */
00128     LCD_SYMBOL_SUN     = (6<<5) | 13,
00129     LCD_SYMBOL_MOON    = (6<<5) |  3,
00130     LCD_SYMBOL_AM      = (2<<5) | 15,
00131     LCD_SYMBOL_PM      = (6<<5) | 15,
00132 
00133     /* Radio commuication status */
00134     LCD_SYMBOL_RX      = (6<<5) | 18,
00135     LCD_SYMBOL_TX      = (5<<5) | 13,
00136     LCD_SYMBOL_IP      = (7<<5) | 13,
00137     LCD_SYMBOL_PAN     = (7<<5) | 18,
00138     LCD_SYMBOL_ZLINK   = (5<<5) |  8,
00139     LCD_SYMBOL_ZIGBEE  = (5<<5) |  3,
00140 
00141     /* Antenna status */
00142     LCD_SYMBOL_ANT_FOOT= (5<<5) | 18,
00143     LCD_SYMBOL_ANT_SIG1= (3<<5) |  0,
00144     LCD_SYMBOL_ANT_SIG2= (7<<5) |  0,
00145     LCD_SYMBOL_ANT_SIG3= (3<<5) |  1,
00146     LCD_SYMBOL_ANT_DIS = (7<<5) |  1,
00147 
00148     /* Battery status */
00149     LCD_SYMBOL_BAT_CONT= (4<<5) | 18,
00150     LCD_SYMBOL_BAT_CAP1= (4<<5) |  3,
00151     LCD_SYMBOL_BAT_CAP2= (4<<5) |  8,
00152     LCD_SYMBOL_BAT_CAP3= (4<<5) | 13,
00153 
00154     /* Envelope status */
00155     LCD_SYMBOL_ENV_OP  = (6<<5) |  8,
00156     LCD_SYMBOL_ENV_CL  = (0<<5) |  4,
00157     LCD_SYMBOL_ENV_MAIN= (2<<5) |  4,
00158 
00159     /* Temperature */
00160     LCD_SYMBOL_C       = (6<<5) | 16,
00161     LCD_SYMBOL_F       = (2<<5) | 16,
00162 
00163     /* Numeric */
00164     LCD_SYMBOL_MINUS   = (7<<5) |  8,
00165     LCD_SYMBOL_DOT     = (4<<5) |  4,
00166     LCD_SYMBOL_COL     = (6<<5) |  4,
00167 } lcd_symbol_t;
00168 
00169 typedef enum {
00170     LCD_WAVE_DEFAULT   = 0,
00171     LCD_WAVE_LOW_POWER = 1
00172 } lcd_wave_t;
00173 
00174 typedef enum {
00175     LCD_BUFFER_ON  = 0,
00176     LCD_BUFFER_OFF = 1
00177 } lcd_buffer_t;
00178 
00179 typedef enum {
00180     LCD_BLANKING_OFF = 0,
00181     LCD_BLANKING_ON  = 1
00182 } lcd_blanking_t;
00183 
00184 typedef enum {
00185     LCD_CLOCK_SYSTEM = 0,
00186     LCD_CLOCK_EXTERN = 1
00187 } lcd_clock_t;
00188 
00189 typedef enum {
00190     LCD_BIAS_THIRD = 0,
00191     LCD_BIAS_HALF  = 1
00192 } lcd_bias_t;
00193 
00194 typedef enum {
00195     LCD_PRESCL_16   = 0x0,
00196     LCD_PRESCL_64   = 0x1,
00197     LCD_PRESCL_128  = 0x2,
00198     LCD_PRESCL_256  = 0x3,
00199     LCD_PRESCL_512  = 0x4,
00200     LCD_PRESCL_1024 = 0x5,
00201     LCD_PRESCL_2048 = 0x6,
00202     LCD_PRESCL_4096 = 0x7,
00203 } lcd_prescl_t;
00204 
00205 typedef enum {
00206     LCD_DIV_1 = 0,
00207     LCD_DIV_2 = 1,
00208     LCD_DIV_3 = 2,
00209     LCD_DIV_4 = 3,
00210     LCD_DIV_5 = 4,
00211     LCD_DIV_6 = 5,
00212     LCD_DIV_7 = 6,
00213     LCD_DIV_8 = 7
00214 } lcd_div_t;
00215 
00216 /** Bit LCDDC2:0 and LCMDT */
00217 typedef enum {
00218     LCD_DRIVE_300  = 0x0,
00219     LCD_DRIVE_70   = 0x2,
00220     LCD_DRIVE_150  = 0x4,
00221     LCD_DRIVE_450  = 0x6,
00222     LCD_DRIVE_575  = 0x8,
00223     LCD_DRIVE_850  = 0xA,
00224     LCD_DRIVE_1150 = 0xC,
00225     LCD_DRIVE_HALF = 0xE,
00226     LCD_DRIVE_FULL = 0xF
00227 } lcd_drive_t;
00228 
00229 typedef enum {
00230     LCD_CONTRAST_2_60 = 0x0,
00231     LCD_CONTRAST_2_65 = 0x1,
00232     LCD_CONTRAST_2_70 = 0x2,
00233     LCD_CONTRAST_2_75 = 0x3,
00234     LCD_CONTRAST_2_80 = 0x4,
00235     LCD_CONTRAST_2_85 = 0x5,
00236     LCD_CONTRAST_2_90 = 0x6,
00237     LCD_CONTRAST_2_95 = 0x7,
00238     LCD_CONTRAST_3_00 = 0x8,
00239     LCD_CONTRAST_3_05 = 0x9,
00240     LCD_CONTRAST_3_10 = 0xA,
00241     LCD_CONTRAST_3_15 = 0xB,
00242     LCD_CONTRAST_3_20 = 0xC,
00243     LCD_CONTRAST_3_25 = 0xD,
00244     LCD_CONTRAST_3_30 = 0xE,
00245     LCD_CONTRAST_3_35 = 0xF
00246 } lcd_contrast_t;
00247 
00248 typedef struct {
00249     union {
00250         struct {
00251             unsigned int    blanking: 1;
00252             unsigned int            : 1;
00253             unsigned int    buffer  : 1;
00254             unsigned int            : 3;
00255             unsigned int    wave    : 1;
00256             unsigned int            : 1;
00257         };
00258         uint8_t             lcdcra;
00259     };
00260     union {
00261         struct {
00262             unsigned int            : 6;
00263             unsigned int    bias    : 1;
00264             unsigned int    clock   : 1;
00265         };
00266         uint8_t             lcdcrb;
00267     };
00268     union {
00269         struct {
00270             unsigned int    div     : 3;
00271             unsigned int            : 1;
00272             unsigned int    prescl  : 3;
00273             unsigned int            : 1;
00274         };
00275         uint8_t             lcdfrr;
00276     };
00277     union {
00278         struct {
00279             unsigned int    contrast: 4;
00280             unsigned int    drive   : 4;
00281         };
00282         uint8_t             lcdccr;
00283     };
00284 } lcd_config_t;
00285 
00286 /*========================= PUBLIC VARIABLES         =========================*/
00287 
00288 
00289 /*========================= PUBLIC FUNCTIONS         =========================*/
00290 
00291 /** Initialization and configuration of the LCD controller
00292  *
00293  *  Example:
00294  *  \code
00295  *
00296  *      Configuring LCD with Extern clock (TOSC, 32.768kHz)
00297  *                         32786 Hz          32786 Hz
00298  *       frame_rate = ------------------ = ------------- = 32 Hz
00299  *                   8 * .prescl * .div     8 * 16 * 8
00300  *
00301  *      lcd_config_t lcd_config = {
00302  *          .wave       = LCD_WAVE_LOW_POWER,
00303  *          .buffer     = LCD_BUFFER_ON,
00304  *          .blanking   = LCD_BLANKING_OFF,
00305  *          .clock      = LCD_CLOCK_EXTERN,
00306  *          .bias       = LCD_BIAS_HALF,
00307  *          .prescl     = LCD_PRESCL_16,
00308  *          .div        = LCD_DIV_8,
00309  *          .drive      = LCD_DRIVE_450,
00310  *          .contrast   = LCD_CONTRAST_3_30
00311  *      };
00312  *
00313  *      lcd_init(lcd_config);
00314  *  \endcode
00315 */
00316 int  lcd_init(void);
00317 void lcd_deinit(void);
00318 uint8_t itobcd(uint8_t inNumber);
00319 
00320 /** @name Numeric functions */
00321 /** @{ */
00322 int  lcd_num_puthex(uint16_t numb, lcd_padding_t padding);
00323 int  lcd_num_putdec(int numb, lcd_padding_t padding);
00324 int  lcd_num_clr(void);
00325 void lcd_single_print_dig(uint8_t numb, uint8_t pos);
00326 /** @} */
00327 
00328 /** @name Text functions */
00329 /** @{ */
00330 int  lcd_puts(const char* s);
00331 int  lcd_puts_P(const char *s);
00332 int  lcd_puta(size_t length, const uint8_t *s);
00333 int  lcd_putchar(unsigned char c);
00334 /** @} */
00335 
00336 /** @name Symbol functions */
00337 /** @{ */
00338 void lcd_symbol_set(lcd_symbol_t symbol);
00339 void lcd_symbol_set_group(int start, int count);
00340 void lcd_symbol_clr(lcd_symbol_t symbol);
00341 void lcd_symbol_clr_group(int start, int count);
00342 /** @} */
00343 
00344 /** @name LED Functions */
00345 /** @{ */
00346 void led_on(void);
00347 void led_off(void);
00348 /** @} */
00349 
00350 #endif /* __LCD_H__ */
00351