| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 |
- /*--------------------------------------------------------------------------------------
- * @file LCDSetup.c
- * @author ZhangJing
- * @version base on stm32f0x
- * @date 2015.09.11
- * @brief LCD驱动
- ---------------------------------------------------------------------------------------*/
- #include "stm32f10x_gpio.h"
- #include "TypeDefine.h"
- #include "Driver.h"
- #include "LCDSetup.h"
- #include "SPISetup.h"
- // #include "font.h"
- /*************************************************************************************
- * Function: LCDReset
- * Object: LCD重启
- * 输入: 无
- * 输出: 无
- * 备注:
- **************************************************************************************/
- void LCDReset( void )
- {
- // #ifndef OLD_LCD
- // LCD_ERD_CLR;
- // LCD_RWR_CLR;
- // #endif
- LCD_RST_CLR;
- Delay_ms(100);
- LCD_RST_SET;
- Delay_ms(50);
- }
- /****************************************************************************
- * 名 称:void ili9220B_WriteIndex(u16 idx)
- * 功 能:写 ili9220B 控制器寄存器地址
- * 入口参数:idx 寄存器地址
- * 出口参数:无
- * 说 明:调用前需先选中控制器,内部函数
- ****************************************************************************/
- void LCDWriteIndex( uint8_t index )
- {
- //SPI 写命令时序开始
- LCD_CS_CLR;
- LCD_RS_CLR;
- SPIWriteByte(index);
- }
- /****************************************************************************
- * 名 称:LCDWriteData
- * 功 能:写LCD寄存器数据
- * 入口参数:uint8_t Data寄存器数据
- * 出口参数:无
- * 说 明:向控制器指定地址写入数据,调用前需先写寄存器地址,内部函数
- ****************************************************************************/
- void LCDWriteData( uint8_t Data )
- {
- LCD_CS_CLR;
- LCD_RS_SET;
- SPIWriteByte(Data);
- LCD_CS_SET;
- }
- /****************************************************************************
- * 名 称:LCDWriteData16Bit
- * 功 能:写LCD寄存器数据
- * 入口参数:uint8_t DataH,uint8_t DataL寄存器数据
- * 出口参数:无
- * 说 明:向控制器指定地址写入数据
- ****************************************************************************/
- void LCDWriteData16Bit( uint8_t DataH,uint8_t DataL )
- {
- LCDWriteData(DataH);
- LCDWriteData(DataL);
- }
- /*************************************************
- 函数名:LCDSetRegion
- 功能:设置lcd显示区域,在此区域写点数据自动换行
- 入口参数:xy起点和终点
- 返回值:无
- *************************************************/
- #ifdef OLD_LCD
- void LCDSetRegion( uint16_t x_start,uint16_t y_start,uint16_t x_end,uint16_t y_end )
- {
- LCDWriteIndex( 0x2a );
- LCDWriteData16Bit( x_start>>8,x_start );
- LCDWriteData16Bit( x_end>>8,x_end );
- LCDWriteIndex( 0x2b );
- LCDWriteData16Bit( y_start>>8,y_start );
- LCDWriteData16Bit( y_end>>8,y_end );
- LCDWriteIndex( 0x2c );
- }
- #else
- void LCDSetRegion( uint16_t x_start,uint16_t y_start,uint16_t x_end,uint16_t y_end )
- {
- LCDWriteIndex( 0x40 );
- LCDWriteIndex( 0xb0 );//Y
- LCDWriteIndex( 0x10 );//XH
- LCDWriteIndex( 0x00 );//XL
- LCDWriteData16Bit( x_start>>8,x_start );
- LCDWriteData16Bit( x_end>>8,x_end );
- LCDWriteIndex( 0xb0 );//Y
- LCDWriteIndex( 0x10 );//XH
- LCDWriteIndex( 0x00 );//XL
- LCDWriteData16Bit( y_start>>8,y_start );
- LCDWriteData16Bit( y_end>>8,y_end );
- }
- #endif
-
- /*************************************************************************************
- * Function: LCDInit
- * Object: LCD初始化
- * 输入: 无
- * 输出: 无
- * 备注:
- **************************************************************************************/
- void LCDInit( void )
- {
- LCDReset();
- LCDWriteIndex(0xE2); //软件复位
- LCDWriteIndex(0xA2); //设置偏压比
- LCDWriteIndex(0xA1); //段扫描顺序:普通顺序
- LCDWriteIndex(0xC8); //行扫描顺序:反向顺序
- LCDWriteIndex(0x27); //校准比率设置
-
- LCDWriteIndex(0xF8); //软件复位
- LCDWriteIndex(0x00); //设置偏压比
- LCDWriteIndex(0x81); //段扫描顺序:普通顺序
- LCDWriteIndex(0x54); //行扫描顺序:反向顺序
- LCDWriteIndex(0x2C); //校准比率设置
- LCDWriteIndex(0x2E); //软件复位
- LCDWriteIndex(0x2F); //设置偏压比
- LCDWriteIndex(0x40); //段扫描顺序:普通顺序
- LCDWriteIndex(0xB0); //行扫描顺序:反向顺序
- LCDWriteIndex(0x10); //校准比率设置
- LCDWriteIndex(0x00); //行扫描顺序:反向顺序
- LCDWriteIndex(0xAF); //校准比率设置
- }
- /*************************************************************************************
- * Function: LCDClear
- * Object: 全屏清屏函数
- * 输入: 填充颜色COLOR
- * 输出: 无
- * 备注:
- **************************************************************************************/
- void LCDClear( uint16_t Color )
- {
- uint8_t i,j;
- LCDWriteIndex( 0x40 );
- for(i=0;i<9;i++)
- {
- LCDWriteIndex( 0xb0 | i );
-
- for( j = 0 ; j < 131 ; j++ )
- {
- LCDWriteIndex( 0x10 | ( j >> 4 ) );
- LCDWriteIndex( 0x00 | ( j & 0x0f ) );
- LCDWriteData( 0 );
- LCDWriteData( 0 );
- }
- }
- }
- /*************************************************************************************
- * Function: LCDPartClear
- * Object: 选择部分清屏函数
- * 输入: uint8_t startX , uint8_t endX , uint8_t y , uint8_t yCounts
- * 输出: 无
- * 备注: 输入要清屏的Y轴坐标,X轴的起始和结束坐标,每次清除时Y轴要清yCounts个段
- **************************************************************************************/
- void LCDPartClear( uint8_t startX , uint8_t endX , uint8_t y , uint8_t yCounts )
- {
- uint8_t i , j;
- for( j = 0 ; j < yCounts ; j++ )
- {
- LCDWriteIndex( 0xb0 | ( y - j ) );
- for( i = startX ; i < endX ; i++ )
- {
- LCDWriteIndex( 0x10 | ( i >> 4 ) );
- LCDWriteIndex( 0x00 | ( i & 0x0f ) );
- LCDWriteData( 0 );
- LCDWriteData( 0 );
- }
- }
- }
- /*************************************************
- 函数名: LCD_Set_XY
- 功能: 设置lcd显示起始点,y表示的是页号共9页
- 入口参数: x、y坐标
- 返回值: 无
- *************************************************/
- void LCDSetXY( uint16_t x,uint16_t y )
- {
- LCDWriteIndex( 0x40 );//set start line
- LCDWriteIndex( 0xb0 | y );//set page address,标头显示在第8页,其它内容显示在0~7页(页从0~8共9页)
- LCDWriteIndex( 0x10 | ( x >> 4 ) );//set column address MSB,设置X轴坐标
- LCDWriteIndex( 0x00 | ( x & 0x0f ) );//set column address LSB,设置X轴坐标
- }
- /*************************************************************************************
- * Function: DisplayHeader
- * Object: 段头显示
- * 输入: uint8_t DataH,uint8_t DataL,uint16_t x
- * 输出: 无
- * 备注: 输入要显示段的的X轴坐标,确定此段后开始显示数据
- **************************************************************************************/
- void DisplayHeader( uint8_t DataH,uint8_t DataL,uint16_t x )
- {
- uint8_t j;
- LCDWriteIndex( 0x40 );//set start line
- LCDWriteIndex( 0xb8 );//set page address,标头显示在第9页(页从0~8共9页)
- LCDWriteIndex( 0x10 | ( x >> 4 ) );//set column address MSB,设置X轴坐标
- LCDWriteIndex( 0x00 | ( x & 0x0f ) );//set column address LSB,设置X轴坐标
- for( j = 0; j < 5; j++ )
- {
- LCDWriteData(DataH);
- LCDWriteData(DataL);
- }
- }
- // void DisplayGraphics( uint16_t x,uint8_t y,uint8_t* data,uint8_t yQTY )
- // {
- // uint8_t i;
- // LCDWriteIndex( 0x40 );//set start line
- // LCDWriteIndex( 0xb0 | y );//set page address,标头显示在第9页(页从0~8共9页)
- // LCDWriteIndex( 0x10 | ( x >> 8 ) );//set column address MSB,设置X轴坐标
- // LCDWriteIndex( 0x00 | (uint8_t)x );//set column address LSB,设置X轴坐标
- // }
- /*************************************************************************************
- * Function: DisplayGraphicsGBK24
- * Object: LCD页面显示函数
- * 输入: X Y轴坐标 所需要显示的数据
- * 输出: 无
- * 备注: 因为屏的抬头应该在整个屏的上方,现在抬头在屏的最下方,是反过来的,为了与
- 抬头匹配,所以显示时也是反向显示的,Y轴一个汉字需显示3页,方向是从7~0共
- 8页可用,X轴起点从127~0,显示128bit
- **************************************************************************************/
- void DisplayGraphicsGBK24( uint16_t x,uint8_t y,uint8_t *gph )
- {
- uint8_t i,j;
- // uint8_t tempX = x;
- LCDWriteIndex( 0x40 );
- // for( i = 0; i < 3; i++ )//24点阵,每页有8个点阵,所以Y轴要有3页显示一个字
- // {
- // tempX = x;
- // LCDWriteIndex( 0xb0 | ( y - i ) );
- // for( j = 24; j > 0; j-- )
- // {
- // LCDWriteIndex( 0x10 | ( tempX >> 4 ) );
- // LCDWriteIndex( 0x00 | ( tempX & 0x0f ) );
- // LCDWriteData( *( gph + j - 1 ) );
- // tempX++;
- // }
- // gph += 24;
- // }
-
- /*正向显示,修改时还需将字库改为 宋体 24点阵 纵向8点向下高位*/
- for( i = 0; i < 3; i++ )
- {
- LCDWriteIndex( 0xb0 | ( y - i ) );
- LCDWriteIndex( 0x10 | ( x >> 8 ) );
- LCDWriteIndex( 0x00 | ( (uint8_t) x ) );
- for( j = 0; j < 24; j++ )
- {
- LCDWriteData( *gph );
- gph++;
- }
- }
- }
- /*************************************************************************************
- * Function: DisplayGraphicsGBK16
- * Object: LCD页面显示函数
- * 输入: X Y轴坐标 所需要显示的数据
- * 输出: 无
- * 备注: 因为屏的抬头应该在整个屏的上方,现在抬头在屏的最下方,是反过来的,为了与
- 抬头匹配,所以显示时也是反向显示的,Y轴一个汉字需显示两页,方向是从7~0共
- 8页可用,X轴起点从127~0,显示128bit
- **************************************************************************************/
- void DisplayGraphicsGBK16( uint16_t x,uint8_t y,uint8_t *gph )
- {
- uint8_t i,j;
- // uint8_t tempX = x;
- LCDWriteIndex( 0x40 );
- // for( i = 0; i < 2; i++ )//16点阵,每页有8个点阵,所以Y轴要有2页显示一个字
- // {
- // tempX = x;
- // LCDWriteIndex( 0xb0 | ( y - i ) );
- // for( j = 16; j > 0; j-- )
- // {
- // LCDWriteIndex( 0x10 | ( tempX >> 4 ) );
- // LCDWriteIndex( 0x00 | ( tempX & 0x0f ) );
- // LCDWriteData( *( gph + j - 1 ) );
- // tempX++;
- // }
- // gph += 16;
- // }
-
- /*正向显示,修改时还需将字库改为 宋体 16点阵 纵向8点向下高位*/
- for( i = 0; i < 2; i++ )//16点阵,每页有8个点阵,所以Y轴要有2页显示一个字
- {
- LCDWriteIndex( 0xb0 | ( y - i ) );
- LCDWriteIndex( 0x10 | ( x >> 4 ) );
- LCDWriteIndex( 0x00 | ( x & 0x0f ) );
- for( j = 0; j < 16; j++ )
- {
- LCDWriteData( *gph );
- gph++;
- }
- }
- }
- /*************************************************************************************
- * Function: DisplayGraphicsGBK12
- * Object: LCD页面显示函数
- * 输入: X Y轴坐标 所需要显示的数据
- * 输出: 无
- * 备注: 因为屏的抬头应该在整个屏的上方,现在抬头在屏的最下方,是反过来的,为了与
- 抬头匹配,所以显示时也是反向显示的,Y轴一个汉字需显示两页,方向是从7~0共
- 8页可用,X轴起点从127~0,显示128bit
- **************************************************************************************/
- void DisplayGraphicsGBK12( uint16_t x,uint8_t y,uint8_t *gph )
- {
- uint8_t i,j;
- // uint8_t tempX = x;
- LCDWriteIndex( 0x40 );
- // for( i = 0; i < 2; i++ )//12点阵,每页有8个点阵,所以Y轴要有2页显示一个字
- // {
- // tempX = x;
- // LCDWriteIndex( 0xb0 | ( y - i ) );
- // for( j = 12; j > 0; j-- )
- // {
- // LCDWriteIndex( 0x10 | ( tempX >> 4 ) );
- // LCDWriteIndex( 0x00 | ( tempX & 0x0f ) );
- // LCDWriteData( *( gph + j - 1 ) );
- // tempX++;
- // }
- // gph += 12;
- // }
-
- for( i = 0; i < 2; i++ )//12点阵,每页有8个点阵,所以Y轴要有2页显示一个字
- {
- LCDWriteIndex( 0xb0 | ( y - i ) );
- LCDWriteIndex( 0x10 | ( x >> 4 ) );
- LCDWriteIndex( 0x00 | ( x & 0x0f ) );
- for( j = 0; j < 12; j++ )
- {
- LCDWriteData( *gph );
- gph++;
- }
- }
- }
- /*************************************************************************************
- * Function: DisplayGraphicsGBK8_8
- * Object: LCD页面显示函数
- * 输入: X Y轴坐标 所需要显示的数据
- * 输出: 无
- * 备注: 因为屏的抬头应该在整个屏的上方,现在抬头在屏的最下方,是反过来的,为了与
- 抬头匹配,所以显示时也是反向显示的,Y轴一个ASCII码需显示1页,方向是从7~0共
- 8页可用,X轴起点从127~0,显示128bit
- **************************************************************************************/
- void DisplayGraphicsGBK8_8( uint16_t x,uint8_t y,uint8_t *gph )
- {
- uint8_t i,j;
- uint8_t tempX = x;
- LCDWriteIndex( 0x40 );
-
- // for( i = 0; i < 1; i++ )//8点阵,每页有8个点阵,所以Y轴要有2页显示一个字
- // {
- // tempX = x;
- // LCDWriteIndex( 0xb0 | ( y - i) );
- // for( j = 5; j > 0; j-- )
- // {
- // LCDWriteIndex( 0x10 | ( tempX >> 4 ) );
- // LCDWriteIndex( 0x00 | ( tempX & 0x0f ) );
- // LCDWriteData( *( gph + j - 1 ) );
- // tempX++;
- // }
- // // gph += 6;
- // }
-
- for( i = 0; i < 1; i++ )//8点阵,每页有8个点阵,所以Y轴要有1页显示一个字
- {
- tempX = x;
- LCDWriteIndex( 0xb0 | ( y - i ) );
- LCDWriteIndex( 0x10 | ( tempX >> 4 ) );
- LCDWriteIndex( 0x00 | ( tempX & 0x0f ) );
- for( j = 0; j < 5; j++ )
- {
- LCDWriteData( *gph );
- gph++;
- tempX++;
- }
- }
- }
- /*************************************************************************************
- * Function: DisplayGraphicsGBK8_12
- * Object: LCD页面显示函数
- * 输入: X Y轴坐标 所需要显示的数据
- * 输出: 无
- * 备注: 因为屏的抬头应该在整个屏的上方,现在抬头在屏的最下方,是反过来的,为了与
- 抬头匹配,所以显示时也是反向显示的,Y轴一个ASCII码需显示1页,方向是从7~0共
- 8页可用,X轴起点从127~0,显示128bit
- **************************************************************************************/
- void DisplayGraphicsGBK8_12( uint16_t x,uint8_t y,uint8_t *gph )
- {
- uint8_t i,j;
- uint8_t tempX = x;
- LCDWriteIndex( 0x40 );
-
- // for( i = 0; i < 2; i++ )//12点阵,每页有8个点阵,所以Y轴要有2页显示一个字
- // {
- // tempX = x;
- // LCDWriteIndex( 0xb0 | ( y - i) );
- // for( j = 6; j > 0; j-- )
- // {
- // LCDWriteIndex( 0x10 | ( tempX >> 4 ) );
- // LCDWriteIndex( 0x00 | ( tempX & 0x0f ) );
- // LCDWriteData( *( gph + j - 1 ) );
- // tempX++;
- // }
- // gph += 6;
- // }
-
- for( i = 0; i < 2; i++ )//8点阵,每页有8个点阵,所以Y轴要有1页显示一个字
- {
- tempX = x;
- LCDWriteIndex( 0xb0 | ( y - i ) );
- LCDWriteIndex( 0x10 | ( tempX >> 4 ) );
- LCDWriteIndex( 0x00 | ( tempX & 0x0f ) );
- for( j = 0; j < 6; j++ )
- {
- LCDWriteData( *gph );
- gph++;
- tempX++;
- }
- }
- }
- /*************************************************************************************
- * Function: DisplayGraphicsGBK8_16
- * Object: LCD页面显示函数
- * 输入: X Y轴坐标 所需要显示的数据
- * 输出: 无
- * 备注: 因为屏的抬头应该在整个屏的上方,现在抬头在屏的最下方,是反过来的,为了与
- 抬头匹配,所以显示时也是反向显示的,Y轴一个ASCII码需显示1页,方向是从7~0共
- 8页可用,X轴起点从127~0,显示128bit
- **************************************************************************************/
- void DisplayGraphicsGBK8_16( uint16_t x,uint8_t y,uint8_t *gph )
- {
- uint8_t i,j;
- uint8_t tempX = x;
- LCDWriteIndex( 0x40 );
- // for( i = 0; i < 2; i++ )//16点阵,每页有8个点阵,所以Y轴要有2页显示一个字
- // {
- // tempX = x;
- // LCDWriteIndex( 0xb0 | ( y - i ) );
- // for( j = 8; j > 0; j-- )
- // {
- // LCDWriteIndex( 0x10 | ( tempX >> 4 ) );
- // LCDWriteIndex( 0x00 | ( tempX & 0x0f ) );
- // LCDWriteData( *( gph + j - 1 ) );
- // tempX++;
- // }
- // }
-
- for( i = 0; i < 2; i++ )//8点阵,每页有8个点阵,所以Y轴要有1页显示一个字
- {
- tempX = x;
- LCDWriteIndex( 0xb0 | ( y - i ) );
- LCDWriteIndex( 0x10 | ( tempX >> 4 ) );
- LCDWriteIndex( 0x00 | ( tempX & 0x0f ) );
- for( j = 0; j < 8; j++ )
- {
- LCDWriteData( *gph );
- gph++;
- tempX++;
- }
- }
- }
|