诺基亚5110 LCD屏幕驱动程序文档格式.docx
《诺基亚5110 LCD屏幕驱动程序文档格式.docx》由会员分享,可在线阅读,更多相关《诺基亚5110 LCD屏幕驱动程序文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
#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;
//枚举画点类型选择
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驱动源文件
#include"
Nokia5110Lcd.h"
PixelStuff.h"
//中、英文字、图片字模
//全屏缓存(6x84bytes)
byteLcdPixelBuffer[LCD_Y_RES/8][84]={{0},{0}};
/*********************************************
函数名:
LcdInit
功能:
LCDSPI初始化
参数:
无
返回:
*********************************************/
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_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
voidLcdSetContrast(bytecontrast)
LcdExec(0x80|contrast,DC_CMD);
LcdSetXY
设置LCD当前坐标
byteX横坐标:
0~83
byteY纵坐标:
0~05
voidLcdSetXY(byteX,byteY)
LcdExec(0x40|Y,DC_CMD);
//行
LcdExec(0x80|X,DC_CMD);
//列
LcdExec
执行LCD指令/数据
bytedata指令/数据值
LcdExecTypedc指令/数据选择(DC_CMD/DC_DATA)
voidLcdExec(bytedata,LcdExecTypedc)
unsignedchari=0;
=~LCD_CE_PIN;
if(dc==DC_DATA)
{
P4OUT|=LCD_DC_PIN;
}
else
=~LCD_DC_PIN;
for(i=0;
i<
8;
i++)//串行写入八位数据先写高位上升沿写入
{
if(data&
0x80)
DIN_1();
DIN_0();
SCLK_0();
data=data<
1;
SCLK_1();
//SPDR=data;
//while((SPSR&
0x80)!
=0x80);
}
UnClear
高n位清零
bytedata8位数据
byten清零多少位
byte清零后的结果
举例:
data取11111000n取3-->
00011000
byteUnClear(bytedata,byten)
bytetmpData,i;
tmpData=0;
for(i=0;
i<
n;
i++)
tmpData|=(1<
(7-i));
return(data&
(~tmpData));
LnClear
低n位清零
data取00011111n取3-->
byteLnClear(bytedata,byten)
i);
SplitByte
一个字节拆成两个字节
bytedata8位数据
bytenByLow从低位起多少位拆开
bytebytes[2]存放返回的两个字节
data取11111111nByLow取2-->
bytes[0]=11111100、bytes[1]=00000011
voidSplitByte(bytedata,bytenByLow,bytebytes[2])
bytes[0]=data<
nByLow;
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横坐标:
bytey纵坐标:
0~47
bytewidth点阵数据的宽度(位数)如果是字符就为一个字符的宽度、如果是图片就为整个图片的宽度
byteheight点阵数据的高度(位数)如果是字符就为一个字符的高度、如果是图片就为整个图片的高度
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<
width;
j++)
tmpRow=row;
byteTmp=UnClear(LcdPixelBuffer[tmpRow][x+j],8-offset);
for(i=0;
level;
{
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<
height%8)&
&
(i==level-1))
byteTmp|=bytes[0];
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横坐标:
bytewidth一个字符的宽度(位数)
byteheight一个字符的高度(位数)
bytebWidth字符间距
byte*dataPtr要显示的字符串(如:
"
Helloworld!
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横坐标:
bytey纵坐标:
bytewidth一个字符的宽度(位数)
byteheight一个字符的高度(位数)
LcdPixelModemode画点方式(PIXEL_CLEAR-->
擦除、PIXEL_DRAW-->
画点、PIXEL_XOR-->
取反)
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<
offset));
elseif(mode==PIXEL_DRAW)
data|=(0x01<
offset);
elseif(mode==PIXEL_XOR)
data^=(0x01<
LcdPixelBuffer[row][x]=data;
CommitBuffer
提交缓存,把当前缓存上的数据写到LCD上
voidCommitBuffer(void)
byterow,col;
LcdSetXY(0x00,0x00);
for(row=0;
row<
LCD_Y_RES/8;
row++)
for(col=0;
col<
LCD_X_RES;
col++)
LcdExec(LcdPixelBuffer[row][col],DC_DATA);
}
ClearBuffer
清空缓存
voidClearBuffer(void)
byterow,col;
for(row=0;
for(col=0;
LcdPixelBuffer[row][col]=0x00;
PixelStuff.h
点阵数据
#ifndefPIXEL_STUFF_H
#definePIXEL_STUFF_H
数组名:
PIXEL_ENGLISH_CHAR
5X7ASCII点阵数据
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