Jason at AtomSoft sent me a couple Nokia 7110 LCDs. Thanks Jason! They're nice cheap little 96x65 monochrome graphic LCD's if you can find them. In this project I build a breadboard connector for the display and write some PIC 18LF1330 code and some 18F2550 code to drive the display

I made a connector out of a turned-pin 14-pin IC socket, matching the LCD's pinout.

Since I have no idea where to get a socket for the connector, I just soldered wire-wrap wire directly to the connector. Works ok. At right is a pinout diagram. The pinout is as follows:

  1. Temp sensor 47K (at 25C)
  2. _CS
  3. Speaker_p
  4. D/_C
  5. SCLK (max 3.2MHz at Vlogic=+2.8V
  6. Speaker_n
  7. On/Off
  8. Led -
  9. Led +
  10. GND
  11. GND
  12. Vlogic (+2.8V)
  13. SDATA
  14. _RESET

Video of the 7110 LCD being driven with a PIC 18LF1330:

The 18LF1330 (and many other smaller PICs) doesn't have enough RAM to do a frame buffer for graphics, so I built a font and coded to use the LCD as a 16-char x 8-line text LCD. The small PICs could also easily do static graphics, but any kind of real animation is ridiculously difficult and slow without more RAM. At the bottom of this page (below the 18LF1330 code) I'll post some 18F2550 code that does animated graphics.

The 18LF1330 PIC is a low power device, and runs fine at 3.3V or less. But it wants to be programmed at no less than 4.5V. Hitting this 2.8-3.0V LCD with 4.5V worries me (might let the magic smoke out), so I unplug the display while writing the chip. Then I switch back to 3.3V and run it.

Here's the 18LF1330 code (header file at the bottom):
#include "7110_lcd.h"

char string[] = "                ";

void main()
{
    unsigned char x,y;
    int count;
    osccon = 0x72;          //set int osc to 8MHz
    trisa = trisb = 0;
    adcon1 = 0b00001111;    //all digital
    lcd_init();
    lcd_string("Coded by futz:  ",0);
    lcd_string("Nokia 7110 LCD  ",2);
    lcd_string("Powered by      ",4);
    lcd_string("PIC 18F1330     ",5);
    while(1){
        for(count=0;count<0xffff;count++){
            sprintf(string,"Count: %07u",count);
            lcd_string(string,7);
            delay_ms(50);
        }
    }
}

void lcd_string(const char *str,unsigned char row){
    unsigned char x,page = 0xb0;
    page = page + row;
    lcd_send(page,0);       //page address
    lcd_send(0x11,0);       //column address
    lcd_send(0x02,0);
    while(*str)
        lcd_char(*str++);
}

void lcd_char(unsigned char letter){
    unsigned char col;
    if(letter < 0x52){
        letter = letter - 0x20;
        for(col=0;col<5;col++){
            lcd_send(Alpha1[(letter*5)+col],1);
        }
    }
    else{
        letter = letter - 0x52;
        for(col=0;col<5;col++){
            lcd_send(Alpha2[(letter*5)+col],1);
        }
    }
    lcd_send(0,1);                          //send space
}

void lcd_send(unsigned char cmd, unsigned char type){
    char x;
    if(type)                //set char/data type
        DATACHAR = 1;
    else
        DATACHAR = 0;
    CS = 0;
    for(x=0;x<9;x++){       //clock the byte out
        SCLK = 0;
        SDATA = 0;
        if(cmd & 0x80)
            SDATA = 1;
        SCLK = 1;
        cmd <<= 1;
    }
    CS = 1;
}

void lcd_cls(void){
    unsigned char i,x,line;
    line = 0xb0;                //page address variable
    for(x=0;x<9;x++){
        lcd_send(line,0);       //set page address
        lcd_send(0x11,0);       //set column address
        lcd_send(0x02,0);
        for(i=0;i<0x60;i++){    //write zeros to display RAM
            lcd_send(0x00,1);
        }
        line++;
    }
}

void lcd_row_cls(unsigned char row){
    unsigned char x,page = 0xb0;
    page = page + row;
    for(x=0;x<0x60;x++)
        lcd_send(0x00,1);
}

void lcd_init(void){
    DATACHAR = 1;
    delay_ms(2);
    CS = 1;
    delay_ms(2);
//    RST = 1;
    delay_ms(2);
    lcd_send(0xa6,0);   //Display: Normal
    lcd_send(0xA3,0);   //LCD Bias Settings: 1/7
    lcd_send(0xA1,0);   //ADC Selection: Reverse
    lcd_send(0xC0,0); //Common Output: Normal Direction
//    lcd_send(0xC8,0); //Common Output: Upside Down
    lcd_send(0x22,0);   //Set the V5 output Voltage
    lcd_send(0x81,0);   //set Electronic Volume - brightness
    lcd_send(0x2f,0);
    lcd_send(0x2E,0);   //Power Controller Set: Booster circuit: ON
    //Voltage regulator circuit: ON
    //Voltage follower circuit: OFF
    lcd_send(0x2F,0);   //Power Controller Set: Voltage follower circuit: ON
//    lcd_send(0xE3,0);   //Non-OPeration Command
//    lcd_send(0x40,0);   //Set the start line
    lcd_send(0xAF,0);   //LCD On
    lcd_send(0xA4,0);   //Display All Points: NORMAL
    lcd_cls();
}
7110_lcd.h
#include <system.h>
#include <stdio.h>
#pragma    CLOCK_FREQ    8000000
#pragma DATA    _CONFIG1H, _OSC_INTIO2_1H
#pragma DATA    _CONFIG2H, _WDT_OFF_2H
#pragma DATA    _CONFIG3H, _MCLRE_ON_3H

#define CS      lata.3
#define DATACHAR    latb.0
#define SCLK    latb.1
#define SDATA   latb.4

void lcd_cls(void);
void lcd_row_cls(unsigned char);
void lcd_init(void);
void lcd_send(unsigned char, unsigned char);
void lcd_char(unsigned char);
void lcd_string(const char *,unsigned char);

rom char *Alpha1 = {
                  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

rom char *Alpha2 = {
                  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;

Next Post Previous Post