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:
- Temp sensor 47K (at 25C)
- _CS
- Speaker_p
- D/_C
- SCLK (max 3.2MHz at Vlogic=+2.8V
- Speaker_n
- On/Off
- Led -
- Led +
- GND
- GND
- Vlogic (+2.8V)
- SDATA
- _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 ¦