/***************************************************** Plug n Play Library for Nokia 3310 LCD Author: Ajay Bhargav Email : contact@rickeyworld.info WWW : www.8051projects.net File : LCD.C Info : easy to use library function *****************************************************/ #include "lcd.h" /* Lookup Table for Nokia LCD */ const unsigned char code FontLookup [][5] = { { 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp { 0x00, 0x00, 0x2f, 0x00, 0x00 }, // ! { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ { 0xc4, 0xc8, 0x10, 0x26, 0x46 }, // % { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) { 0x14, 0x08, 0x3E, 0x08, 0x14 }, // * { 0x08, 0x08, 0x3E, 0x08, 0x08 }, // + { 0x00, 0x00, 0x50, 0x30, 0x00 }, // , { 0x10, 0x10, 0x10, 0x10, 0x10 }, // - { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / { 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0 { 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1 { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 { 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3 { 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4 { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 { 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6 { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 { 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9 { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? { 0x32, 0x49, 0x59, 0x51, 0x3E }, // @ { 0x7E, 0x11, 0x11, 0x11, 0x7E }, // A { 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B { 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C { 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D { 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E { 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F { 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G { 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H { 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I { 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J { 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K { 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L { 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M { 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N { 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O { 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P { 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q { 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S { 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T { 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U { 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V { 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z { 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [ { 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55 { 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ] { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ' { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a { 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c { 0x38, 0x44, 0x44, 0x48, 0x7F }, // d { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e { 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f { 0x0C, 0x52, 0x52, 0x52, 0x3E }, // g { 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h { 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i { 0x20, 0x40, 0x44, 0x3D, 0x00 }, // j { 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k { 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l { 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m { 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o { 0x7C, 0x14, 0x14, 0x14, 0x08 }, // p { 0x08, 0x14, 0x14, 0x18, 0x7C }, // q { 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s { 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t { 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u { 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v { 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x { 0x0C, 0x50, 0x50, 0x50, 0x3C }, // y { 0x44, 0x64, 0x54, 0x4C, 0x44 } // z }; static void Delay () { int i; for ( i = -32000; i < 32000; i++ ); for ( i = -32000; i < 32000; i++ ); for ( i = -32000; i < 32000; i++ ); for ( i = -32000; i < 32000; i++ ); } /* Send single byte on SPI Bus (software) */ /* Input Arguments: x -> Byte to send */ void spisend(unsigned char x){ unsigned char i; for(i=8;i>0;i--){ SCK = 0; if((x&0x80)){ DAT = 1; } else { DAT = 0; } SCK = 1; x <<= 1; } } /* Write Data Byte to Nokia LCD */ /* Input Arguments: x-> Data Byte to be sent */ void wrdata(unsigned char x){ DC = 1; CE = 0; spisend(x); CE = 1; } /* Write Command Byte to Nokia LCD */ /* Input Arguments: x -> Command Byte to be sent */ void wrcmd(unsigned char x){ DC = 0; CE = 0; spisend(x); CE = 1; } /* Brings ram pointer to X,Y pixel position */ /* Input Arguments: x-> X cordinate range from 0 to 83 */ /* Input Arguments: y-> Y cordinate range from 0 to 5 */ void pixelxy(unsigned char x, unsigned char y) { wrcmd(0x40|(y&0x07)); // Y axis wrcmd(0x80|(x&0x7f)); // X axis } /* Clears the screen */ void clearram(void) { int ddram; pixelxy(0,0); // Cursor Home. for (ddram=504;ddram>0;ddram--) {wrdata(0x00);} // 6*84 = 504 DDRAM addresses. } /* Nokia3310 LCD Initialization */ void initlcd(void) { RES = 1; // Set _RES HIGH. CE = 1; // Disable Chip. ES = 0; // Reset the LCD. Delay(); // Wait 100ms. ES = 1; // Awake LCD from RESET state. wrcmd(0x21); // Activate Chip and H=1. wrcmd(0xC2); // Set LCD Voltage to about 7V. wrcmd(0x13); // Adjust voltage bias. wrcmd(0x20); // Horizontal addressing and H=0. wrcmd(0x09); // Activate all segments. clearram(); // Erase all pixel on the DDRAM. wrcmd(0x08); // Blank the Display. wrcmd(0x0C); // Display Normal. pixelxy(0,0); // Cursor Home. } /* Bring cursor to Line and character specified */ /* Input Arguments: row -> Line number range from 1 to 6 */ /* Input Arguments: Column -> character position range from 1 to 14 */ /* You can have maximum of 6 lines of text on LCD and each line containing 14 characters. Address is auto increment */ void cursorxy(unsigned char row, unsigned char col){ if((row>6) || (row<1) || (col<1) || (col>14)) return; pixelxy(((col-1)*6),(row-1)); } /* Writes single character on LCD */ /* Input Arguments: ch -> Character to be displayed */ void putchar(unsigned char ch){ unsigned char i, temp; if ( (ch < 0x20) || (ch > 0x7b) ){ ch = 92; } for(i=0;i<5;i++){ temp = FontLookup[ch - 32][i] << 1; wrdata(temp); } wrdata(0x00); } /* Writes character string on LCD */ /* Input Arguments: str -> Pointer to string to be displayed */ void putstr (unsigned char *str){ while(*str) putchar(*str++); }