液晶ili932xSTM32F103驱动.docx
- 文档编号:28285670
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:61
- 大小:21.79KB
液晶ili932xSTM32F103驱动.docx
《液晶ili932xSTM32F103驱动.docx》由会员分享,可在线阅读,更多相关《液晶ili932xSTM32F103驱动.docx(61页珍藏版)》请在冰豆网上搜索。
液晶ili932xSTM32F103驱动
/******************************************************************************
*文件名称:
ili932x.c
*摘要:
支持ILI9320和ILI9325驱动IC控制的QVGA显示屏,使用16位并行传输
到头文件中配置屏幕使用方向和驱动IC类型
注意:
16位数据线色彩分布>>BGR(565)
*当前版本:
V1.3
*修改说明:
版本修订说明:
1.修改翻转模式下的ASCII字符写Bug
2.增加可以在翻转模式下的自动行写
3.优化刷图片使用流水线方法提效率
*重要说明!
在.h文件中,#defineImmediately时是立即显示当前画面
而如果#defineDelay,则只有在执行了LCD_WR_REG(0x0007,0x0173);
之后才会显示,执行一次LCD_WR_REG(0x0007,0x0173)后,所有写入数
据都立即显示。
#defineDelay一般用在开机画面的显示,防止显示出全屏图像的刷新
过程
******************************************************************************/
#include"stm32f10x_lib.h"
#include"ili932x.h"
#include"spi_flash.h"
/****************************************************************
函数名:
Lcd配置函数
功能:
配置所有和Lcd相关的GPIO和时钟
引脚分配为:
PE——16Bit数据总线
PD15——Lcd_rst
PD14——Lcd_rd*
PD13——Lcd_wr
PD12——Lcd_rs*
PD11——Lcd_cs
PB5——Lcd_blaklight背光靠场效应管驱动背光模块
*****************************************************************/
voidLcd_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
/*开启相应时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE,ENABLE);
/*所有Lcd引脚配置为推挽输出*/
/*16位数据*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOE,&GPIO_InitStructure);
/*控制脚*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_Init(GPIOD,&GPIO_InitStructure);
/*背光控制*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
/**********************************************
函数名:
Lcd初始化函数
功能:
初始化Lcd
入口参数:
无
返回值:
无
***********************************************/
voidLcd_Initialize(void)
{
Lcd_Light_ON;
DataToWrite(0xffff);//数据线全高
Set_nWr;
Set_Cs;
Set_Rs;
Set_nRd;
Set_Rst;
Set_Rst;
Delay_nms
(1);
Clr_Rst;
Delay_nms
(1);
Set_Rst;
Delay_nms
(1);
#ifdefILI9325
LCD_WR_REG(0x00e3,0x3008);
LCD_WR_REG(0x00e7,0x0012);
LCD_WR_REG(0x00ef,0x1231);//Settheinternalvcorevoltage
LCD_WR_REG(0x0001,0x0100);//S
#endif
#ifdefILI9320
LCD_WR_REG(0x00e5,0x8000);
LCD_WR_REG(0x0000,0x0001);
LCD_WR_REG(0x0001,0x0100);//S
Delay_nms(10);
#endif
LCD_WR_REG(0x0002,0x0700);//Lineinversion
#ifID_AM==000
LCD_WR_REG(0x0003,0x0000);//屏幕旋转控制TFM=0,TRI=0,SWAP=1,16bitssysteminterfaceswapRGBtoBRG,此处ORG和HWM为0
#elifID_AM==001
LCD_WR_REG(0x0003,0x0008);
#elifID_AM==010
LCD_WR_REG(0x0003,0x0010);
#elifID_AM==011
LCD_WR_REG(0x0003,0x0018);
#elifID_AM==100
LCD_WR_REG(0x0003,0x0020);
#elifID_AM==101
LCD_WR_REG(0x0003,0x0028);
#elifID_AM==110
LCD_WR_REG(0x0003,0x0030);
#elifID_AM==111
LCD_WR_REG(0x0003,0x0038);
#endif
LCD_WR_REG(0x0004,0x0000);
LCD_WR_REG(0x0008,0x0207);
LCD_WR_REG(0x0009,0x0000);
LCD_WR_REG(0x000a,0x0000);
LCD_WR_REG(0x000c,0x0001);//此处配置接口类型16位system接口
LCD_WR_REG(0x000d,0x0000);
LCD_WR_REG(0x000f,0x0000);
//电源配置
LCD_WR_REG(0x0010,0x0000);
LCD_WR_REG(0x0011,0x0000);
LCD_WR_REG(0x0012,0x0000);
LCD_WR_REG(0x0013,0x0000);
Delay_nms(200);
LCD_WR_REG(0x0010,0x17b0);
LCD_WR_REG(0x0011,0x0137);
Delay_nms(50);
LCD_WR_REG(0x0012,0x0139);
Delay_nms(50);
LCD_WR_REG(0x0013,0x1700);
LCD_WR_REG(0x0029,0x000c);
//LCD_WR_REG(0x002b,0x000d);
Delay_nms(50);
#ifID_AM==000
LCD_WR_REG(0x0020,0x00ef);//GRAM水平起始位置
LCD_WR_REG(0x0021,0x013f);
#elifID_AM==001
LCD_WR_REG(0x0020,0x00ef);
LCD_WR_REG(0x0021,0x013f);
#elifID_AM==010
LCD_WR_REG(0x0020,0x0000);
LCD_WR_REG(0x0021,0x013f);
#elifID_AM==011
LCD_WR_REG(0x0020,0x0000);
LCD_WR_REG(0x0021,0x013f);
#elifID_AM==100
LCD_WR_REG(0x0020,0x00ef);
LCD_WR_REG(0x0021,0x0000);
#elifID_AM==101
LCD_WR_REG(0x0020,0x00ef);
LCD_WR_REG(0x0021,0x0000);
#elifID_AM==110
LCD_WR_REG(0x0020,0x0000);
LCD_WR_REG(0x0021,0x0000);
#elifID_AM==111
LCD_WR_REG(0x0020,0x0000);
LCD_WR_REG(0x0021,0x0000);
#endif
LCD_WR_REG(0x0030,0x0000);
LCD_WR_REG(0x0031,0x0507);
LCD_WR_REG(0x0032,0x0104);
LCD_WR_REG(0x0035,0x0105);
LCD_WR_REG(0x0036,0x0404);
LCD_WR_REG(0x0037,0x0603);
LCD_WR_REG(0x0038,0x0004);
LCD_WR_REG(0x0039,0x0007);
LCD_WR_REG(0x003c,0x0501);
LCD_WR_REG(0x003d,0x0404);
LCD_WR_REG(0x0050,0x0000);//水平GRAM起始位置
LCD_WR_REG(0x0051,0x00ef);//水平GRAM终止位置
LCD_WR_REG(0x0052,0x0000);//垂直GRAM起始位置
LCD_WR_REG(0x0053,0x013f);//垂直GRAM终止位置
#ifdefILI9325
LCD_WR_REG(0x0060,0xa700);//G
#endif
#ifdefILI9320
LCD_WR_REG(0x0060,0x2700);//G
#endif
LCD_WR_REG(0x0061,0x0001);//EnablesthegrayscaleinversionoftheimagebysettingREV=1.?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
LCD_WR_REG(0x006a,0x0000);//不使用卷曲功能
LCD_WR_REG(0x0080,0x0000);
LCD_WR_REG(0x0081,0x0000);
LCD_WR_REG(0x0082,0x0000);
LCD_WR_REG(0x0083,0x0000);
LCD_WR_REG(0x0084,0x0000);
LCD_WR_REG(0x0085,0x0000);
LCD_WR_REG(0x0090,0x0010);
LCD_WR_REG(0x0092,0x0000);
LCD_WR_REG(0x0093,0x0003);
LCD_WR_REG(0x0095,0x0110);
LCD_WR_REG(0x0097,0x0000);
LCD_WR_REG(0x0098,0x0000);
//显示画面写入0x0130是不显示当前画面
//0x0173是显示当前画面
LCD_WR_REG(0x0007,0x0130);
#ifdefImmediately
LCD_WR_REG(0x0007,0x0173);
#endif
//第一个像素的读取数据是无效值,这里事先读取一次,舍去无效值
}
/******************************************
函数名:
Lcd写命令函数
功能:
向Lcd指定位置写入应有命令或数据
入口参数:
Index要寻址的寄存器地址
ConfigTemp写入的数据或命令值
返回值:
无
******************************************/
voidLCD_WR_REG(u16Index,u16CongfigTemp)
{
Clr_Cs;
Clr_Rs;
DataToWrite(Index);
Clr_nWr;
//Delay_nus
(1);
Set_nWr;
Set_Rs;
DataToWrite(CongfigTemp);
Clr_nWr;
//Delay_nus
(1);
Set_nWr;
Set_Cs;
}
/************************************************
函数名:
Lcd写开始函数
功能:
控制Lcd控制引脚执行写操作
入口参数:
无
返回值:
无
************************************************/
voidLcd_WR_Start(void)
{
Clr_Cs;
Clr_Rs;
DataToWrite(0x0022);
Clr_nWr;
//Delay_nus
(1);
Set_nWr;
Set_Rs;
}
/*************************************************
函数名:
Lcd光标起点定位函数
功能:
指定320240液晶上的一点作为写数据的起始点
入口参数:
x坐标0~239
y坐标0~319
返回值:
无
*************************************************/
voidLcd_SetCursor(u8x,u16y)
{
LCD_WR_REG(0x20,x);
LCD_WR_REG(0x21,y);
}
/**********************************************
函数名:
Lcd全屏擦除函数
功能:
将Lcd整屏擦为指定颜色
入口参数:
color指定Lcd全屏颜色RGB(5-6-5)
返回值:
无
***********************************************/
voidLcd_Clear(u16Color)
{
u32temp;
Lcd_SetCursor(0x00,0x0000);
LCD_WR_REG(0x0050,0x00);//水平GRAM起始位置
LCD_WR_REG(0x0051,239);//水平GRAM终止位置
LCD_WR_REG(0x0052,0x00);//垂直GRAM起始位置
LCD_WR_REG(0x0053,319);//垂直GRAM终止位置
Lcd_WR_Start();
Set_Rs;
for(temp=0;temp<76800;temp++)
{
DataToWrite(Color);
Clr_nWr;
Set_nWr;
}
Set_Cs;
}
/**********************************************
函数名:
Lcd块选函数
功能:
选定Lcd上指定的矩形区域
注意:
xStart和yStart随着屏幕的旋转而改变,位置是矩形框的四个角
入口参数:
xStartx方向的起始点
ySrarty方向的终止点
xLong要选定矩形的x方向长度
yLong要选定矩形的y方向长度
返回值:
无
***********************************************/
voidLcd_SetBox(u8xStart,u16yStart,u8xLong,u16yLong,u16x_offset,u16y_offset)
{
#ifID_AM==000
Lcd_SetCursor(xStart+xLong-1+x_offset,yStart+yLong-1+y_offset);
#elifID_AM==001
Lcd_SetCursor(xStart+xLong-1+x_offset,yStart+yLong-1+y_offset);
#elifID_AM==010
Lcd_SetCursor(xStart+x_offset,yStart+yLong-1+y_offset);
#elifID_AM==011
Lcd_SetCursor(xStart+x_offset,yStart+yLong-1+y_offset);
#elifID_AM==100
Lcd_SetCursor(xStart+xLong-1+x_offset,yStart+y_offset);
#elifID_AM==101
Lcd_SetCursor(xStart+xLong-1+x_offset,yStart+y_offset);
#elifID_AM==110
Lcd_SetCursor(xStart+x_offset,yStart+y_offset);
#elifID_AM==111
Lcd_SetCursor(xStart+x_offset,yStart+y_offset);
#endif
LCD_WR_REG(0x0050,xStart+x_offset);//水平GRAM起始位置
LCD_WR_REG(0x0051,xStart+xLong-1+x_offset);//水平GRAM终止位置
LCD_WR_REG(0x0052,yStart+y_offset);//垂直GRAM起始位置
LCD_WR_REG(0x0053,yStart+yLong-1+y_offset);//垂直GRAM终止位置
}
voidLcd_ColorBox(u8xStart,u16yStart,u8xLong,u16yLong,u16Color)
{
u32temp;
Lcd_SetBox(xStart,yStart,xLong,yLong,0,0);
Lcd_WR_Start();
Set_Rs;
for(temp=0;temp { DataToWrite(Color); Clr_nWr; Set_nWr; } Set_Cs; } voidLcd_ClearCharBox(u8x,u16y,u16Color) { u32temp; Lcd_SetBox(x*8,y*16,8,16,0,0); Lcd_WR_Start(); Set_Rs; for(temp=0;temp<128;temp++) { DataToWrite(Color); Clr_nWr; //Delay_nus(22); Set_nWr; } Set_Cs; } /**************************************************************** 函数名: Lcd写1个ASCII字符函数 入口参数: x,横向坐标,由左到右分别是0~29 y,纵向坐标,由上到下分别为0~19 CharColaor,字符的颜色 CharBackColor,字符背景颜色 ASCIICode,相应字符的ASCII码 也就是说,320240分辨率的显示屏,横向能显示30个ASCII字符,竖向能显示20行 返回值: 无 注意! ! ! ! ! 如果单独使用此函数则应该加上Lcd_Rs_H()和Set_Cs;为了优化系统省去了 这个指令,假设此函数执行的上一条语句是写命令,(RS_L情况)则写入将出错 ,因为ILI9320认为当RS_L时写入的是命令 *****************************************************************/ voidLcd_WriteASCII(u8x,u8y,u16x_offset,u16y_offset,u16CharColor,u16CharBackColor,u8ASCIICode) { u8RowCounter,BitCounter; u8*ASCIIPointer; u8ASCIIBuffer[16]; #if(ID_AM==000)|(ID_AM==010)|(ID_AM==100)|(ID_AM==110) Lcd_SetBox(x*8,y*16,8,16,x_offset,y_offset); #else Lcd_SetBox(x*16,y*8,16,8,x_offset,y_offset); #endif Lcd_WR_Start(); GetASCIICode(ASCIIBuffer,ASCIICode,ASCII_Offset);//取这个字符的显示代码 ASCIIPointer=ASCIIBuffer; for(RowCounter=0;RowCounter<16;RowCounter++) { for(BitCounter=0;BitCounter<8;BitCounter++) { if((*ASCIIPointer&(0x80>>BitCounter))==0x00) { //Set_Rs; DataToWrite(CharBackColor); Clr_nWr; Set_nWr; } else { //Set_Rs; DataToWrite(CharColor); Clr_nWr; Set_nWr; } } ASCIIPointer++; } //Set_Cs; } voidLcd_WriteASCIIClarity(u8x,u8y,u8x_offset,u8y_offset,u16CharColor,u8ASCIICode) { GPIO_InitTypeDefGPIO_InitStructure; u8RowCounter,BitCounter; u8*ASCIIPointer; u8ASCIIBuffer[16]; u16Temp; #if(ID_AM==000)|(ID_AM==010)|(ID_AM==100)|(ID_AM==110) Lcd_SetBox(x*8,y*16,8,16,x_offset,y_offset); #else Lcd_SetBox(x*16,y*8,16,8,x_offset,y_offset); #endif Lcd_WR_Start(); GetASCIICode(ASCIIBuffer,ASCIICode,ASCII_Offset);//取这个字符的显示代码 ASCIIPointer=ASCIIBuffer; for(RowCounter=0;RowCounter<16;RowCounter++) { for(BitCounter=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 液晶ili932x STM32F103驱动 液晶 ili932x STM32F103 驱动