NOKIA显示屏PROTEUS仿真

xuguopan 2011-05-04 06:12:16
#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);
}
...全文
129 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
一曲肝肠断 2011-05-04
  • 打赏
  • 举报
回复
过来转转 || 帮楼主顶下 || 抢下沙发

70,036

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧