NOKIA显示屏PROTEUS仿真
#include<pic.h>
#include<stdio.h>
#define nok_sda RB1
#define nok_sclk RB2
#define nok_dc RB3
#define nok_cs RB4
#define nok_res RB0
#define BYTE char
//#define negative_lcd nokia_write_command(0xA7)
//#define normal_lcd nokia_write_command(0xA6)
/**********************************************************
Global Variable
**********************************************************/
char temperature;
char page;
char x,y;
char char_row;
char charpos;
char chardata;
/**********************************************************
Program Prototype
**********************************************************/
void nokia_write_dorc(unsigned char bytefornokia);//发送8bits数据,高位先发
void nokia_write_command(unsigned char bytefornokia_command);//发送命令
void nokia_write_data(unsigned char bytefornokia_data);//发送数据
void nokia_gotoxy(char lcd_row,char lcd_col);//用这个函数来定位
void lcdpixel(char x,char y,unsigned char data);//在(X,Y)处写数据
void lcd_str(const char *str); //显示字符串
void lcd_chr(char charsel);//调用ASCII字库函数
void dis_nokialcd(char x,char y,const char *str);//在(X,Y)处显示字符串
void nokia_reset(void);//LCD RESET
void nokia_cls(void);//LCD CLEAR
void nokia_init(void);//LCD 初始化
void lcd_photo(void);//图形处理程序
void lcd_temperature(char tempera);//温度计显示
void dis_temperature(void);//温度值LCD显示
void lcd_distimer(char x,char y,char data);//时间显示函数
/***************************
软件延时程序
****************************/
void delay_us(char n)//延时微妙函数
{
char j;
j = n;
while( j > 0)
{
j --;
NOP(); NOP();NOP();NOP();
}
}
void delay_ms(unsigned int n)
{
unsigned int j;
char k;
for( j = 0; j < n; j++)
for( k =246; k > 0; k--)
NOP();
}
/********************************************************
Nokia clear LCD function
********************************************************/
void nokia_cls() {
for (page=0; page<9; page++) // 9 page
{
nokia_write_command(0xB0 | page); // page address ie:0xB0,0xB1,...,0xB7
nokia_write_command(0x11); // most 4 bit column address command 0001 0011
nokia_write_command(0x02); // least 4 bit column address command 0000 0011
for (x=96; x>0; x--) // 96 column
nokia_write_data(0x00);
}
}
/**********************************************************
Reset LCD Function
**********************************************************/
void nokia_reset() {
nok_cs=1;
delay_ms(10);
nok_res=0;
delay_ms(10);
nok_res=1;
delay_ms(100);
}
/**********************************************************
Initial LCD Function
**********************************************************/
void nokia_init() {
nokia_reset();
nokia_write_command(0xA6); // lcd in normal display mode (0xA7 negative mode)
nokia_write_command(0xA3); // lcd bias (1/9 0xA2 - 1/7 0xA3)
nokia_write_command(0xA1); // <ADC select> (0xA1 reverse lcd - 0xA0 select normal)
nokia_write_command(0xC0); // common output normal (0xC8 reverse)
nokia_write_command(0x22); // V5 resistor ratio
nokia_write_command(0x81); // electronic volume mode
nokia_write_command(0x2E); // power control set value (contrast level --> 0x00 lightest to 0x3F darkest)
nokia_write_command(0x2F); // power control set value
nokia_write_command(0xE3); // nop
nokia_write_command(0x40); // start line set
nokia_write_command(0xAF); // lcd on
nokia_write_command(0xA5); // lcd all points on
delay_ms(500);
nokia_write_command(0xAE); // lcd off
nokia_cls();
nokia_write_command(0xAF); // lcd on
nokia_write_command(0xA4); // lcd normal display mode
}
/**********************************************************
sent 8 bit data to LCD by series
**********************************************************/
void nokia_write_dorc(unsigned char bytefornokia) { // same nokai 3310
char caa;
for (caa=8;caa>0;caa--)
{
nok_sclk=0;
//delay_us(2);
delay_us(3);
if ((bytefornokia&0x80)==0)
{nok_sda=0;}
else
{nok_sda=1;}
nok_sclk=1;
bytefornokia=bytefornokia<<1;
}
}
/**********************************************************
Sent Command to LCD Function
**********************************************************/
void nokia_write_command(unsigned char bytefornokia_command) {
nok_dc=0; // lcd command mode
nok_cs=0; // chip enabled
nokia_write_dorc(bytefornokia_command);
nok_cs=1; // chip disabled
}
/**********************************************************
Sent Data to LCD Function
**********************************************************/
void nokia_write_data(unsigned char bytefornokia_data) {
nok_dc=1; // display data mode
nok_cs=0; // chip enabled
nokia_write_dorc(bytefornokia_data);
nok_cs=1; // chip disabled
}
/**********************************************************
goto xy position on LCD Function
**********************************************************/
void nokia_gotoxy(char lcd_row, char lcd_col) //可以定点到具体位置,如果要显示字符的话
//需要重新定义一个5宽度限制的函数
//注意:行0-8,列0-95
{ //lcy_row: 0 - 8 (8th column has only 1 line / D0, lcd_col: 0 -95
char col_addr;
nokia_write_command(0xB0 + lcd_row); // page address set. pg 8-48 in the datasheet.
col_addr = 0x12+(lcd_col); // 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.
nokia_write_command(0x10 | (col_addr>>4)); // column address 4 most bit set
nokia_write_command(0x0f & col_addr); // column address 4 least bit set
}
/**********************************************************
在xy位置写一个字节
**********************************************************/
void lcdpixel(char x,char y,unsigned char data)// 左下角为(0,0) x 0-75 有个bug
// y 0-63
{
nokia_gotoxy(x,y);
nokia_write_data(data);
}
/******************************
Write a String To Nokia Lcd
*******************************/
void lcd_str(const char *str)
{
while(*str > 0)
{
lcd_chr(*str);
str ++;
}
}
/********************************
Write a string at(x,y)
***********************************/
void dis_nokialcd(char x,char y,const char *str)//具体坐标(X,Y)显示字符串
{
nokia_gotoxy(x,y);
lcd_str(str);
}