1. Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.
    Dismiss Notice

Graphic LCD 96x64 w/ SED1565 Controller

Discussion in 'Microcontrollers' started by AtomSoft, May 23, 2009.

  1. AtomSoft

    AtomSoft Well-Known Member

    Joined:
    Feb 7, 2008
    Messages:
    5,670
    Likes:
    41
    Location:
    Brooklyn, NY US
    as for the arrow you:

    You either have a extra character in the beginning of your font table or you are minus-ing the wrong amount from it.

    To place code here just put the code in these brackets

    [ code] CODE here [ /code]

    remove the spaces within the brackets. You will then see it like:
    Code (text):

    Code Here
     
    or you can upload a ZIP or C or H file.

    To upload you have to be in Advanced Mode [Go Advanced] button on the bottom right of quick reply
     
    Last edited: Jun 17, 2009
  2. millwood

    millwood Banned

    Joined:
    Jun 17, 2009
    Messages:
    191
    Likes:
    2
    thanks, atomsofttech.

    here goes the code

    Code (text):
    //#include <htc.h>
    //#include "delay.h"
    #include <LPC210x.h>
    //#include "always.h"

    #define GETBIT(var,bit) (((var)>>(bit))&1)          /* read bit from var */
    #define SETBIT(var,bit) ((var)|=(1L<<(bit)))        /* set bit from var to 1 */
    #define CLRBIT(var,bit) ((var)&=(~(1L<<(bit))))     /* clear bit from var (set it to 0) */

    #define uint unsigned int
    #define byte unsigned char
    //#define delay_ms() DelayMs()

    /////////////////////////////////////////////////////////////////////////////////
    // Description : This firmware for Nokia 7110 (SED1565 controller) 96*65 TEST  //
    // Hardware : PIC16F875 , LCD NOKIA7110                                        //
    // Firmware : Rev 0.1                                                          //
    // Date : 6/14/2009                                                           //
    // by : Hello world                                                            //
    // Compiler : PICC-Lite 9.6L1 / TIDE                                                                  //
    /////////////////////////////////////////////////////////////////////////////////

    //#include <16F877.h>
    //#fuses HS,NOPUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP
    //#use   delay(clock=20000000,RESTART_WDT)
    //#byte  lcdport = 6  // (PORTB address value 6 for PIC16F628 device)


    // hardware configuration
    //                              PIC SIDE         LCD SIDE
    /*#bit  nok_sda  = lcdport.0  // RB0 pin-19        pin-13 Serial data
    #bit  nok_sclk = lcdport.1  // RB1 pin-20        pin-05 Serial clock
    #bit  nok_dc   = lcdport.2  // RB2 pin-21        pin-04 Data or Command mode
    #bit  nok_cs   = lcdport.3  // RB3 pin-22        pin-02 LCD Chip select
    #bit  nok_res  = lcdport.4  // RB4 pin-23        pin-14 LCD Reset

    #zero_ram
    */
    // hardware configuration
    // change this section if your pin connection is different

    #define lcd_res     0           //lcd_res connected to p0.0, pin13
    #define lcd_sda     1           //lcd_sda connected to p0.1, pin14
    #define lcd_led     2           //led backlight connected to p0.2, pin18
    #define lcd_sclk    3           //lcd_sclk connected to p0.3, pin21
    #define lcd_dc      4           //lcd_dc connected to p0.4, pin22
    #define lcd_cs      5           //lcd_cs connected to p0.5, pin23

    // end hardware configuration

    // display attributes
    #define NORMAL      0x00    // normal black on green
    #define UNDERLINE   0x80   
    #define STRIKE      0x10
    #define OVERLINE    0x01
    #define REVERSE     0xff    //green on black


    #define negative_lcd    lcd_write_command(lcd_reverse)
    #define normal_lcd      lcd_write_command(lcd_normal)

    /**********************************************************
                   LCD Commands
    **********************************************************/
    #define pow_ctrl                    0x20    // (16) power control set value (contrast level --> 0x00 lightest to 0x3F darkest), from 0b00101000 to 0b00101111.
    #define v5_ratio                    0x22    //(17) V5 resistor ratio, from 0b00100000 to 0b00100111. need to add some ratio
    #define start_line              0x40    // start line - set the display line start address.
    #define elec_vol                    0x81    // (18) electronic volume mode
    #define adc_normal              0xA0    // (8) <ADC select> (0xA1/0b10100001 reverse lcd - 0xA0/0b10100000 select normal)
    #define adc_reverse             0xA1
    #define lcd_bias_1_over_9   0xA2    // (11) lcd bias (1/9 0xA2/0b10100010 - 1/7 0xA3/0b10100011)
    #define lcd_bias_1_over_7   0xA3
    #define lcd_all_off             0xA4    //turn all pixels off
    #define lcd_all_on              0xA5    //lcd all points on - turn on all pixels. 0xA4: normal display.
    #define lcd_normal              0xA6    // 0b10100110 = 0xA6, lcd in normal display mode (0xA7/0b10100111 negative mode)
    #define lcd_reverse             0xA7
    #define lcd_off                     0xAE    //
    #define lcd_on                      0xAF    // lcd on - display on. 0xAE: display off.
    #define comm_normal             0xC0    // (15) common output normal (0xC8 reverse)
    #define comm_reverse            0xC8
    #define lcd_nop                     0xE3    // nop (command for no-operation, 0b11100011.

    #define lcd_1st_col             0x12    //first  displayable column. datasheet didn't mention this. WEIRD!

    /**********************************************************
                   Global Variable
    **********************************************************/
    char page;
    char x,y;
    //char char_row;
    //char charpos;
    //char chardata;


    /**********************************************************
                   Function Prototype
    **********************************************************/
    void lcd_write_dorc(char byteforlcd);
    void lcd_write_command(char byteforlcd_command);
    void lcd_write_data(char byteforlcd_data);
    void lcd_gotoxy(char lcd_row, char lcd_col);    //go to lcd_row / 0-8; and lcd_col / 0-95
    //void lcd_pixel(char x, char y);   // not used.
    void lcd_chr(char charsel, char attribute);
    void lcd_str(const char *str, char attribute);
    void lcd_reset(void);
    void lcd_cls(void);
    void lcd_init(void);
    void mcu_init(void);
    void DelayUs(int);
    void DelayMs(int);


    /********************************************************
                  ASCII table for 5x7 dots font
    ********************************************************/

    const char  Char_Table [] = {
                      0x00,0x00,0x00,0x00,0x00,  // 20 space
                      0x00,0x00,0x5f,0x00,0x00,  // 21 !
                      0x00,0x07,0x00,0x07,0x00,  // 22 "
                      0x14,0x7f,0x14,0x7f,0x14,  // 23 #
                      0x24,0x2a,0x7f,0x2a,0x12,  // 24 $
                      0x23,0x13,0x08,0x64,0x62,  // 25 %
                      0x36,0x49,0x55,0x22,0x50,  // 26 &
                      0x00,0x05,0x03,0x00,0x00,  // 27 '
                      0x00,0x1c,0x22,0x41,0x00,  // 28 (
                      0x00,0x41,0x22,0x1c,0x00,  // 29 )
                      0x14,0x08,0x3e,0x08,0x14,  // 2a *
                      0x08,0x08,0x3e,0x08,0x08,  // 2b +
                      0x00,0x50,0x30,0x00,0x00,  // 2c ,
                      0x08,0x08,0x08,0x08,0x08,  // 2d -
                      0x00,0x60,0x60,0x00,0x00,  // 2e .
                      0x20,0x10,0x08,0x04,0x02,  // 2f /
                      0x3e,0x51,0x49,0x45,0x3e,  // 30 0
                      0x00,0x42,0x7f,0x40,0x00,  // 31 1
                      0x42,0x61,0x51,0x49,0x46,  // 32 2
                      0x21,0x41,0x45,0x4b,0x31,  // 33 3
                      0x18,0x14,0x12,0x7f,0x10,  // 34 4
                      0x27,0x45,0x45,0x45,0x39,  // 35 5
                      0x3c,0x4a,0x49,0x49,0x30,  // 36 6
                      0x01,0x71,0x09,0x05,0x03,  // 37 7
                      0x36,0x49,0x49,0x49,0x36,  // 38 8
                      0x06,0x49,0x49,0x29,0x1e,  // 39 9
                      0x00,0x36,0x36,0x00,0x00,  // 3a :
                      0x00,0x56,0x36,0x00,0x00,  // 3b ;
                      0x08,0x14,0x22,0x41,0x00,  // 3c <
                      0x14,0x14,0x14,0x14,0x14,  // 3d =
                      0x00,0x41,0x22,0x14,0x08,  // 3e >
                      0x02,0x01,0x51,0x09,0x06,  // 3f ?
                      0x32,0x49,0x79,0x41,0x3e,  // 40 @
                      0x7e,0x11,0x11,0x11,0x7e,  // 41 A
                      0x7f,0x49,0x49,0x49,0x36,  // 42 B
                      0x3e,0x41,0x41,0x41,0x22,  // 43 C
                      0x7f,0x41,0x41,0x22,0x1c,  // 44 D
                      0x7f,0x49,0x49,0x49,0x41,  // 45 E
                      0x7f,0x09,0x09,0x09,0x01,  // 46 F
                      0x3e,0x41,0x49,0x49,0x7a,  // 47 G
                      0x7f,0x08,0x08,0x08,0x7f,  // 48 H
                      0x00,0x41,0x7f,0x41,0x00,  // 49 I
                      0x20,0x40,0x41,0x3f,0x01,  // 4a J
                      0x7f,0x08,0x14,0x22,0x41,  // 4b K
                      0x7f,0x40,0x40,0x40,0x40,  // 4c L
                      0x7f,0x02,0x0c,0x02,0x7f,  // 4d M
                      0x7f,0x04,0x08,0x10,0x7f,  // 4e N
                      0x3e,0x41,0x41,0x41,0x3e,  // 4f O
                      0x7f,0x09,0x09,0x09,0x06,  // 50 P
                      0x3e,0x41,0x51,0x21,0x5e,  // 51 Q
                      0x7f,0x09,0x19,0x29,0x46,  // 52 R
                      0x46,0x49,0x49,0x49,0x31,  // 53 S
                      0x01,0x01,0x7f,0x01,0x01,  // 54 T
                      0x3f,0x40,0x40,0x40,0x3f,  // 55 U
                      0x1f,0x20,0x40,0x20,0x1f,  // 56 V
                      0x3f,0x40,0x38,0x40,0x3f,  // 57 W
                      0x63,0x14,0x08,0x14,0x63,  // 58 X
                      0x07,0x08,0x70,0x08,0x07,  // 59 Y
                      0x61,0x51,0x49,0x45,0x43,  // 5a Z
                      0x00,0x7f,0x41,0x41,0x00,  // 5b [
                      0x02,0x04,0x08,0x10,0x20,  // 5c \
                      0x00,0x41,0x41,0x7f,0x00,  // 5d ]
                      0x04,0x02,0x01,0x02,0x04,  // 5e ^
                      0x40,0x40,0x40,0x40,0x40,  // 5f _
                      0x00,0x01,0x02,0x04,0x00,  // 60 `
                      0x20,0x54,0x54,0x54,0x78,  // 61 a
                      0x7f,0x48,0x44,0x44,0x38,  // 62 b
                      0x38,0x44,0x44,0x44,0x20,  // 63 c
                      0x38,0x44,0x44,0x48,0x7f,  // 64 d
                      0x38,0x54,0x54,0x54,0x18,  // 65 e
                      0x08,0x7e,0x09,0x01,0x02,  // 66 f
                      0x0c,0x52,0x52,0x52,0x3e,  // 67 g
                      0x7f,0x08,0x04,0x04,0x78,  // 68 h
                      0x00,0x44,0x7d,0x40,0x00,  // 69 i
                      0x20,0x40,0x44,0x3d,0x00,  // 6a j
                      0x7f,0x10,0x28,0x44,0x00,  // 6b k
                      0x00,0x41,0x7f,0x40,0x00,  // 6c l
                      0x7c,0x04,0x18,0x04,0x78,  // 6d m
                      0x7c,0x08,0x04,0x04,0x78,  // 6e n
                      0x38,0x44,0x44,0x44,0x38,  // 6f o
                      0x7c,0x14,0x14,0x14,0x08,  // 70 p
                      0x08,0x14,0x14,0x18,0x7c,  // 71 q
                      0x7c,0x08,0x04,0x04,0x08,  // 72 r
                      0x48,0x54,0x54,0x54,0x20,  // 73 s
                      0x04,0x3f,0x44,0x40,0x20,  // 74 t
                      0x3c,0x40,0x40,0x20,0x7c,  // 75 u
                      0x1c,0x20,0x40,0x20,0x1c,  // 76 v
                      0x3c,0x40,0x30,0x40,0x3c,  // 77 w
                      0x44,0x28,0x10,0x28,0x44,  // 78 x
                      0x0c,0x50,0x50,0x50,0x3c,  // 79 y
                      0x44,0x64,0x54,0x4c,0x44,  // 7a z
                      0x00,0x08,0x36,0x41,0x00,  // 7b {
                      0x00,0x00,0x7f,0x00,0x00,  // 7c |
                      0x00,0x41,0x36,0x08,0x00,  // 7d }
                      0x10,0x08,0x08,0x10,0x08,  // 7e ~
                      0x78,0x46,0x41,0x46,0x78}; // 7f &brvbar;

                      //7e,43,40,43,7e //&Uuml;
                      //7e,43,42,43,7e //&Ouml;
                      //1e,21,21,71,21 //&Ccedil;
                      //3c,42,53,53,72 //&ETH;

    /********************************************************
                  lcd clear LCD function
    ********************************************************/
    void lcd_cls(void) {
       for (page=0; page<9; page++)              // 9 page, fill display RAM with 0s.
          {
             lcd_write_command(0xB0 | page);   // page address ie:0xB0,0xB1,...,0xB7
             lcd_write_command(0x11);          // 0x11, most  4 bit column address command 0001 0011
             lcd_write_command(0x01);          // 0x02, least 4 bit column address command 0000 0011
             for (x=96; x>0; x--)              // 96 column
                lcd_write_data(0x00);
          }
    }

    /**********************************************************
                   Reset LCD Function
    **********************************************************/
    void lcd_reset(void) {
       IOSET = 1<<lcd_cs;           //select the lcd
       DelayMs(10);
       IOCLR = 1<<lcd_res;      //lcd_res low to reset the display. the lcd going into default state.
       DelayMs(10);                     //give the lcd time to reset.
       IOSET = 1<<lcd_res;      //pulling the lcd out of reset.
       DelayMs(100);
    }

    /**********************************************************
                   Initial LCD Function
    **********************************************************/
    void lcd_init(void) {
       lcd_reset();
       // the following initialization sequence per datasheet. All needs to be done in 5ms. (X) where X is the command on pg 8-56 of datasheet

       lcd_write_command(lcd_normal); // 0b10100110 = 0xA6, lcd in normal display mode (0xA7/0b10100111 negative mode)
       lcd_write_command(lcd_bias_1_over_7); // (11) lcd bias (1/9 0xA2/0b10100010 - 1/7 0xA3/0b10100011)
       lcd_write_command(adc_reverse); // (8) <ADC select> (0xA1/0b10100001 reverse lcd - 0xA0/0b10100000 select normal)
       lcd_write_command(comm_normal); // (15) common output normal (0xC8 reverse)
       lcd_write_command(v5_ratio+2); // (17) V5 resistor ratio, from 0b00100000 to 0b00100111
       lcd_write_command(elec_vol); // (18) electronic volume mode
       lcd_write_command(pow_ctrl+0x0E); // (16) power control set value (contrast level --> 0x00 lightest to 0x3F darkest), from 0b00101000 to 0b00101111.
       //this concludes the mandatory initialization, as specified on pg 8-56 of the datasheet
       
       lcd_write_command(0x2F); // power control set value, from 0b00101000 to 0b00101111. see pg 8-52 of datasheet.
       lcd_write_command(lcd_nop); // nop (command for no-operation, 0b11100011.
    //   lcd_write_command(0x2f); // start line - set the display line start address.
       lcd_write_command(lcd_on); // lcd on - display on. 0xAE: display off.
       lcd_write_command(lcd_all_on); // lcd all points on - turn on all pixels. 0xA4: normal display.
       DelayMs(50);
       lcd_write_command(lcd_off); // lcd off - turn display off.

       lcd_cls();

       lcd_write_command(lcd_on); // lcd on
       lcd_write_command(lcd_all_off); // lcd normal display mode


    }

    /**********************************************************
                   sent 8 bit data to LCD by series
    **********************************************************/
    void lcd_write_dorc(char byteforlcd) { // same lcdai 3310
     
      char caa;
       for (caa=8;caa>0;caa--)
       {
          IOCLR=1<<lcd_sclk;    //data sent on the rising edge of sclk line
          DelayUs(2);
          if ((byteforlcd&0x80)==0) // tramission starts from D7, D6, .., D1, D0. if D7 is 0, send 0.
             {IOCLR=1<<lcd_sda;}
          else
             {IOSET=1<<lcd_sda;}
             
          IOSET=1<<lcd_sclk;    //clock out the data
          byteforlcd=byteforlcd<<1; //shift left the next bit.
       }
     
    }

    /**********************************************************
                  Sent Command to LCD Function
    **********************************************************/
    void lcd_write_command(char byteforlcd_command) {
       IOCLR=1<<lcd_dc;   // dc=0 signals lcd command mode. A0 in the datasheet. dc=data or command.
       IOCLR=1<<lcd_cs;   // chip enabled, negative logic. _cs
       lcd_write_dorc(byteforlcd_command);  //send the command.
       IOSET=1<<lcd_cs;   // chip disabled
    }

    /**********************************************************
                   Sent Data to LCD Function
    **********************************************************/
    void lcd_write_data(char byteforlcd_data) {
       IOSET=1<<lcd_dc;   // display data mode. A0 in the datasheet. dorc=data or command.
       IOCLR=1<<lcd_cs;   // chip enabled, negative logic. _cs
       lcd_write_dorc(byteforlcd_data); //send the data.
       IOSET=1<<lcd_cs;   // chip disabled
    }

    /**********************************************************
                   goto xy position on LCD Function
    **********************************************************/
    void lcd_gotoxy(char lcd_row, char lcd_col) {   //lcy_row: 0 - 8 (8th column has only 1 line / D0, lcd_col: 0 - 15.
       char col_addr;
       lcd_write_command(0xB0 + lcd_row);           // page address set. pg 8-48 in the datasheet.
       col_addr = lcd_1st_col+(lcd_col*6);                  // each font has five columns + 1 blank column. xaddr: 0 - 95 on nokia 7110. no offset.
         //lcd_1st_col=0x12: the first column of display starts here. Weird! the datasheet didn't mention it.
       lcd_write_command(0x10 | (col_addr>>4));        // column address 4 most bit set
       lcd_write_command(0x0f & col_addr);             // column address 4 least bit set
    }

    /**********************************************************
               Convert bitmap to charractor Function
    **********************************************************/
    void lcd_chr(char charsel, char attribute) {
        char char_row, char_data;
        int char_pos;

       if (charsel < 0x20) return;
       if (charsel > 0x7f) return;  //check for illegal characters

       for (char_row = 0; char_row < 5; char_row++) // 5 bytes
          {
             char_pos=charsel-0x20;
             char_data=Char_Table[char_pos*5+char_row];
    //         lcd_write_data(~char_data);            // send font data to lcd, white char on black background
                        if(attribute == REVERSE)
                            lcd_write_data(~char_data);            // send font data to lcd
                        else
                            lcd_write_data(char_data | attribute);

          }
    //   lcd_write_data(~0x00); // blank side pixels for each font, white char on black background
            if (attribute == REVERSE)
                lcd_write_data(~0x00);
            else
                lcd_write_data(0x00 | attribute); // blank side pixels for each font
    }

    /**********************************************************
               Write a string at current screen position
    **********************************************************/
    void lcd_str(const char *str, char attribute) {

      while (*str)
            lcd_chr(*str++, attribute);
       
    }

    /**********************************************************
      delay routines
    ***********************************************************/

    void DelayUs(int us) {
        for (; us>0; us--);
    }

    void DelayMs(int ms) {
        for (; ms>0; ms--)
            DelayUs(1000);
    }

    void mcu_init(void) {
    // need to initialize the mcu here.
        PINSEL0=0x00;
        IODIR=0xff;     //pin p0.0..p0.7 used for gpio.
       
    }

    /*****************************************************************
                      Main Progarm
    *****************************************************************/

    int main(void)
    {
     
       mcu_init();
       lcd_init();
        while (1) {
            lcd_gotoxy(0,0);
    //      lcd_chr('c');
    //      lcd_chr('b');

        lcd_str("0-HELLO, WORLD!", NORMAL);
            lcd_gotoxy(1,0);
            lcd_str("1-01234567890012", NORMAL);
            lcd_gotoxy(2,0);
            lcd_str("2-hello, world!", OVERLINE);
            lcd_gotoxy(3,0);
            lcd_str("3-ABCDEFGHIJKLMN", UNDERLINE);
            lcd_gotoxy(4,0);
            lcd_str("4-abcdefghijklmn", STRIKE);
            lcd_gotoxy(5,0);
            lcd_str("5-OPQRSTUVWXYZ", OVERLINE | STRIKE);
            lcd_gotoxy(6,0);
            lcd_str("6-opqrstuvwxyz", UNDERLINE | STRIKE);
            lcd_gotoxy(7,0);
            lcd_str("7-  BYE BYE", STRIKE | OVERLINE | UNDERLINE | REVERSE);


    //      lcd_cls();
        }
    }

    /*void main(void) {
        while (1){
            //TODO Auto-generated main function
        }
    }
    */
     
    hope it works.
     
  3. AtomSoft

    AtomSoft Well-Known Member

    Joined:
    Feb 7, 2008
    Messages:
    5,670
    Likes:
    41
    Location:
    Brooklyn, NY US
    do me 1 favor try printing this to the LCD:
    Code (text):

            lcd_gotoxy(1,0);
            lcd_str("XYZ[\]^_`abc", NORMAL);

     
    This should help me think better. Show a image when done please.
     
  4. dave

    Dave New Member

    Joined:
    Jan 12, 1997
    Messages:
    -
    Likes:
    0


     
  5. AtomSoft

    AtomSoft Well-Known Member

    Joined:
    Feb 7, 2008
    Messages:
    5,670
    Likes:
    41
    Location:
    Brooklyn, NY US

    oh and for the extra bits that appear in bottom left try clearing the screen before first write.

    Try this as your main:
    Code (text):

    /*****************************************************************
                      Main Progarm
    *****************************************************************/

    int main(void)
    {
     
        mcu_init();
        lcd_init();
        while (1) {
    //       lcd_chr('c');
    //       lcd_chr('b');

                lcd_cls();
                lcd_gotoxy(0,0);
                lcd_str("0- XYZ[\]^_`abc", NORMAL)

    //       lcd_str("0-HELLO, WORLD!", NORMAL);

                lcd_gotoxy(1,0);
                lcd_str("1-01234567890012", NORMAL);

                lcd_gotoxy(2,0);
                lcd_str("2-hello, world!", OVERLINE);

                lcd_gotoxy(3,0);
                lcd_str("3-ABCDEFGHIJKLMN", UNDERLINE);

                lcd_gotoxy(4,0);
                lcd_str("4-abcdefghijklmn", STRIKE);

                lcd_gotoxy(5,0);
                lcd_str("5-OPQRSTUVWXYZ", OVERLINE | STRIKE);

                lcd_gotoxy(6,0);
                lcd_str("6-opqrstuvwxyz", UNDERLINE | STRIKE);

                lcd_gotoxy(7,0);
                lcd_str("7-  BYE BYE", STRIKE | OVERLINE | UNDERLINE | REVERSE);

    //       lcd_cls();
        }
    }

     
     
    Last edited: Jun 17, 2009
  6. millwood

    millwood Banned

    Joined:
    Jun 17, 2009
    Messages:
    191
    Likes:
    2
    if I change the code to

    Code (text):
    lcd_str("XYZ[\\]^_`abc", NORMAL);
    note the "\\" because "\" is the escape sequence in C.

    the output is perfectly normal.
     

    Attached Files:

  7. millwood

    millwood Banned

    Joined:
    Jun 17, 2009
    Messages:
    191
    Likes:
    2

    the dots at the bottom of the screen has something to do with the 7110 model in proteus, I suspect.

    If I turn comm to normal, in lcd_init():

    Code (text):
    lcd_write_command(comm_reverse); // (15) common output normal (0xC8 reverse)
    I get a flipped but otherwise fine screen.
     

    Attached Files:

  8. millwood

    millwood Banned

    Joined:
    Jun 17, 2009
    Messages:
    191
    Likes:
    2
    now you see it; now you don't, :)

    here is how to make the 'a' disappear, :).

    Code (text):

            lcd_gotoxy(0,0);
        lcd_str("0-XYZ[\\]^_`abc", NORMAL);
            lcd_gotoxy(1,0);
            lcd_str("1-XYZ[\\]^_abc", NORMAL);
     

    Attached Files:

  9. AtomSoft

    AtomSoft Well-Known Member

    Joined:
    Feb 7, 2008
    Messages:
    5,670
    Likes:
    41
    Location:
    Brooklyn, NY US
    try removing some of the comments from the font
    Code (text):

                      0x00,0x41,0x41,0x7f,0x00,  // 5d ]
                      0x04,0x02,0x01,0x02,0x04,
                      0x40,0x40,0x40,0x40,0x40,
                      0x00,0x01,0x02,0x04,0x00,
                      0x20,0x54,0x54,0x54,0x78,  // 61 a
     
    Im not sure why you get this issue. I have comments also but no issue like this. would it be possible for you to post the proteus model and stuff so i can check it here?
     
    Last edited: Jun 17, 2009
  10. millwood

    millwood Banned

    Joined:
    Jun 17, 2009
    Messages:
    191
    Likes:
    2
    sure. see attached.

    eliminating the comments made no difference. also, have you noticed that the char ']' was not displaced at all?
     

    Attached Files:

  11. millwood

    millwood Banned

    Joined:
    Jun 17, 2009
    Messages:
    191
    Likes:
    2
    Jason, your instinct was right. I used lcd_chr() to trace the problem back to char 5c, '\', which is a control char for c. I rewrote that line from:

    Code (text):
    0x02,0x04,0x08,0x10,0x20,  // 5c \
    to

    Code (text):
    0x02,0x04,0x08,0x10,0x20,  // 5c 55
    and everything is golden!

    thank you so much for your help.

    here is a copy of the complete code.

    Code (text):

    //#include <htc.h>
    //#include "delay.h"
    #include <LPC210x.h>
    //#include "always.h"

    #define GETBIT(var,bit) (((var)>>(bit))&1)          /* read bit from var */
    #define SETBIT(var,bit) ((var)|=(1L<<(bit)))        /* set bit from var to 1 */
    #define CLRBIT(var,bit) ((var)&=(~(1L<<(bit))))     /* clear bit from var (set it to 0) */

    #define uint unsigned int
    #define byte unsigned char
    //#define delay_ms() DelayMs()

    /////////////////////////////////////////////////////////////////////////////////
    // Description : This firmware for Nokia 7110 (SED1565 controller) 96*65 TEST  //
    // Hardware : PIC16F875 , LCD NOKIA7110                                        //
    // Firmware : Rev 0.1                                                          //
    // Date : 6/14/2009                                                           //
    // by : Hello world                                                            //
    // Compiler : PICC-Lite 9.6L1 / TIDE                                                                  //
    /////////////////////////////////////////////////////////////////////////////////

    //#include <16F877.h>
    //#fuses HS,NOPUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP
    //#use   delay(clock=20000000,RESTART_WDT)
    //#byte  lcdport = 6  // (PORTB address value 6 for PIC16F628 device)


    // hardware configuration
    //                              PIC SIDE         LCD SIDE
    /*#bit  nok_sda  = lcdport.0  // RB0 pin-19        pin-13 Serial data
    #bit  nok_sclk = lcdport.1  // RB1 pin-20        pin-05 Serial clock
    #bit  nok_dc   = lcdport.2  // RB2 pin-21        pin-04 Data or Command mode
    #bit  nok_cs   = lcdport.3  // RB3 pin-22        pin-02 LCD Chip select
    #bit  nok_res  = lcdport.4  // RB4 pin-23        pin-14 LCD Reset

    #zero_ram
    */
    // hardware configuration
    // change this section if your pin connection is different

    #define lcd_res     0           //lcd_res connected to p0.0, pin13
    #define lcd_sda     1           //lcd_sda connected to p0.1, pin14
    #define lcd_led     2           //led backlight connected to p0.2, pin18
    #define lcd_sclk    3           //lcd_sclk connected to p0.3, pin21
    #define lcd_dc      4           //lcd_dc connected to p0.4, pin22
    #define lcd_cs      5           //lcd_cs connected to p0.5, pin23

    // end hardware configuration

    // display attributes
    #define NORMAL      0x00    // normal black on green
    #define UNDERLINE   0x80   
    #define STRIKE      0x10
    #define OVERLINE    0x01
    #define REVERSE     0xff    //green on black


    #define negative_lcd    lcd_write_command(lcd_reverse)
    #define normal_lcd      lcd_write_command(lcd_normal)

    /**********************************************************
                   LCD Commands
    **********************************************************/
    #define pow_ctrl                    0x20    // (16) power control set value (contrast level --> 0x00 lightest to 0x3F darkest), from 0b00101000 to 0b00101111.
    #define v5_ratio                    0x22    //(17) V5 resistor ratio, from 0b00100000 to 0b00100111. need to add some ratio
    #define start_line              0x40    // start line - set the display line start address.
    #define elec_vol                    0x81    // (18) electronic volume mode
    #define adc_normal              0xA0    // (8) <ADC select> (0xA1/0b10100001 reverse lcd - 0xA0/0b10100000 select normal)
    #define adc_reverse             0xA1
    #define lcd_bias_1_over_9   0xA2    // (11) lcd bias (1/9 0xA2/0b10100010 - 1/7 0xA3/0b10100011)
    #define lcd_bias_1_over_7   0xA3
    #define lcd_all_off             0xA4    //turn all pixels off
    #define lcd_all_on              0xA5    //lcd all points on - turn on all pixels. 0xA4: normal display.
    #define lcd_normal              0xA6    // 0b10100110 = 0xA6, lcd in normal display mode (0xA7/0b10100111 negative mode)
    #define lcd_reverse             0xA7
    #define lcd_off                     0xAE    //
    #define lcd_on                      0xAF    // lcd on - display on. 0xAE: display off.
    #define comm_normal             0xC0    // (15) common output normal (0xC8 reverse)
    #define comm_reverse            0xC8
    #define lcd_nop                     0xE3    // nop (command for no-operation, 0b11100011.

    #define lcd_1st_col             0x12    //first  displayable column. datasheet didn't mention this. WEIRD!

    /**********************************************************
                   Global Variable
    **********************************************************/
    char page;
    char x,y;
    //char char_row;
    //char charpos;
    //char chardata;


    /**********************************************************
                   Function Prototype
    **********************************************************/
    void lcd_write_dorc(char byteforlcd);
    void lcd_write_command(char byteforlcd_command);
    void lcd_write_data(char byteforlcd_data);
    void lcd_gotoxy(char lcd_row, char lcd_col);    //go to lcd_row / 0-8; and lcd_col / 0-95
    //void lcd_pixel(char x, char y);   // not used.
    void lcd_chr(char charsel, char attribute);
    void lcd_str(const char *str, char attribute);
    void lcd_reset(void);
    void lcd_cls(void);
    void lcd_init(void);
    void mcu_init(void);
    void DelayUs(int);
    void DelayMs(int);


    /********************************************************
                  ASCII table for 5x7 dots font
    ********************************************************/

    const char Char_Table [] = {
                      0x00,0x00,0x00,0x00,0x00,  // 20 space
                      0x00,0x00,0x5f,0x00,0x00,  // 21 !
                      0x00,0x07,0x00,0x07,0x00,  // 22 "
                      0x14,0x7f,0x14,0x7f,0x14,  // 23 #
                      0x24,0x2a,0x7f,0x2a,0x12,  // 24 $
                      0x23,0x13,0x08,0x64,0x62,  // 25 %
                      0x36,0x49,0x55,0x22,0x50,  // 26 &
                      0x00,0x05,0x03,0x00,0x00,  // 27 '
                      0x00,0x1c,0x22,0x41,0x00,  // 28 (
                      0x00,0x41,0x22,0x1c,0x00,  // 29 )
                      0x14,0x08,0x3e,0x08,0x14,  // 2a *
                      0x08,0x08,0x3e,0x08,0x08,  // 2b +
                      0x00,0x50,0x30,0x00,0x00,  // 2c ,
                      0x08,0x08,0x08,0x08,0x08,  // 2d -
                      0x00,0x60,0x60,0x00,0x00,  // 2e .
                      0x20,0x10,0x08,0x04,0x02,  // 2f /
                      0x3e,0x51,0x49,0x45,0x3e,  // 30 0
                      0x00,0x42,0x7f,0x40,0x00,  // 31 1
                      0x42,0x61,0x51,0x49,0x46,  // 32 2
                      0x21,0x41,0x45,0x4b,0x31,  // 33 3
                      0x18,0x14,0x12,0x7f,0x10,  // 34 4
                      0x27,0x45,0x45,0x45,0x39,  // 35 5
                      0x3c,0x4a,0x49,0x49,0x30,  // 36 6
                      0x01,0x71,0x09,0x05,0x03,  // 37 7
                      0x36,0x49,0x49,0x49,0x36,  // 38 8
                      0x06,0x49,0x49,0x29,0x1e,  // 39 9
                      0x00,0x36,0x36,0x00,0x00,  // 3a :
                      0x00,0x56,0x36,0x00,0x00,  // 3b ;
                      0x08,0x14,0x22,0x41,0x00,  // 3c <
                      0x14,0x14,0x14,0x14,0x14,  // 3d =
                      0x00,0x41,0x22,0x14,0x08,  // 3e >
                      0x02,0x01,0x51,0x09,0x06,  // 3f ?
                      0x32,0x49,0x79,0x41,0x3e,  // 40 @
                      0x7e,0x11,0x11,0x11,0x7e,  // 41 A
                      0x7f,0x49,0x49,0x49,0x36,  // 42 B
                      0x3e,0x41,0x41,0x41,0x22,  // 43 C
                      0x7f,0x41,0x41,0x22,0x1c,  // 44 D
                      0x7f,0x49,0x49,0x49,0x41,  // 45 E
                      0x7f,0x09,0x09,0x09,0x01,  // 46 F
                      0x3e,0x41,0x49,0x49,0x7a,  // 47 G
                      0x7f,0x08,0x08,0x08,0x7f,  // 48 H
                      0x00,0x41,0x7f,0x41,0x00,  // 49 I
                      0x20,0x40,0x41,0x3f,0x01,  // 4a J
                      0x7f,0x08,0x14,0x22,0x41,  // 4b K
                      0x7f,0x40,0x40,0x40,0x40,  // 4c L
                      0x7f,0x02,0x0c,0x02,0x7f,  // 4d M
                      0x7f,0x04,0x08,0x10,0x7f,  // 4e N
                      0x3e,0x41,0x41,0x41,0x3e,  // 4f O
                      0x7f,0x09,0x09,0x09,0x06,  // 50 P
                      0x3e,0x41,0x51,0x21,0x5e,  // 51 Q
                      0x7f,0x09,0x19,0x29,0x46,  // 52 R
                      0x46,0x49,0x49,0x49,0x31,  // 53 S
                      0x01,0x01,0x7f,0x01,0x01,  // 54 T
                      0x3f,0x40,0x40,0x40,0x3f,  // 55 U
                      0x1f,0x20,0x40,0x20,0x1f,  // 56 V
                      0x3f,0x40,0x38,0x40,0x3f,  // 57 W
                      0x63,0x14,0x08,0x14,0x63,  // 58 X
                      0x07,0x08,0x70,0x08,0x07,  // 59 Y
                      0x61,0x51,0x49,0x45,0x43,  // 5a Z
                      0x00,0x7f,0x41,0x41,0x00,  // 5b [
                      0x02,0x04,0x08,0x10,0x20,  // 5c 55
                      0x00,0x41,0x41,0x7f,0x00,  // 5d ]
                      0x04,0x02,0x01,0x02,0x04,  // 5e ^
                      0x40,0x40,0x40,0x40,0x40,  // 5f _
                      0x00,0x01,0x02,0x04,0x00,  // 60 `
                      0x20,0x54,0x54,0x54,0x78,  // 61 a
                      0x7f,0x48,0x44,0x44,0x38,  // 62 b
                      0x38,0x44,0x44,0x44,0x20,  // 63 c
                      0x38,0x44,0x44,0x48,0x7f,  // 64 d
                      0x38,0x54,0x54,0x54,0x18,  // 65 e
                      0x08,0x7e,0x09,0x01,0x02,  // 66 f
                      0x0c,0x52,0x52,0x52,0x3e,  // 67 g
                      0x7f,0x08,0x04,0x04,0x78,  // 68 h
                      0x00,0x44,0x7d,0x40,0x00,  // 69 i
                      0x20,0x40,0x44,0x3d,0x00,  // 6a j
                      0x7f,0x10,0x28,0x44,0x00,  // 6b k
                      0x00,0x41,0x7f,0x40,0x00,  // 6c l
                      0x7c,0x04,0x18,0x04,0x78,  // 6d m
                      0x7c,0x08,0x04,0x04,0x78,  // 6e n
                      0x38,0x44,0x44,0x44,0x38,  // 6f o
                      0x7c,0x14,0x14,0x14,0x08,  // 70 p
                      0x08,0x14,0x14,0x18,0x7c,  // 71 q
                      0x7c,0x08,0x04,0x04,0x08,  // 72 r
                      0x48,0x54,0x54,0x54,0x20,  // 73 s
                      0x04,0x3f,0x44,0x40,0x20,  // 74 t
                      0x3c,0x40,0x40,0x20,0x7c,  // 75 u
                      0x1c,0x20,0x40,0x20,0x1c,  // 76 v
                      0x3c,0x40,0x30,0x40,0x3c,  // 77 w
                      0x44,0x28,0x10,0x28,0x44,  // 78 x
                      0x0c,0x50,0x50,0x50,0x3c,  // 79 y
                      0x44,0x64,0x54,0x4c,0x44,  // 7a z
                      0x00,0x08,0x36,0x41,0x00,  // 7b {
                      0x00,0x00,0x7f,0x00,0x00,  // 7c |
                      0x00,0x41,0x36,0x08,0x00,  // 7d }
                      0x10,0x08,0x08,0x10,0x08,  // 7e ~
                      0x78,0x46,0x41,0x46,0x78}; // 7f &brvbar;

                      //7e,43,40,43,7e //&Uuml;
                      //7e,43,42,43,7e //&Ouml;
                      //1e,21,21,71,21 //&Ccedil;
                      //3c,42,53,53,72 //&ETH;

    /********************************************************
                  lcd clear LCD function
    ********************************************************/
    void lcd_cls(void) {
       for (page=0; page<9; page++)              // 9 page, fill display RAM with 0s.
          {
             lcd_write_command(0xB0 | page);   // page address ie:0xB0,0xB1,...,0xB7
             lcd_write_command(0x11);          // 0x11, most  4 bit column address command 0001 0011
             lcd_write_command(0x01);          // 0x02, least 4 bit column address command 0000 0011
             for (x=96; x>0; x--)              // 96 column
                lcd_write_data(0x00);
          }
    }

    /**********************************************************
                   Reset LCD Function
    **********************************************************/
    void lcd_reset(void) {
       IOSET = 1<<lcd_cs;           //select the lcd
       DelayMs(10);
       IOCLR = 1<<lcd_res;      //lcd_res low to reset the display. the lcd going into default state.
       DelayMs(10);                     //give the lcd time to reset.
       IOSET = 1<<lcd_res;      //pulling the lcd out of reset.
       DelayMs(100);
    }

    /**********************************************************
                   Initial LCD Function
    **********************************************************/
    void lcd_init(void) {
       lcd_reset();
       // the following initialization sequence per datasheet. All needs to be done in 5ms. (X) where X is the command on pg 8-56 of datasheet

       lcd_write_command(lcd_normal); // 0b10100110 = 0xA6, lcd in normal display mode (0xA7/0b10100111 negative mode)
       lcd_write_command(lcd_bias_1_over_7); // (11) lcd bias (1/9 0xA2/0b10100010 - 1/7 0xA3/0b10100011)
       lcd_write_command(adc_reverse); // (8) <ADC select> (0xA1/0b10100001 reverse lcd - 0xA0/0b10100000 select normal)
       lcd_write_command(comm_normal); // (15) common output normal (0xC8 reverse)
       lcd_write_command(v5_ratio+2); // (17) V5 resistor ratio, from 0b00100000 to 0b00100111
       lcd_write_command(elec_vol); // (18) electronic volume mode
       lcd_write_command(pow_ctrl+0x0E); // (16) power control set value (contrast level --> 0x00 lightest to 0x3F darkest), from 0b00101000 to 0b00101111.
       //this concludes the mandatory initialization, as specified on pg 8-56 of the datasheet
       
       lcd_write_command(0x2F); // power control set value, from 0b00101000 to 0b00101111. see pg 8-52 of datasheet.
       lcd_write_command(lcd_nop); // nop (command for no-operation, 0b11100011.
       lcd_write_command(0x40); // start line - set the display line start address.
       lcd_write_command(lcd_on); // lcd on - display on. 0xAE: display off.
    //   lcd_write_command(lcd_all_on); // lcd all points on - turn on all pixels. 0xA4: normal display.
       DelayMs(50);
    //   lcd_write_command(lcd_off); // lcd off - turn display off.

    //   lcd_cls();

    //   lcd_write_command(lcd_on); // lcd on
    //   lcd_write_command(lcd_all_off); // lcd normal display mode


    }

    /**********************************************************
                   sent 8 bit data to LCD by series
    **********************************************************/
    void lcd_write_dorc(char byteforlcd) { // same lcdai 3310
     
      char caa;
       for (caa=8;caa>0;caa--)
       {
          IOCLR=1<<lcd_sclk;    //data sent on the rising edge of sclk line
    //      DelayUs(2);
          if ((byteforlcd&0x80)==0) // tramission starts from D7, D6, .., D1, D0. if D7 is 0, send 0.
             {IOCLR=1<<lcd_sda;}
          else
             {IOSET=1<<lcd_sda;}
             
          IOSET=1<<lcd_sclk;    //clock out the data
          byteforlcd=byteforlcd<<1; //shift left the next bit.
       }
     
    }

    /**********************************************************
                  Sent Command to LCD Function
    **********************************************************/
    void lcd_write_command(char byteforlcd_command) {
       IOCLR=1<<lcd_dc;   // dc=0 signals lcd command mode. A0 in the datasheet. dc=data or command.
       IOCLR=1<<lcd_cs;   // chip enabled, negative logic. _cs
       lcd_write_dorc(byteforlcd_command);  //send the command.
       IOSET=1<<lcd_cs;   // chip disabled
    }

    /**********************************************************
                   Sent Data to LCD Function
    **********************************************************/
    void lcd_write_data(char byteforlcd_data) {
       IOSET=1<<lcd_dc;   // display data mode. A0 in the datasheet. dorc=data or command.
       IOCLR=1<<lcd_cs;   // chip enabled, negative logic. _cs
       lcd_write_dorc(byteforlcd_data); //send the data.
       IOSET=1<<lcd_cs;   // chip disabled
    }

    /**********************************************************
                   goto xy position on LCD Function
    **********************************************************/
    void lcd_gotoxy(char lcd_row, char lcd_col) {   //lcy_row: 0 - 8 (8th column has only 1 line / D0, lcd_col: 0 - 15.
       char col_addr;
       lcd_write_command(0xB0 + lcd_row);           // page address set. pg 8-48 in the datasheet.
       col_addr = lcd_1st_col+(lcd_col*6);                  // each font has five columns + 1 blank column. xaddr: 0 - 95 on nokia 7110. no offset.
         //lcd_1st_col=0x12: the first column of display starts here. Weird! the datasheet didn't mention it.
       lcd_write_command(0x10 | (col_addr>>4));        // column address 4 most bit set
       lcd_write_command(0x0f & col_addr);             // column address 4 least bit set
    }

    /**********************************************************
               Convert bitmap to charractor Function
    **********************************************************/
    void lcd_chr(char charsel, char attribute) {
        char char_row, char_data;
        int char_pos;

       if (charsel < 0x20) return;
       if (charsel > 0x7f) return;  //check for illegal characters

       for (char_row = 0; char_row < 5; char_row++) // 5 bytes
          {
             char_pos=charsel-0x20;
             char_data=Char_Table[char_pos*5+char_row];
    //         lcd_write_data(~char_data);            // send font data to lcd, white char on black background
                        if(attribute == REVERSE)
                            lcd_write_data(~char_data);            // send font data to lcd
                        else
                            lcd_write_data(char_data | attribute);

          }
    //   lcd_write_data(~0x00); // blank side pixels for each font, white char on black background
            if (attribute == REVERSE)
                lcd_write_data(~0x00);
            else
                lcd_write_data(0x00 | attribute); // blank side pixels for each font
    }

    /**********************************************************
               Write a string at current screen position
    **********************************************************/
    void lcd_str(const char *str, char attribute) {

      while (*str)
            lcd_chr(*str++, attribute);
       
    }

    /**********************************************************
      delay routines
    ***********************************************************/

    void DelayUs(int us) {
        for (; us>0; us--);
    }

    void DelayMs(int ms) {
        for (; ms>0; ms--)
            DelayUs(1000);
    }

    void mcu_init(void) {
    // need to initialize the mcu here.
        PINSEL0=0x00;
        IODIR=0xff;     //pin p0.0..p0.7 used for gpio.
       
    }

    /*****************************************************************
                      Main Progarm
    *****************************************************************/

    int main(void)
    {
     
       mcu_init();
       lcd_init();
        while (1) {
    //      lcd_chr('c');
    //      lcd_chr('b');

            lcd_gotoxy(0,0);
        lcd_str("0-XYZ[]^_`abc", NORMAL);
            lcd_gotoxy(1,0);
            lcd_str("1-XYZ[]^_abc", NORMAL);
    /*      lcd_gotoxy(2,0);
            lcd_str("2-hello, world!", OVERLINE);
            lcd_gotoxy(3,0);
            lcd_str("3-ABCDEFGHIJKLMN", UNDERLINE);
            lcd_gotoxy(4,0);
            lcd_str("4-abcdefghijklmn", STRIKE);
            lcd_gotoxy(5,0);
            lcd_str("5-OPQRSTUVWXYZ", OVERLINE | STRIKE);
            lcd_gotoxy(6,0);
            lcd_str("6-opqrstuvwxyz", UNDERLINE | STRIKE);
            lcd_gotoxy(7,0);
            lcd_str("7-  BYE BYE", STRIKE | OVERLINE | UNDERLINE | REVERSE);
    */
    //      lcd_gotoxy(8,0);
    //      lcd_str("0-HELLO, WORLD!", NORMAL);


    //      lcd_cls();
        }
    }

    /*void main(void) {
        while (1){
            //TODO Auto-generated main function
        }
    }
    */
     
     

    Attached Files:

  12. AtomSoft

    AtomSoft Well-Known Member

    Joined:
    Feb 7, 2008
    Messages:
    5,670
    Likes:
    41
    Location:
    Brooklyn, NY US
    cool nice work! glad to here it works! Thanks for the code too! i will be on the LPC2378 in about 2 weeks and this will help a lot!
     
    Last edited: Jun 18, 2009
  13. AtomSoft

    AtomSoft Well-Known Member

    Joined:
    Feb 7, 2008
    Messages:
    5,670
    Likes:
    41
    Location:
    Brooklyn, NY US
    Just wanted to addon that little stuff on bottom right was indeed a isis type glitch..
     

    Attached Files:

  14. millwood

    millwood Banned

    Joined:
    Jun 17, 2009
    Messages:
    191
    Likes:
    2
    and it only shows up if you write to Page 0 - the very top row.
     
  15. AtomSoft

    AtomSoft Well-Known Member

    Joined:
    Feb 7, 2008
    Messages:
    5,670
    Likes:
    41
    Location:
    Brooklyn, NY US
  16. millwood

    millwood Banned

    Joined:
    Jun 17, 2009
    Messages:
    191
    Likes:
    2
    given that there are so many CRT monitors around, has anyone done a VGA display library? it would be interesting to reuse those old CRTs for something.
     
  17. AtomSoft

    AtomSoft Well-Known Member

    Joined:
    Feb 7, 2008
    Messages:
    5,670
    Likes:
    41
    Location:
    Brooklyn, NY US
    Last edited: Jun 18, 2009
  18. AtomSoft

    AtomSoft Well-Known Member

    Joined:
    Feb 7, 2008
    Messages:
    5,670
    Likes:
    41
    Location:
    Brooklyn, NY US
  19. AtomSoft

    AtomSoft Well-Known Member

    Joined:
    Feb 7, 2008
    Messages:
    5,670
    Likes:
    41
    Location:
    Brooklyn, NY US
  20. AtomSoft

    AtomSoft Well-Known Member

    Joined:
    Feb 7, 2008
    Messages:
    5,670
    Likes:
    41
    Location:
    Brooklyn, NY US
    arg!!!! i just broke both my Nokia 7110 LCDs by accident... I dropped a hammer on my desk and both where there and now its sand :(
     
  21. millwood

    millwood Banned

    Joined:
    Jun 17, 2009
    Messages:
    191
    Likes:
    2
    here is the content of the files + the entire project folder for uvision3.

    enjoy.
     

    Attached Files:

Share This Page