Code Here
//#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 ¦
//7e,43,40,43,7e //Ü
//7e,43,42,43,7e //Ö
//1e,21,21,71,21 //Ç
//3c,42,53,53,72 //Ð
/********************************************************
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
}
}
*/
/*****************************************************************
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();
}
}
do me 1 favor try printing this to the LCD:
This should help me think better. Show a image when done please.Code:lcd_gotoxy(1,0); lcd_str("XYZ[\]^_`abc", NORMAL);
lcd_str("XYZ[\\]^_`abc", NORMAL);
oh and for the extra bits that appear in bottom left try clearing the screen before first write.
[/code]
lcd_write_command(comm_reverse); // (15) common output normal (0xC8 reverse)
if I change the code to
Code:lcd_str("XYZ[\\]^_`abc", NORMAL);
note the "\\" because "\" is the escape sequence in C.
the output is perfectly normal.
lcd_gotoxy(0,0);
lcd_str("0-XYZ[\\]^_`abc", NORMAL);
lcd_gotoxy(1,0);
lcd_str("1-XYZ[\\]^_abc", NORMAL);
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
try removing some of the comments from the font
Code: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?
try removing some of the comments from the font
Code: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?
0x02,0x04,0x08,0x10,0x20, // 5c \
0x02,0x04,0x08,0x10,0x20, // 5c 55
//#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 ¦
//7e,43,40,43,7e //Ü
//7e,43,42,43,7e //Ö
//1e,21,21,71,21 //Ç
//3c,42,53,53,72 //Ð
/********************************************************
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
}
}
*/
Just wanted to addon that little stuff on bottom right was indeed a isis type glitch..
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?