诺基亚5110 LCD屏幕驱动程序.docx
《诺基亚5110 LCD屏幕驱动程序.docx》由会员分享,可在线阅读,更多相关《诺基亚5110 LCD屏幕驱动程序.docx(20页珍藏版)》请在冰豆网上搜索。
诺基亚5110LCD屏幕驱动程序
/*******************************************************
文件名:
Nokia5110Lcd.h
描述:
诺基亚5110LCD驱动头文件
作者:
xylch101
编辑器:
Notepad2
日期:
2008年06月27日
*******************************************************/
#ifndefNOKIA_5110_LCD_H
#defineNOKIA_5110_LCD_H
//宽高像素
#defineLCD_X_RES84
#defineLCD_Y_RES48
//管脚配置(atmega16L)自行修改
#defineLCD_DC_PIN(1<<2)//P4.2D/C
#defineLCD_CE_PIN(1<<4)//P4.4/SCE
#defineSPI_MOSI_PIN(1<<1)//P4.1DIN
#defineLCD_RST_PIN(1<<3)//P4.3/RST
#defineSPI_CLK_PIN(1<<0)//P4.0/SCLK
#defineDIN_0()P4OUT&=~SPI_MOSI_PIN
#defineDIN_1()P4OUT|=SPI_MOSI_PIN
#defineSCLK_0()P4OUT&=~SPI_CLK_PIN
#defineSCLK_1()P4OUT|=SPI_CLK_PIN
//P4.0---SCLK
//P4.1---DIN
//P4.2---D/C
//P4.3---/RST
//P4.4--/SCE
typedefunsignedcharbyte;
typedefunsignedintword;
//枚举D/C模式选择
typedefenum
{
DC_CMD=0,//写命令
DC_DATA=1//写数据
}LcdExecType;
//枚举画点类型选择
typedefenum
{
PIXEL_CLEAR=0,//擦除
PIXEL_DRAW=1,//画点
PIXEL_XOR=2//取反
}LcdPixelMode;
//驱动函数声明
voidLcdInit(void);
voidLcdSetContrast(bytecontrast);
voidLcdSetXY(byteX,byteY);
voidLcdExec(bytedata,LcdExecTypecd);
byteUnClear(bytedata,byten);
byteLnClear(bytedata,byten);
voidSplitByte(bytedata,bytenByLow,bytebytes[2]);
voidBufferPixelStuff(bytetype,byteindex,bytex,bytey,bytewidth,byteheight);
voidCacheEnglishString(bytex,bytey,bytewidth,byteheight,bytebWidth,byte*dataPtr);
voidCachePixel(bytex,bytey,LcdPixelModemode);
voidCommitBuffer(void);
voidClearBuffer(void);
#endif
/*******************************************************
文件名:
Nokia5110Lcd.c
描述:
诺基亚5110LCD驱动源文件
作者:
xylch101
编辑器:
Notepad2
日期:
2008年06月27日
*******************************************************/
#include"Nokia5110Lcd.h"
#include"PixelStuff.h"//中、英文字、图片字模
//全屏缓存(6x84bytes)
byteLcdPixelBuffer[LCD_Y_RES/8][84]={{0},{0}};
/*********************************************
函数名:
LcdInit
功能:
LCDSPI初始化
参数:
无
返回:
无
编辑器:
Notepad2
*********************************************/
voidLcdInit(void)
{
P4OUT|=LCD_RST_PIN;
P4DIR|=LCD_RST_PIN|LCD_DC_PIN|LCD_CE_PIN|SPI_MOSI_PIN|SPI_CLK_PIN;
P4OUT&=~LCD_RST_PIN;
P4OUT|=LCD_RST_PIN;
P4OUT|=LCD_CE_PIN;
//设置LCD
LcdExec(0x21,DC_CMD);
LcdExec(0xC8,DC_CMD);
LcdExec(0x06,DC_CMD);
LcdExec(0x13,DC_CMD);
LcdExec(0x20,DC_CMD);
LcdExec(0x0C,DC_CMD);
//清屏
ClearBuffer();
CommitBuffer();
}
/*********************************************
函数名:
LcdSetContrast
功能:
设置LCD对比度
参数:
bytecontrast对比度值:
0~127
返回:
无
编辑器:
Notepad2
*********************************************/
voidLcdSetContrast(bytecontrast)
{
LcdExec(0x21,DC_CMD);
LcdExec(0x80|contrast,DC_CMD);
LcdExec(0x20,DC_CMD);
}
/*********************************************
函数名:
LcdSetXY
功能:
设置LCD当前坐标
参数:
byteX横坐标:
0~83
byteY纵坐标:
0~05
返回:
无
编辑器:
Notepad2
*********************************************/
voidLcdSetXY(byteX,byteY)
{
LcdExec(0x40|Y,DC_CMD);//行
LcdExec(0x80|X,DC_CMD);//列
}
/*********************************************
函数名:
LcdExec
功能:
执行LCD指令/数据
参数:
bytedata指令/数据值
LcdExecTypedc指令/数据选择(DC_CMD/DC_DATA)
返回:
无
编辑器:
Notepad2
*********************************************/
voidLcdExec(bytedata,LcdExecTypedc)
{
unsignedchari=0;
P4OUT&=~LCD_CE_PIN;
if(dc==DC_DATA)
{
P4OUT|=LCD_DC_PIN;
}
else
{
P4OUT&=~LCD_DC_PIN;
}
for(i=0;i<8;i++)//串行写入八位数据先写高位上升沿写入
{
if(data&0x80)
DIN_1();
else
DIN_0();
SCLK_0();
data=data<<1;
SCLK_1();
}
//SPDR=data;
//while((SPSR&0x80)!
=0x80);
P4OUT|=LCD_CE_PIN;
}
/*********************************************
函数名:
UnClear
功能:
高n位清零
参数:
bytedata8位数据
byten清零多少位
返回:
byte清零后的结果
举例:
data取11111000n取3-->00011000
编辑器:
Notepad2
*********************************************/
byteUnClear(bytedata,byten)
{
bytetmpData,i;
tmpData=0;
for(i=0;i{
tmpData|=(1<<(7-i));
}
return(data&(~tmpData));
}
/*********************************************
函数名:
LnClear
功能:
低n位清零
参数:
bytedata8位数据
byten清零多少位
返回:
byte清零后的结果
举例:
data取00011111n取3-->00011000
编辑器:
Notepad2
*********************************************/
byteLnClear(bytedata,byten)
{
bytetmpData,i;
tmpData=0;
for(i=0;i{
tmpData|=(1<
}
return(data&(~tmpData));
}
/*********************************************
函数名:
SplitByte
功能:
一个字节拆成两个字节
参数:
bytedata8位数据
bytenByLow从低位起多少位拆开
bytebytes[2]存放返回的两个字节
返回:
无
举例:
data取11111111nByLow取2-->bytes[0]=11111100、bytes[1]=00000011
编辑器:
Notepad2
*********************************************/
voidSplitByte(bytedata,bytenByLow,bytebytes[2])
{
bytes[0]=data<bytes[1]=data>>(8-nByLow);
}
//注意该函数在绘图时会覆盖原来的内容
/*********************************************
函数名:
BufferPixelStuff
功能:
把图片、文字点阵写入全屏缓存(精确定位,右上角坐标可以为LCD上任意位置。
字符大小不限,自行修改数组点阵数据,单个字符的宽高参数不要传错了,16号
字模不要传成12,12了,12号字模不要传成16,16了)
参数:
bytetypetype=1-->图片点阵/type=2-->ascii字符/type=3-->中文字符
byteindex数据在数组中的位置(当type=2时,直接传ascii字符,如:
'A')
bytex横坐标:
0~83
bytey纵坐标:
0~47
bytewidth点阵数据的宽度(位数)如果是字符就为一个字符的宽度、如果是图片就为整个图片的宽度
byteheight点阵数据的高度(位数)如果是字符就为一个字符的高度、如果是图片就为整个图片的高度
返回:
无
编辑器:
Notepad2
*********************************************/
voidBufferPixelStuff(bytetype,byteindex,bytex,bytey,bytewidth,byteheight)
{
bytei,j,tmpRow;
byterow=y/8;
byteoffset=y%8;
bytelevel=(height%8==0?
height/8:
(height/8+1));
bytebytes[2]={0};
bytebyteTmp;
for(j=0;j{
tmpRow=row;
byteTmp=UnClear(LcdPixelBuffer[tmpRow][x+j],8-offset);
for(i=0;i{
if(type==1)
{
SplitByte(PIXEL_BMP[index][i*width+j],offset,bytes);
}
elseif(type==2)
{
SplitByte(PIXEL_ENGLISH_CHAR[index-32][i*width+j],offset,bytes);
}
elseif(type==3)
{
SplitByte(PIXEL_CHINESE_CHAR[index][i*width+j],offset,bytes);
}
else
{
return;
}
/*if((offset{
byteTmp|=bytes[0];
}
else
{
LcdPixelBuffer[tmpRow++][x+j]=byteTmp|bytes[0];
byteTmp=bytes[1];
}*/
LcdPixelBuffer[tmpRow++][x+j]=byteTmp|bytes[0];
byteTmp=bytes[1];
}
LcdPixelBuffer[tmpRow][x+j]=byteTmp|LnClear(LcdPixelBuffer[tmpRow][x+j],(offset+height)%8);
}
}
/*********************************************
函数名:
CacheEnglishString
功能:
把ascii字符串写入全屏缓存(精确定位,右上角坐标可以为LCD上任意位置)
参数:
bytex横坐标:
0~83
bytey纵坐标:
0~47
bytewidth一个字符的宽度(位数)
byteheight一个字符的高度(位数)
bytebWidth字符间距
byte*dataPtr要显示的字符串(如:
"Helloworld!
")
返回:
无
编辑器:
Notepad2
*********************************************/
voidCacheEnglishString(bytex,bytey,bytewidth,byteheight,bytebWidth,byte*dataPtr)
{
bytei=0;
while(*dataPtr)
{
BufferPixelStuff(2,*dataPtr++,x+i*(width+bWidth),y,width,height);
i++;
}
}
/*********************************************
函数名:
CachePixel
功能:
画一个点到入全屏缓存中(精确定位,坐标可以为LCD上任意位置)
参数:
bytex横坐标:
0~83
bytey纵坐标:
0~47
bytewidth一个字符的宽度(位数)
byteheight一个字符的高度(位数)
LcdPixelModemode画点方式(PIXEL_CLEAR-->擦除、PIXEL_DRAW-->画点、PIXEL_XOR-->取反)
返回:
无
编辑器:
Notepad2
*********************************************/
voidCachePixel(bytex,bytey,LcdPixelModemode)
{
byterow;
byteoffset;
bytedata;
if(x>LCD_X_RES)return;
if(y>LCD_Y_RES)return;
row=y/8;
offset=y%8;
data=LcdPixelBuffer[row][x];
if(mode==PIXEL_CLEAR)
{
data&=(~(0x01<}
elseif(mode==PIXEL_DRAW)
{
data|=(0x01<}
elseif(mode==PIXEL_XOR)
{
data^=(0x01<}
LcdPixelBuffer[row][x]=data;
}
/*********************************************
函数名:
CommitBuffer
功能:
提交缓存,把当前缓存上的数据写到LCD上
参数:
无
返回:
无
编辑器:
Notepad2
*********************************************/
voidCommitBuffer(void)
{
byterow,col;
LcdSetXY(0x00,0x00);
for(row=0;row{
for(col=0;col{
LcdExec(LcdPixelBuffer[row][col],DC_DATA);
}
}
}
/*********************************************
函数名:
ClearBuffer
功能:
清空缓存
参数:
无
返回:
无
编辑器:
Notepad2
*********************************************/
voidClearBuffer(void)
{
byterow,col;
for(row=0;row{
for(col=0;col{
LcdPixelBuffer[row][col]=0x00;
}
}
}
/*******************************************************
文件名:
PixelStuff.h
描述:
点阵数据
作者:
xylch101
编辑器:
Notepad2
日期:
2008年06月27日
*******************************************************/
#ifndefPIXEL_STUFF_H
#definePIXEL_STUFF_H
/*********************************************
数组名:
PIXEL_ENGLISH_CHAR
功能:
5X7ASCII点阵数据
编辑器:
Notepad2
*********************************************/
constunsignedcharPIXEL_ENGLISH_CHAR[][5]=
{
{0x00,0x00,0x00,0x00,0x00},//sp
{0x00,0x00,0x2f,0x00,0x00},//!
{0x00,0x07,0x00,0x07,0x00},//"
{0x14,0x7f,0x14,0x7f,0x14},//#
{0x24,0x2a,0x7f,0x2a,0x12},//$
{0xc4,0xc8,0x10,0x26,0x46},//%
{0x36,0x49,0x55,0x22,0x50},//&
{0x00,0x05,0x03,0x00,0x00},//'
{0x00,0x1c,0x22,0x41,0x00},//(
{0x00,0x41,0x22,0x1c