LCD_driver.c

Go to the documentation of this file.
00001 /* This file has been prepared for Doxygen automatic documentation generation.*/
00027 // Include files.
00028 #include "defines.h"
00029 #include "LCD_driver.h"
00030 
00031 union _LCD_status LCD_status = {0x01};    
00032 unsigned char LCD_timer = LCD_TIMER_SEED;
00033                                                                                 // colons.
00034 unsigned char LCD_displayData[LCD_REGISTER_COUNT];              
00035 
00037 __flash unsigned int LCD_character_table[] = // Character definitions table.
00038 {
00039         0x0A51,         // '*' (?)
00040         0x2A80,         // '+'
00041         0x0000,         // ',' (Not defined)
00042         0x0A00,         // '-'
00043         0x0000,         // '.' (Not defined)
00044         0x0000,         // '/' (Not defined)
00045         0x5559,         // '0'
00046         0x0118,         // '1'
00047         0x1e11,         // '2'
00048         0x1b11,         // '3'
00049         0x0b50,         // '4'
00050         0x1b41,         // '5'
00051         0x1f41,         // '6'
00052         0x0111,         // '7'
00053         0x1f51,         // '8'
00054         0x1b51,         // '9'
00055         0x0000,         // ':' (Not defined)
00056         0x0000,         // ';' (Not defined)
00057         0x0000,         // '<' (Not defined)
00058         0x0000,         // '=' (Not defined)
00059         0x0000,         // '>' (Not defined)
00060         0x0000,         // '?' (Not defined)
00061         0x0000,         // '@' (Not defined)
00062         0x0f51,         // 'A' (+ 'a')
00063         0x3991,         // 'B' (+ 'b')
00064         0x1441,         // 'C' (+ 'c')
00065         0x3191,         // 'D' (+ 'd')
00066         0x1e41,         // 'E' (+ 'e')
00067         0x0e41,         // 'F' (+ 'f')
00068         0x1d41,         // 'G' (+ 'g')
00069         0x0f50,         // 'H' (+ 'h')
00070         0x2080,         // 'I' (+ 'i')
00071         0x1510,         // 'J' (+ 'j')
00072         0x8648,         // 'K' (+ 'k')
00073         0x1440,         // 'L' (+ 'l')
00074         0x0578,         // 'M' (+ 'm')
00075         0x8570,         // 'N' (+ 'n')
00076         0x1551,         // 'O' (+ 'o')
00077         0x0e51,         // 'P' (+ 'p')
00078         0x9551,         // 'Q' (+ 'q')
00079         0x8e51,         // 'R' (+ 'r')
00080         0x9021,         // 'S' (+ 's')
00081         0x2081,         // 'T' (+ 't')
00082         0x1550,         // 'U' (+ 'u')
00083         0x4448,         // 'V' (+ 'v')
00084         0xc550,         // 'W' (+ 'w')
00085         0xc028,         // 'X' (+ 'x')
00086         0x2028,         // 'Y' (+ 'y')
00087         0x5009,         // 'Z' (+ 'z')
00088         0x0000,         // '[' (Not defined)
00089         0x0000,         // '\' (Not defined)
00090         0x0000,         // ']' (Not defined)
00091         0x0000,         // '^' (Not defined)
00092         0x0000          // '_' (Not defined)
00093 };
00094 
00095 
00098 void LCD_Init (void)
00099 {
00100         LCD_AllSegments( FALSE );       // Clear segment buffer.
00101         LCDCRA = (1<<LCDEN);            // Enable LCD.
00102 
00103     LCD_CONTRAST_LEVEL(LCD_INITIAL_CONTRAST);    //Set the LCD contrast level
00104 
00105         // Select asynchronous clock source, enable all COM pins and enable all segment pins.
00106         LCDCRB = (1<<LCDCS) | (1<<LCDMUX1) | (1<<LCDMUX0) | (1<<LCDPM2) | (1<<LCDPM1)| (1<<LCDPM0);
00107         LCDFRR = (1<<LCDPS0);                       // Set LCD prescaler to CLK(lcd)/64 = 64Hz.
00108 
00109         LCDCRA |= (1<<LCDIE);                       //Enable LCD_Start_frame interrupt
00110 }
00111 
00112 
00119 void LCD_WriteDigit( unsigned char c, unsigned char digit )
00120 {
00121 
00122         unsigned int seg;
00123         unsigned char i;
00124         unsigned char mask, nibble;
00125         unsigned char *ptr;
00126 
00127         //Lookup character table for segmet data
00128         seg = 0x0000;
00129         if ( (c >= '*') && (c <= 'z') )
00130         {
00131                 // c is in character_table.
00132                 // Convert to upper if necessarry.
00133                 if ( c >= 'a' ) c &= ~0x20;
00134                 c -= '*';
00135                 seg = LCD_character_table[c];
00136         }
00137         else
00138         {
00139                 return;         //ASCII code out of range
00140         }
00141 
00142         // Adjust mask according to digit
00143         mask = 0x0F;            // (1), 3, 5, 7
00144         if ( digit & 0x01 )
00145         {
00146                 //left empty to optimize code size
00147         }
00148         else
00149         {
00150                 mask = 0xF0;            // (0), 2, 4, 6
00151         }
00152 
00153         i = digit-2;            //i used as pointer offset
00154         if ( i >= 6 )           //Test if LCD digit is out of range
00155                 return;
00156         i >>= 1;
00157         ptr = LCD_displayData + i;      // Point to the first relevant LCDDR; i = {0,0,1,1,2,2}
00158 
00159         i = 4;                  //i used as loop counter
00160         do
00161         {
00162                 nibble = seg & 0x000F;
00163                 seg >>= 4;
00164                 if ( digit & 0x01 )
00165                         nibble <<= 4;
00166                 *ptr = (*ptr & mask) | nibble;
00167                 ptr += 5;
00168         } while ( --i );
00169 }
00170 
00171 
00176 void LCD_AllSegments( unsigned char input )
00177 {
00178         unsigned char i;
00179         unsigned char *ptr;
00180 
00181         if( input )                                 // if input == TRUE
00182                 input = 0xFF;                   // set setgemts to 0xFF
00183                                                                 // (else set segments to 0x00)
00184         
00185         ptr = LCD_displayData;
00186         i = 20;
00187         do                                                      // Set all LCD segment register to the variable ucSegments
00188         {
00189                 *ptr++ = input;         // Set/clear the bits in all LCD registers
00190         } while ( --i );
00191 }
00192 
00193 
00196 #pragma vector = LCD_SOF_vect
00197 __interrupt void LCD_SOF_interrupt( void )
00198 //#pragma vector = LCD_START_FRAME_vect
00199 //__interrupt void LCD_START_FRAME_interrupt( void )
00200 {
00201         unsigned char i;
00202         unsigned char *src, *dest;
00203 
00204         LCD_timer--;
00205         if( LCD_timer == 0 )
00206         {
00207             if( LCD_status.updateRequired == TRUE )
00208                 {
00209                         LCD_timer = LCD_TIMER_SEED;
00210                         LCD_status.updateComplete = TRUE;       // Set the ucLCD_ScrollReady to true.
00211 
00212                         // Copy display data buffer to I/O segment registers.
00213                         i = 20;
00214                         dest = &pLCDREG;
00215                         src = LCD_displayData;
00216                         do
00217                         {
00218                                 *dest++ = *src++;
00219                         } while ( --i );
00220                 }
00221                 else
00222                 {
00223                   LCD_timer = 1;              //If LCD timer allows update of the LCD, but update is blocked
00224                                               // by LCD_status.updateRequired == FALSE the LCD_timer is preloaded
00225                                               // with smallest timer seed to ensure fastest LCD update.
00226           LCD_status.updateComplete = FALSE;  //Block for further access to the LCD_displayData until
00227                                               // LCD update has been performed.
00228                 }
00229         }
00230 }

Generated on Fri Feb 17 12:31:56 2006 for AVR065: LCD Driver for the STK502 by  doxygen 1.4.5