1、#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 unsigned char byte;typedef unsigned int word;/枚举 D/C 模式选择 typedef enum DC_CMD = 0, /写命令 DC_DATA = 1 /写数据 LcdExecType;/枚举 画点类型选择 PIXEL_CLEAR = 0, /擦除 PIXEL_DRAW = 1, /画点 PIXE
2、L_XOR = 2 /取反 LcdPixelMode;/驱动函数声明void LcdInit ( void );void LcdSetContrast ( byte contrast );void LcdSetXY (byte X, 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 B
3、ufferPixelStuff ( byte type, byte index, byte x, byte y, byte width, byte height);void CacheEnglishString ( byte x, 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 Nokia511
4、0Lcd.c 诺基亚 5110 LCD 驱动源文件#include Nokia5110Lcd.hPixelStuff.h /中、英文字、图片字模/全屏缓存 ( 6x84 bytes )byte LcdPixelBuffer LCD_Y_RES / 8 84 = 0, 0 ; /*函数名 : LcdInit功能 : LCD SPI 初始化参数 : 无返回 :*/void LcdInit( void ) P4OUT |= LCD_RST_PIN; P4DIR |= LCD_RST_PIN | LCD_DC_PIN | LCD_CE_PIN | SPI_MOSI_PIN | SPI_CLK_PIN;
5、 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 对比度 byte contrast 对比度值:0127void LcdSetCo
6、ntrast( byte contrast ) LcdExec( 0x80 | contrast, DC_CMD ); LcdSetXY 设置 LCD 当前坐标 byte X 横坐标:083 byte Y 纵坐标:005void LcdSetXY(byte X, byte Y) LcdExec( 0x40 | Y, DC_CMD); / 行 LcdExec( 0x80 | X, DC_CMD); / 列 LcdExec 执行 LCD 指令/数据 byte data 指令/数据值 LcdExecType dc 指令/数据选择(DC_CMD/DC_DATA)void LcdExec( byte d
7、ata, LcdExecType dc ) unsigned char i=0;= LCD_CE_PIN; if ( dc = DC_DATA ) P4OUT |= LCD_DC_PIN; else= LCD_DC_PIN; for(i=0;i8;i+)/串行写入八位数据 先写高位 上升沿写入 if(data&0x80) DIN_1(); DIN_0(); SCLK_0(); data=data 00011000byte UnClear( byte data, byte n ) byte tmpData, i; tmpData = 0; for( i = 0; i n; i+ ) tmpDat
8、a |= ( 1 byte LnClear( byte data, byte n ) i ); SplitByte 一个字节拆成两个字节 byte data 8位数据 byte nByLow 从低位起多少位拆开 byte bytes 2 存放返回的两个字节 data取11111111 nByLow取2 - bytes0=11111100、bytes1=00000011void SplitByte( byte data, byte nByLow, byte bytes 2 ) bytes 0 = data ( 8 - nByLow );/注意该函数在绘图时会覆盖原来的内容 BufferPixel
9、Stuff 把图片、文字点阵写入全屏缓存(精确定位,右上角坐标可以为LCD上任意位置。 字符大小不限,自行修改数组点阵数据,单个字符的宽高参数不要传错了,16号 字模不要传成12,12了,12号字模不要传成16,16了) byte type type=1-图片点阵 / type=2-ascii字符 / type=3-中文字符 byte index 数据在数组中的位置(当type=2时,直接传ascii字符,如:A) byte x 横坐标: byte y 纵坐标:047 byte width 点阵数据的宽度(位数) 如果是字符就为一个字符的宽度、如果是图片就为整个图片的宽度 byte heigh
10、t 点阵数据的高度(位数) 如果是字符就为一个字符的高度、如果是图片就为整个图片的高度void BufferPixelStuff( byte 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
11、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); else if( type = 2 ) SplitByte( PIXEL_ENGLISH_CHAR index - 32 i * width + j , offset, bytes); else if( type = 3 ) SplitByt
12、e( PIXEL_CHINESE_CHAR index i * width + j , offset, bytes); else return; /*if(offset 擦除、PIXEL_DRAW-画点、PIXEL_XOR-取反)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 = LcdPixel
13、Buffer row x ; if ( mode = PIXEL_CLEAR ) data &= (0x01 offset); else if ( mode = PIXEL_DRAW ) data |= (0x01 offset); else if ( mode = PIXEL_XOR ) data = (0x01 LcdPixelBuffer row x = data; CommitBuffer 提交缓存,把当前缓存上的数据写到LCD上void CommitBuffer( void ) byte row, col; LcdSetXY( 0x00, 0x00 ); for ( row = 0;
14、 row LCD_Y_RES / 8; row+ ) for ( col = 0; col LCD_X_RES; col+ ) LcdExec( LcdPixelBuffer row col , DC_DATA ); ClearBuffer 清空缓存void ClearBuffer( void ) byte row, col; for( row = 0; for( col=0; LcdPixelBuffer row col = 0x00; PixelStuff.h 点阵数据#ifndef PIXEL_STUFF_H#define PIXEL_STUFF_H数组名 : PIXEL_ENGLISH
15、_CHAR 5X7ASCII点阵数据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
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1