完整的NOKIA5110液晶51单片机驱动程序.docx
- 文档编号:1765218
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:32
- 大小:18.86KB
完整的NOKIA5110液晶51单片机驱动程序.docx
《完整的NOKIA5110液晶51单片机驱动程序.docx》由会员分享,可在线阅读,更多相关《完整的NOKIA5110液晶51单片机驱动程序.docx(32页珍藏版)》请在冰点文库上搜索。
完整的NOKIA5110液晶51单片机驱动程序
/*
***************************************************************
Nokia5110驱动
*说明:
本驱动适用于51单片机(5V或3.3V),液晶的VCC接5V或3.3V
修改偏置电压可改变5110点阵显示的亮度
5110接5V时偏置电压改为(0xa7,0),接3.3V时改为(0xc0,0)
*作者:
JK
*创建日期:
2013/1/26
*修改日期:
***************************************************************
*/
#include
#include"font.h"
#defineuintunsignedint
#defineucharunsignedchar
/*
**********************************************************
IO口定义区
**********************************************************
*/
sbitLCD_RST=P0^0;
sbitLCD_CE=P0^1;
sbitLCD_DC=P0^2;
sbitLCD_DIN=P0^3;
sbitLCD_CLK=P0^4;
/*
**********************************************************
函数声明区
**********************************************************
*/
voidLCD_Init(void);
voidLCD_WriteByte(unsignedchardat,unsignedcharcommand);
voidLCD_Set_XY(unsignedcharX,unsignedcharY);
voidLCD_Clear(void);
voidLCD_WriteChar(unsignedcharx,unsignedchary,unsignedcharc);
voidLCD_WriteString(unsignedcharX,unsignedcharY,char*s);
voidLCD_WriteNum(unsignedcharX,unsignedcharY,unsignedintnum);
voidLCD_Write_12X16Font(unsignedcharx,unsignedchary,unsignedcharc[2]);
voidLCD_DrawPicture(unsignedcharX,unsignedcharY,unsignedcharconst*map,
unsignedcharPix_x,unsignedcharPix_y);
/*
**********************************************************
*函数名:
LCD_Init
*功能:
初始化LCD
*参数:
无
*返回值:
无
*备注:
**********************************************************
*/
voidLCD_Init(void)
{
unsignedchari;
LCD_RST=0;//复位
for(i=0;i<150;i++);
LCD_RST=1;
LCD_WriteByte(0x21,0);//使用扩展命令设置LCD模式
LCD_WriteByte(0xc0,0);//设置偏置电压,修改可改变5110点阵显示的亮度
/*5110接5V时偏置电压改为(0xa7,0),接3.3V时改为(0xc0,0)*/
LCD_WriteByte(0x20,0);//使用基本命令。
并设置V=0,水平寻址
LCD_Clear();//清屏
LCD_WriteByte(0x0c,0);//设定显示模式,正常显示(普通显示)
LCD_CE=0;
}
/*
**********************************************************
*函数名:
LCD_WriteByte
*功能:
模拟SPI接口时序写数据/命令LCD
*参数:
data:
写入的数据;
command:
写数据
(1)/命令选择(0);
*返回值:
无
*备注:
**********************************************************
*/
voidLCD_WriteByte(unsignedchardat,unsignedcharcommand)
{
unsignedchari;
LCD_CE=0;//5110片选有效,允许输入数据
if(command==0)//写命令
LCD_DC=0;
else
LCD_DC=1;//写数据
for(i=0;i<8;i++)//传送8bit数据
{
if(dat&0x80)
LCD_DIN=1;
else
LCD_DIN=0;
LCD_CLK=0;
dat=dat<<1;
LCD_CLK=1;
}
LCD_CE=1;//禁止5110
}
/*
**********************************************************
*函数名:
LCD_Set_XY
*功能:
设置LCD坐标
*参数:
X:
0-83Y:
0-5
*返回值:
无
*备注:
**********************************************************
*/
voidLCD_Set_XY(unsignedcharX,unsignedcharY)
{
LCD_WriteByte(0x40|Y,0);//column列
LCD_WriteByte(0x80|X,0);//row行
}
/*
**********************************************************
*函数名:
LCD_Clear
*功能:
LCD清屏函数
*参数:
无
*返回值:
无
*备注:
**********************************************************
*/
voidLCD_Clear(void)
{
unsignedchart;
unsignedchark;
LCD_Set_XY(0,0);//设置RAM起始地址
for(t=0;t<6;t++)
{
for(k=0;k<84;k++)
{
LCD_WriteByte(0x00,1);
}
}
}
/*
**********************************************************
*函数名:
LCD_WriteChar
*功能:
LCD写一个6X8的字符
*参数:
c
*返回值:
无
备注:
**********************************************************
*/
voidLCD_WriteChar(unsignedcharx,unsignedchary,unsignedcharc)
{
unsignedchari;
c-=32;//数组的行号
LCD_Set_XY(x,y);
for(i=0;i<12;i++)
{
LCD_WriteByte(font6x12[c][i],1);
if(i==5)
{
y++;
LCD_Set_XY(x,y);
}
}
}
/*
**********************************************************
*函数名:
LCD_WriteString
*功能:
LCD写6X8的字符串
*参数:
X,Y,S
*返回值:
无
备注:
**********************************************************
*/
voidLCD_WriteString(unsignedcharX,unsignedcharY,char*s)
{
while(*s)
{
LCD_WriteChar(X,Y,*s);
s++;
X+=6;
}
}
/*
***************************************************************
*函数名:
LCD_WriteNum(unsignedintnum)
*功能:
写入数字
*参数:
num
*返回值:
无
****************************************************************
*/
voidLCD_WriteNum(unsignedcharX,unsignedcharY,unsignedintnum)
{
unsignedcharstr[8],i=0,len=0;
unsignedinttemp;
temp=num;
while(temp)
{
temp/=10;
len++;
}
if(!
num)
{
len++;
str[0]=0x30;
}
str[len]=0;
while(num)
{
str[len-i-1]=num%10+0x30;
num/=10;
i++;
}
LCD_WriteString(X,Y,(char*)str);
}
/*
**********************************************************
*函数名:
LCD_Write_16X16Font
*功能:
写一个16X16的汉字
*参数:
x,y,c[2]x:
0-83y:
0-5
*返回值:
无
*备注:
**********************************************************
*/
voidLCD_Write_12X16Font(unsignedcharx,unsignedchary,unsignedcharc[2])
{
unsignedchari,k;
LCD_Set_XY(x,y);
for(k=0;k<25;k++)//K的值表示汉字库最多存放的字的数量(可改大)
{
if((font12x16[k].Index[0]==c[0])&&(font12x16[k].Index[1]==c[1]))
{
for(i=0;i<24;i++)
{
LCD_WriteByte(font12x16[k].Msk[i],1);
if(i==11)
{
y++;
LCD_Set_XY(x,y);
}
}
}
}
}
/*
**********************************************************
*函数名:
LCD_DrawPicture
*功能:
绘图
*参数:
X、Y:
位图绘制的起始X、Y坐标;
*map:
位图点阵数据;
Pix_x:
位图像素(长)<=84
Pix_y:
位图像素(宽)<=48
*返回值:
无
*备注:
**********************************************************
*/
voidLCD_DrawPicture(unsignedcharX,unsignedcharY,unsignedcharconst*map,
unsignedcharPix_x,unsignedcharPix_y)
{
unsignedinti,n;
unsignedcharrow;
//计算位图所占行数
if(Pix_y%8==0)//如果为位图所占行数为整数
row=Pix_y/8;
else
row=Pix_y/8+1;//如果为位图所占行数不是整数
LCD_Set_XY(X,Y);
for(n=0;n { for(i=0;i { LCD_Set_XY(X+i,Y+n); LCD_WriteByte(map[i+n*Pix_x],1); } } } /* ********************************************************** -------main函数-------- *函数名: 主函数 *备注: ********************************************************** */ voidmain() { LCD_Init(); while (1) { LCD_WriteNum(0,0,123);//写入数字int型的 LCD_WriteNum(18,0,7);//写入数字int型的 LCD_WriteNum(24,0,9); LCD_WriteChar(48,0,'I');//写一个6X8的字符 LCD_WriteChar(54,0,'J'); LCD_WriteChar(60,0,'K'); LCD_WriteString(0,2,"jhf");//写6X8的字符串 LCD_DrawPicture(32,2,gImage_1,16,16);//绘图 LCD_Write_12X16Font(12,4,"我");//写一个16X16的汉字 LCD_Write_12X16Font(24,4,"是"); LCD_Write_12X16Font(36,4,"中"); LCD_Write_12X16Font(48,4,"国"); LCD_Write_12X16Font(60,4,"银"); } } /////////////////////////////////////////以下是font.h的容/////////////////////////////////////////////////// /* ********************************************************** *说明: 该font.h文件中包含的是5110显示所用的ASCII、部分汉字、 及图片字模。 取模软件使用“PCtoLCD2002”,取模方式选项: 阴码、逆向、列行式、十六进制数。 汉字取模: 宽12、高12 ********************************************************** */ //6x8font //1pixelspaceatleftandbottom //index=ASCII-32 codeunsignedcharfont6x12[][12]= { /*--文字: --*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, /*--文字: ! --*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00}, /*--文字: "--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x00,0x0C,0x02,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, /*--文字: #--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x90,0xD0,0xBC,0xD0,0xBC,0x90,0x00,0x03,0x00,0x03,0x00,0x00}, /*--文字: $--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x18,0x24,0xFE,0x44,0x8C,0x00,0x03,0x02,0x07,0x02,0x01,0x00}, /*--文字: %--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x18,0x24,0xD8,0xB0,0x4C,0x80,0x00,0x03,0x00,0x01,0x02,0x01}, /*--文字: &--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0xC0,0x38,0xE4,0x38,0xE0,0x00,0x01,0x02,0x02,0x01,0x02,0x02}, /*--文字: '--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x08,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, /*--文字: (--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x00,0x00,0x00,0xF8,0x04,0x02,0x00,0x00,0x00,0x01,0x02,0x04}, /*--文字: )--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x00,0x02,0x04,0xF8,0x00,0x00,0x00,0x04,0x02,0x01,0x00,0x00}, /*--文字: *--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x90,0x60,0xF8,0x60,0x90,0x00,0x00,0x00,0x01,0x00,0x00,0x00}, /*--文字: +--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x20,0x20,0xFC,0x20,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00}, /*--文字: --*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x00,0x00,0x00,0x00}, /*--文字: ---*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, /*--文字: .--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00}, /*--文字: /--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x00,0x80,0x60,0x1C,0x02,0x00,0x04,0x03,0x00,0x00,0x00,0x00}, /*--文字: 0--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00}, /*--文字: 1--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00}, /*--文字: 2--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*/ /*--高度不是8的倍数,现调整为: 宽度x高度=6x16--*/ {0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00}, /*--文字: 3--*/ /*--宋体9;此字体下对应的点阵为: 宽x高=6x12--*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 NOKIA5110 液晶 51 单片机 驱动程序