诺基亚5110 LCD屏幕驱动程序.docx
- 文档编号:5639083
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:20
- 大小:20.39KB
诺基亚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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 诺基亚5110 LCD屏幕驱动程序 诺基亚 5110 LCD 屏幕 驱动程序