1、诺基亚5110 LCD屏幕驱动程序/*文件名 : Nokia5110Lcd.h描述 : 诺基亚 5110 LCD 驱动头文件作者 : xylch101编辑器 : Notepad 2日期 : 2008年06月27日*/#ifndef NOKIA_5110_LCD_H#define NOKIA_5110_LCD_H/宽高像素#define LCD_X_RES 84#define LCD_Y_RES 48/管脚配置 (atmega16L) 自行修改#define LCD_DC_PIN (12) / P4.2 D/C#define LCD_CE_PIN (14) / P4.4 /SCE#define
2、SPI_MOSI_PIN (11) / P4.1 DIN#define LCD_RST_PIN (13) / P4.3 /RST#define SPI_CLK_PIN (10) / P4.0 /SCLK#define DIN_0() P4OUT&=SPI_MOSI_PIN#define DIN_1() P4OUT|= SPI_MOSI_PIN#define SCLK_0() P4OUT&=SPI_CLK_PIN#define SCLK_1() P4OUT|= SPI_CLK_PIN/P4.0-SCLK/P4.1-DIN/P4.2-D/C/P4.3-/RST/P4.4-/SCEtypedef u
3、nsigned char byte;typedef unsigned int word;/枚举 D/C 模式选择 typedef enum DC_CMD = 0, /写命令 DC_DATA = 1 /写数据 LcdExecType;/枚举 画点类型选择 typedef enum PIXEL_CLEAR = 0, /擦除 PIXEL_DRAW = 1, /画点 PIXEL_XOR = 2 /取反 LcdPixelMode;/驱动函数声明void LcdInit ( void );void LcdSetContrast ( byte contrast );void LcdSetXY (byte X
4、, byte Y);void LcdExec ( byte data, LcdExecType cd );byte UnClear ( byte data, byte n );byte LnClear ( byte data, byte n );void SplitByte ( byte data, byte nByLow, byte bytes 2 );void BufferPixelStuff ( byte type, byte index, byte x, byte y, byte width, byte height);void CacheEnglishString ( byte x,
5、 byte y, byte width, byte height, byte bWidth, byte *dataPtr );void CachePixel ( byte x, byte y, LcdPixelMode mode );void CommitBuffer ( void );void ClearBuffer ( void );#endif/*文件名 : Nokia5110Lcd.c描述 : 诺基亚 5110 LCD 驱动源文件作者 : xylch101编辑器 : Notepad 2日期 : 2008年06月27日*/#include Nokia5110Lcd.h#include P
6、ixelStuff.h /中、英文字、图片字模/全屏缓存 ( 6x84 bytes )byte LcdPixelBuffer LCD_Y_RES / 8 84 = 0, 0 ; /*函数名 : LcdInit功能 : LCD SPI 初始化参数 : 无返回 : 无编辑器 : Notepad 2*/void LcdInit( 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 |=
7、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 对比度参数 : byte contrast 对比度值:0127返回 : 无编辑
8、器 : Notepad 2*/void LcdSetContrast( byte contrast ) LcdExec( 0x21, DC_CMD ); LcdExec( 0x80 | contrast, DC_CMD ); LcdExec( 0x20, DC_CMD );/*函数名 : LcdSetXY功能 : 设置 LCD 当前坐标参数 : byte X 横坐标:083 byte Y 纵坐标:005返回 : 无编辑器 : Notepad 2*/void LcdSetXY(byte X, byte Y) LcdExec( 0x40 | Y, DC_CMD); / 行 LcdExec( 0x8
9、0 | X, DC_CMD); / 列/*函数名 : LcdExec功能 : 执行 LCD 指令/数据参数 : byte data 指令/数据值 LcdExecType dc 指令/数据选择(DC_CMD/DC_DATA)返回 : 无编辑器 : Notepad 2*/void LcdExec( byte data, LcdExecType dc ) unsigned char i=0; P4OUT &= LCD_CE_PIN; if ( dc = DC_DATA ) P4OUT |= LCD_DC_PIN; else P4OUT &= LCD_DC_PIN; for(i=0;i8;i+)/串行
10、写入八位数据 先写高位 上升沿写入 if(data&0x80) DIN_1(); else DIN_0(); SCLK_0(); data=data 00011000编辑器 : Notepad 2*/byte UnClear( byte data, byte n ) byte tmpData, i; tmpData = 0; for( i = 0; i n; i+ ) tmpData |= ( 1 00011000编辑器 : Notepad 2*/byte LnClear( byte data, byte n ) byte tmpData, i; tmpData = 0; for( i = 0
11、; i n; i+ ) tmpData |= ( 1 bytes0=11111100、bytes1=00000011编辑器 : Notepad 2*/void SplitByte( byte data, byte nByLow, byte bytes 2 ) bytes 0 = data ( 8 - nByLow );/注意该函数在绘图时会覆盖原来的内容/*函数名 : BufferPixelStuff功能 : 把图片、文字点阵写入全屏缓存(精确定位,右上角坐标可以为LCD上任意位置。 字符大小不限,自行修改数组点阵数据,单个字符的宽高参数不要传错了,16号 字模不要传成12,12了,12号字模
12、不要传成16,16了)参数 : byte type type=1-图片点阵 / type=2-ascii字符 / type=3-中文字符 byte index 数据在数组中的位置(当type=2时,直接传ascii字符,如:A) byte x 横坐标:083 byte y 纵坐标:047 byte width 点阵数据的宽度(位数) 如果是字符就为一个字符的宽度、如果是图片就为整个图片的宽度 byte height 点阵数据的高度(位数) 如果是字符就为一个字符的高度、如果是图片就为整个图片的高度返回 : 无编辑器 : Notepad 2*/void BufferPixelStuff( byt
13、e type, byte index, byte x, byte y, byte width, byte height) byte i, j, tmpRow; byte row = y / 8; byte offset = y % 8; byte level = ( height % 8 = 0 ? height / 8 : ( height / 8 + 1 ) ); byte bytes 2 = 0 ; byte byteTmp; for( j=0; j width; j+ ) tmpRow = row; byteTmp = UnClear( LcdPixelBuffer tmpRow x
14、+ j , 8 - offset ); for( i=0; i level; i+ ) if( type = 1 ) SplitByte(PIXEL_BMP index i * width + j , offset, bytes); else if( type = 2 ) SplitByte( PIXEL_ENGLISH_CHAR index - 32 i * width + j , offset, bytes); else if( type = 3 ) SplitByte( PIXEL_CHINESE_CHAR index i * width + j , offset, bytes); el
15、se return; /*if(offset 擦除、PIXEL_DRAW-画点、PIXEL_XOR-取反)返回 : 无编辑器 : Notepad 2*/void CachePixel( byte x, byte y, LcdPixelMode mode ) byte row; byte offset; byte data; 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
16、) data &= (0x01 offset); else if ( mode = PIXEL_DRAW ) data |= (0x01 offset); else if ( mode = PIXEL_XOR ) data = (0x01 offset); LcdPixelBuffer row x = data;/*函数名 : CommitBuffer功能 : 提交缓存,把当前缓存上的数据写到LCD上参数 : 无返回 : 无编辑器 : Notepad 2*/void CommitBuffer( void ) byte row, col; LcdSetXY( 0x00, 0x00 ); for
17、( row = 0; row LCD_Y_RES / 8; row+ ) for ( col = 0; col LCD_X_RES; col+ ) LcdExec( LcdPixelBuffer row col , DC_DATA ); /*函数名 : ClearBuffer功能 : 清空缓存参数 : 无返回 : 无编辑器 : Notepad 2*/void ClearBuffer( void ) byte row, col; for( row = 0; row LCD_Y_RES / 8; row+ ) for( col=0; col LCD_X_RES; col+ ) LcdPixelBu
18、ffer row col = 0x00; /*文件名 : PixelStuff.h描述 : 点阵数据作者 : xylch101编辑器 : Notepad 2日期 : 2008年06月27日*/#ifndef PIXEL_STUFF_H#define PIXEL_STUFF_H/*数组名 : PIXEL_ENGLISH_CHAR功能 : 5X7ASCII点阵数据编辑器 : Notepad 2*/const unsigned char PIXEL_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