为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

诺基亚5110液晶使用及显示程序实例

2017-10-22 28页 doc 376KB 15阅读

用户头像

is_003124

暂无简介

举报
诺基亚5110液晶使用及显示程序实例诺基亚5110液晶使用及显示程序实例 该模块具有以下特点: ?84x48 的点阵LCD,可以显示4 行汉字, ?采用串行接口与主处理器进行通信,接口信号线数量大幅度减少,包括电源和地在内的信号线仅有9 条。支持多种串行通信协议(如AVR 单片机的,,I、MCS51 的串口模式, 等),传输速率高达4Mbps,可全速写入显示数据,无等待时间。 ?可通过导电胶连接模块与印制版,而不用连接电缆,用模块上的金属钩可将模块固定到印 制板上,因而非常便于安装和更换。 ?LCD 控制器,驱动器芯片已绑定到LCD 晶片上,模块的体积很...
诺基亚5110液晶使用及显示程序实例
诺基亚5110液晶使用及显示程序实例 该模块具有以下特点: ?84x48 的点阵LCD,可以显示4 行汉字, ?采用串行接口与主处理器进行通信,接口信号线数量大幅度减少,包括电源和地在内的信号线仅有9 条。支持多种串行通信(如AVR 单片机的,,I、MCS51 的串口模式, 等),传输速率高达4Mbps,可全速写入显示数据,无等待时间。 ?可通过导电胶连接模块与印制版,而不用连接电缆,用模块上的金属钩可将模块固定到印 制板上,因而非常便于安装和更换。 ?LCD 控制器,驱动器芯片已绑定到LCD 晶片上,模块的体积很小。 ?采用低电压供电,正常显示时的工作电流在200μA 以下,且具有掉电模式。 LPH7366 的这些特点非常适合于电池供电的便携式通信设备和测试设备中 C8051F学习笔记:Nokia 5110驱动 Nokia5110是一款经典机型,可能由于经典的缘故,旧机器很多,所以很多电子工程师就把旧机器的屏幕拆下来,自己驱动Nokia5110,用于开发的设备显示,取代LCD1602。 使用Nokia5110液晶的四大理由 1) 性价比高,LCD1602可以显示32个字符,而Nokia5110可以显示15个汉 字,30个字符。Nokia5110裸屏仅8.8元,LCD1602一般15元左右,LCD 12864一般50~70元。 2) 接口简单,仅四根I/O线即可驱动,LCD1602需11根I/O线,LCD12864 需12根。 3) 速度快,是LCD12864的20倍,是LCD1602的40倍。 4) Nokia5110工作电压3.3V,正常显示时工作电流200uA以下,具有掉电模 式,适合电池供电的便携式移动设备。 可以在市场上买到Nokia5110的裸屏和带PCB的Nokia5110屏幕,因为Nokia5110是不带背光的,所以通常商家会在PCB上按了几个背光LED,上电就能亮,建议大家还是买那种连上PCB的5110。 Nokia5110原理图: 商家把该引出的管脚都引出了,下面就可以连接C8051F的相应管脚,写程序驱动5110了。 Nokia5110和Nokia3110是兼容的,用的都是同一款驱动芯片PHILIPS PCD8544。 (1) SPI接口时序写数据/命令 Nokia5110(PCD8544)的通信协议是一个没有MISO只有MOSI的SPI协议,如果单片机有富裕的SPI接口,也可以利用硬件SPI,但通常没有必要,只需要软件程序模拟即可。 /*********************************************************** 函数名称:LCD_write_byte 函数功能:模拟SPI接口时序写数据/命令LCD 入口参数:data :写入的数据; command :写数据/命令选择; 出口参数:无 备 注: ***********************************************************/ void LCD_write_byte(unsigned char dat, unsigned char command) { unsigned char i; LCD_CE = 0; //5110片选有效,允许输入数据 if (command == 0) //写命令 LCD_DC = 0; else LCD_DC = 1; //写数据 for(i=0;i<8;i++) //传送8bit数据 { if(dat&0x80) SDIN = 1; else SDIN = 0; SCLK = 0; dat = dat << 1; SCLK = 1; } LCD_CE = 1; //禁止5110 } 管脚D/C(LCD_DC)用于选择写的是命令(D/C=0)还是数据(D/C=1)。 (2) Nokia5110的初始化 接通电源后,内部寄存器和RAM的内容是不确定的,这需要一个RES低电平脉冲复位一下。当VDD变为高电平,达到VDDmin(或更高)之后,最多100ms,RST输入低电平(电平幅度<0.3VDD)。 5110复位时序 /*********************************************************** 函数名称:LCD_init 函数功能:5110初始化 入口参数:无 出口参数:无 备 注: ***********************************************************/ void LCD_init(void) { LCD_RST = 0; // 产生一个让LCD复位的低电平脉冲 delay_1us(); LCD_RST = 1; LCD_CE = 0; // 关闭LCD delay_1us(); LCD_CE = 1; // 使能LCD delay_1us(); LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式 LCD_write_byte(0xc8, 0); // 设置液晶偏置电压 LCD_write_byte(0x06, 0); // 温度校正 LCD_write_byte(0x13, 0); // 1:48 LCD_write_byte(0x20, 0); // 使用基本命令,V=0,水平寻址 LCD_clear(); // 清屏 LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示 LCD_CE = 0; // 关闭LCD } (3)设置Nokia5110液晶的坐标 Nokia5110(PCD8544)的命令集: 命令字符解释: 要注意的是“功能设置”命令的“H”和“V”。 H=0使用基本指令集命令,H=1使用扩展指令集命令。 V=0水平寻址,V=1垂直寻址。 48*84点阵的格式如上图,数据以字节8bit为单位下载到PCD8544的48*84bit显示数据RAM矩阵。列通过地址指针寻址,地址范围为X 0~83(1010011),Y 0~5(101)。地址不允许超过这个范围。 在垂直寻址(V=1),Y地址在每个字节之后递增,经最后的Y地址(Y=5)之后,Y绕回0,X递增到下一列的地址。 在水平寻址模式(V=0),X地址在每个字节之后递增,经最后的X地址(X=83)之后,X绕回0,Y递增到下一行的地址。 经每一个最后地址之后(X=83,Y=5),地址指针绕回地址(X=0,Y=0)。 /*********************************************************** 函数名称:LCD_set_XY 函数功能:设置LCD坐标函数 入口参数:X :0,83 Y :0,5 出口参数:无 备 注: ***********************************************************/ void LCD_set_XY(unsigned char X, unsigned char Y) { LCD_write_byte(0x40 | Y, 0); // column LCD_write_byte(0x80 | X, 0); // row } (4)显示英文字符 英文字符占用6*8个点阵,通过建立一个ASCII的数组font6x8[][6]来寻址。而这个数字的行号对应(字符ASCII码-32)。ASCII码如下: /*********************************************************** 函数名称:LCD_write_char 函数功能:显示英文字符 入口参数:c : 显示的字符 出口参数:无 备 注: ***********************************************************/ void LCD_write_char(unsigned char c) { unsigned char line; c -= 32; //数组的行号 for (line=0; line<6; line++) LCD_write_byte(font6x8[c][line], 1); } 如要在NOKIA5110输出大写“A”,对应数组的行号为33,对应的元素为 { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C },水平寻址(V=0) NOKIA5110 一行可以显示14个字符,可以显示六行。 (5)显示汉字 显示汉字可以采用两种点阵方式,一种是12*12点阵,一种是16*16点阵, 网上也有一个自动提取字模的小软件“3310液晶显示屏汉字提取程序”,这个 小程序只适用于水平寻址(V=0)。 3310液晶显示屏汉字提取程序 下载: 采用12*12点阵汉字时,由于不是8的整数倍数,因此行与行之间只能隔 开,这样才能完整显示一个汉字。 //欢 {0x0A,0x92,0x62,0x9E,0x02,0x18,0x87,0x74,0x84,0x14,0x0C,0x00,0x02,0x0 1,0x00,0x04,0x05,0x02,0x01,0x00,0x01,0x02,0x04,0x00}, 12*12点阵 (6)显示图形 显示的图形像素大小不能超过84*48。也有一个字模提取小软件Zimo21可以帮助我们得到图像的像素数组。但要注意Zimo21软件的设置,不然的话就显示不了想要的图片。 Zimo21设置 要注意选中“纵向取模”“字节倒序”这样才能在5110上显示正确的图 像。 /*********************************************************** 函数名称:LCD_draw_bmp_pixel 函数功能:位图绘制函数 入口参数:X、Y :位图绘制的起始X、Y坐标; *map :位图点阵数据; Pix_x :位图像素(长) Pix_y :位图像素(宽) 出口参数:无 备 注: ***********************************************************/ void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned cha r *map, unsigned char Pix_x,unsigned char Pix _y) { unsigned int i,n; unsigned char row; //计算位图所占行数 if (Pix_y%8==0) //如果为位图所占行数为整数 row=Pix_y/8; else row=Pix_y/8+1; //如果为位图所占行数不是整数 LCD_set_XY(X,Y); for (n=0;n { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @ { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [ { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55 { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ] { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // ' { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t { 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u { 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v { 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x { 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y { 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // horiz lines }; /*********************************************************************** 程序名称: nokia.c 程序功能: nokia5110驱动程序 程序说明: /**********************************************************************/ #include #include #include #include"code_table.c" #define uchar unsigned char #define uint unsigned int //位操作定义 #define SCLK _PA5 #define SDIN _PA4 #define LCD_DC _PA3 #define LCD_CE _PA2 #define LCD_RST _PA1 //函数声明 void delay_us(uint t); void delay_ms(uint t); void LCD_init(void); void LCD_clear(void); void LCD_write_english_string(uchar X,uchar Y,char *s); void LCD_write_char(uchar c); void LCD_write_byte(uchar dat, uchar dc); void LCD_set_XY(uchar X, uchar Y); /*********************************************************************** * 函数名称:delay_us() * 函数功能:16M晶振,延时t微秒 * 入口参数:t 延时t微秒 * 出口参数:无 ***********************************************************************/ void delay_us(uint t) { uint i,j; for(i=t;i>0;i--) for(j=1;j>0;j--); } /********************************************************************** * 函数名称:delay_ms() * 函数功能:16M晶振,延时t毫秒 * 入口参数:t 延时t毫秒 * 出口参数:无 ***********************************************************************/ void delay_ms(uint t) { uint i,j; for(i=t;i>0;i--) for(j=2670;j>0;j--); } /********************************************************************** * 函数名称:LCD_init() * 函数功能:初始化nokia5110 * 入口参数:无 * 出口参数:无 **********************************************************************/ void LCD_init(void) { LCD_RST = 0; // 产生一个让LCD复位的低电平脉冲 delay_us(1); LCD_RST = 1; LCD_CE = 0;// 关闭LCD delay_us(1); LCD_CE = 1;// 使能LCD delay_us(1); LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式 LCD_write_byte(0xc8, 0); // 设置偏置电压 LCD_write_byte(0x06, 0); // 温度校正 LCD_write_byte(0x13, 0); // 1:48 LCD_write_byte(0x20, 0); // 使用基本命令 LCD_clear(); // 清屏 LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示 LCD_CE = 0; // 关闭LCD } /********************************************************************** * 函数名称:LCD_clear() * 函数功能:液晶清屏 * 入口参数:无 * 出口参数:无 **********************************************************************/ void LCD_clear(void) { uint i; LCD_write_byte(0x0c, 0); LCD_write_byte(0x80, 0); for (i=0; i<504; i++) LCD_write_byte(0, 1); } /********************************************************************** * 函数名称:LCD_set_XY() * 函数功能:光标定位x行y列 * 入口参数:X,Y x行y列 * 出口参数:无 **********************************************************************/ void LCD_set_XY(uchar X, uchar Y) { LCD_write_byte(0x40 | Y, 0); // column LCD_write_byte(0x80 | X, 0); // row } /*********************************************************************** * 函数名称:LCD_write_char() * 函数功能:写入1个字符 * 入口参数:c 要写入的数据 * 出口参数:无 **********************************************************************/ void LCD_write_char(uchar c) { uchar line; c -= 32; for (line=0; line<6; line++) LCD_write_byte(font6x8[c][line], 1);//从ACSII码表中读取字节,然后写入液晶 } /*********************************************************************** * 函数名称LCD_write_english_string() * 函数功能:写英文字符串 * 入口参数:X,Y,*S------x行y列*s为英文字符串 * 出口参数:无 ***********************************************************************/ void LCD_write_english_string(uchar X,uchar Y,char *s) { LCD_set_XY(X,Y);//光标定位 while (*s) { LCD_write_char(*s); s++; } } /********************************************************************** * 函数名称:LCD_write_byte() * 函数功能:写一个字节 * 入口参数:dat,要写入的字节;command:0为命令,1为数据 * 出口参数:无 ***********************************************************************/ void LCD_write_byte(uchar dat, uchar command) { uchar i; LCD_CE = 0; if (command == 0) LCD_DC = 0; else LCD_DC = 1; for(i=0;i<8;i++) { if(dat&0x80) SDIN = 1; else SDIN = 0; SCLK = 0; dat = dat << 1; SCLK = 1; } LCD_CE = 1; } /********************************************************************** * 函数名称:LCD_write_chinesee() * 函数功能:写一个汉字 * 入口参数:x,横坐标;y,纵坐标;hz,要显示的汉字 * 出口参数:无 **********************************************************************/ void LCD_write_chinese(unsigned char x, unsigned char y, unsigned char *hz) { unsigned char k,i; for(k=0;k
/
本文档为【诺基亚5110液晶使用及显示程序实例】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索