完整地NOKIA5110液晶51单片机驱动程序.docx
《完整地NOKIA5110液晶51单片机驱动程序.docx》由会员分享,可在线阅读,更多相关《完整地NOKIA5110液晶51单片机驱动程序.docx(25页珍藏版)》请在冰豆网上搜索。
完整地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--
|