×
单片机 > 单片机程序设计 > 详情

STM32F401 ILI9235液晶屏屏 2.8寸 驱动心得

发布时间:2020-06-09 发布时间:
|

ILI9235液晶屏屏幕

ILI9325有一个16位的索引寄存器(IR),一个18位的写数据寄存器(WDR),和一个18位的读数据寄存器(RDR)。

GPIO初始化,看电路图也就知道了改初始化哪几组引脚,特别注意输入输出模式的选择。

在驱动前需要些三个函数,一个是写指令函数,一个写数据函数。 还有一个读取IC函数。在这三个函数的基础上,便可以促使化LCD了。

这一段代码就不用深入,从厂家给的程序复制就好。

 Write_Cmd_Data(0x0001,0x0100);  //0001,0100

Write_Cmd_Data(0x0002,0x0700);

Write_Cmd_Data(0x0003,0x1030);

delayms(10);

Write_Cmd_Data(0x0004,0x0000);

Write_Cmd_Data(0x0008,0x0202); 0008,0202

Write_Cmd_Data(0x0009,0x0000);

Write_Cmd_Data(0x000a,0x0000);

Write_Cmd_Data(0x000c,0x0000);

Write_Cmd_Data(0x000d,0x0000);

Write_Cmd_Data(0x000f,0x0000);

 

Write_Cmd_Data(0x0010,0x0000);

Write_Cmd_Data(0x0011,0x0000);

Write_Cmd_Data(0x0012,0x0000);

Write_Cmd_Data(0x0013,0x0000);

  delayms(10);

Write_Cmd_Data(0x0010,0x17b0);

Write_Cmd_Data(0x0011,0x0037);

  delayms(10);

Write_Cmd_Data(0x0012,0x0138);

   delayms(10);

Write_Cmd_Data(0x0013,0x1500);

Write_Cmd_Data(0x0029,0x000d);

   delayms(10);

Write_Cmd_Data(0x0020,0x0000);

Write_Cmd_Data(0x0021,0x0000);

在做好这些步骤后,我们还需要这几个函数,清屏函数,坐标函数,打点函数,划线函数。这几个函数为实现STEMWIN移植打下基础,我这里不写字符串显示函数,就是因为移植了STEMwin的原因。

下面这些宏定义出各个颜色的指令,为了方便使用。指令哪里来的查手册。

#define White          0xFFFF

#define Black          0x0000

#define Blue           0x001F

#define Blue2          0x051F

#define Red            0xF800

#define Magenta        0xF81F

#define Green          0x07E0

#define Cyan           0x7FFF

#define Yellow         0xFFE0

这些工作我都在工程下的perphera下面的ILI9325.C和ILI9325.H中实现了。附上代码。。。。

 



#include "ILI93XX.h"
#include "Delay.h"


#define  MAX_X  240
#define  MAX_Y  320  


#define  CS_H GPIO_SetBits(GPIOC,GPIO_Pin_9)     //CS -- PC9
#define  CS_L GPIO_ResetBits(GPIOC,GPIO_Pin_9)


#define  RS_H GPIO_SetBits(GPIOC,GPIO_Pin_8) //RS -- PC8
#define  RS_L GPIO_ResetBits(GPIOC,GPIO_Pin_8)


#define WR_H GPIO_SetBits(GPIOC,GPIO_Pin_7) //RW -- PC7 
#define WR_L GPIO_ResetBits(GPIOC,GPIO_Pin_7)


#define  RD_H GPIO_SetBits(GPIOC,GPIO_Pin_6) //RD -- PC6
#define  RD_L GPIO_ResetBits(GPIOC,GPIO_Pin_6)


#define  PortData (GPIOB->ODR)   //输出数据端口 PB






/*=========================================
*-函数功能 : 液晶相关端口初始化
*-输入参数 : 无
=========================================*/
void LCD_GPIO_Config(void)
{


GPIO_InitTypeDef GPIO_InitStruct; 

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE); 
//=========数据端口PROTB=====================//

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;  
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; 
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; 
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; 
  GPIO_Init(GPIOB, &GPIO_InitStruct);

//=========控制端口=====================//
//PC6-->RD  PC7-->RW   PC8-->RS  PC9-->CS 
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6+GPIO_Pin_7+GPIO_Pin_8+GPIO_Pin_9;  
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; 
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; 
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; 
  GPIO_Init(GPIOC, &GPIO_InitStruct);


}
/*=========================================
*-函数功能 : 写指令
*-输入参数 : Cmd
=========================================*/
void LCD_Write_Cmd(uint16_t Cmd)
{  
CS_L;
   RS_L;
//GPIOC->BSRRH = 0x300;
RD_H;
PortData = Cmd ;
WR_L;
//GPIOC->BSRRH = 0x280;
WR_H;
CS_H;
}
/*=========================================
*-函数功能 : 写数据
*-输入参数 : Data
=========================================*/
void LCD_Write_Data(uint16_t Data)
{
CS_L;
//GPIOC->BSRRH = 0x140;
RS_H;
RD_H;
PortData = Data ;
WR_L;
//GPIOC->BSRRH = 0x280;
WR_H;
CS_H;
}
/*=========================================
*-函数功能 : 读数据
*-输入参数 : 无
=========================================*/
uint16_t LCD_Read_Data(void)
{
uint16_t value;
CS_L;
RD_L;
RS_H;
WR_H;
//GPIOC->BSRRL = 0x240;
//GPIOC->BSRRH = 0x180;
GPIOB->MODER = 0X00000000;

value = GPIOB->IDR ;
value = GPIOB->IDR ;

GPIOB->MODER = 0X55555555;
//GPIOC->BSRRH = 0x240;
RD_H;
CS_H;
return value;
}


/*=========================================
*-函数功能 : 读去液晶驱动IC
*-输入参数 : 无
=========================================*/
uint16_t Read_ID(void)
{
uint16_t val;
LCD_Write_Cmd(0x0000);
val = LCD_Read_Data();
return val;





/*=========================================
*-函数功能 : 写指令,写数据
*-输入参数 : Cmd,Data
=========================================*/
void Write_Cmd_Data(uint16_t Cmd, uint16_t Data)
{
LCD_Write_Cmd(Cmd);
LCD_Write_Data(Data); 
}


//读寄存器
//LCD_Reg:寄存器地址
//返回值:读到的数据
u16 LCD_ReadReg(u16 LCD_Reg)
{   
LCD_Write_Cmd(LCD_Reg); //写入要读的寄存器序号  
return LCD_Read_Data(); //返回读到的值

/*=========================================
*-函数功能 : ILI93XX液晶初始化
*-输入参数 : 无
=========================================*/
void TFT_Init(void)
{
LCD_GPIO_Config();                /*初始化IO口*/
 CS_L;
delayms(5);
Write_Cmd_Data(0x00e5,0x8000); 
    Write_Cmd_Data(0x0000,0x0001);
delayms(10); 
    Write_Cmd_Data(0x0001,0x0100);  //0001,0100
Write_Cmd_Data(0x0002,0x0700); 
Write_Cmd_Data(0x0003,0x1030); 
// delayms(10); 
Write_Cmd_Data(0x0004,0x0000); 
Write_Cmd_Data(0x0008,0x0202); //0008,0202
Write_Cmd_Data(0x0009,0x0000);
Write_Cmd_Data(0x000a,0x0000);
Write_Cmd_Data(0x000c,0x0000);
Write_Cmd_Data(0x000d,0x0000);
Write_Cmd_Data(0x000f,0x0000);


Write_Cmd_Data(0x0010,0x0000);
Write_Cmd_Data(0x0011,0x0000);
Write_Cmd_Data(0x0012,0x0000);
Write_Cmd_Data(0x0013,0x0000);
 delayms(10);
Write_Cmd_Data(0x0010,0x17b0);
Write_Cmd_Data(0x0011,0x0037);
 delayms(10);
Write_Cmd_Data(0x0012,0x0138);
  delayms(10);
Write_Cmd_Data(0x0013,0x1500);
Write_Cmd_Data(0x0029,0x000d);
  delayms(10);
Write_Cmd_Data(0x0020,0x0000); //ˮƽ·½Ïò 0020£¬0000
Write_Cmd_Data(0x0021,0x0000); //´¹Ö±·½Ïò 0021£¬0000


//*********************************************Set gamma
Write_Cmd_Data(0x0030,0x0001);
Write_Cmd_Data(0x0031,0x0606);
Write_Cmd_Data(0x0032,0x0304);
Write_Cmd_Data(0x0033,0x0202);
Write_Cmd_Data(0x0034,0x0202);
Write_Cmd_Data(0x0035,0x0103);
Write_Cmd_Data(0x0036,0x011d);
Write_Cmd_Data(0x0037,0x0404);
Write_Cmd_Data(0x0038,0x0404);
Write_Cmd_Data(0x0039,0x0404);
Write_Cmd_Data(0x003c,0x0700);
Write_Cmd_Data(0x003d,0x0a1f);
//**********************************************Set Gram aera
Write_Cmd_Data(0x0050,0x0000);
Write_Cmd_Data(0x0051,0x00ef);
Write_Cmd_Data(0x0052,0x0000);
Write_Cmd_Data(0x0053,0x013f);
Write_Cmd_Data(0x0060,0xA700);//0060,2700  É¨ÃèÐòÁÐ
Write_Cmd_Data(0x0061,0x0001);
Write_Cmd_Data(0x006a,0x0000);
//*********************************************Paratial display
Write_Cmd_Data(0x0090,0x0010);
Write_Cmd_Data(0x0092,0x0000);
Write_Cmd_Data(0x0093,0x0003);
Write_Cmd_Data(0x0095,0x0101);
Write_Cmd_Data(0x0097,0x0000);
Write_Cmd_Data(0x0098,0x0000);
//******************************************** Plan Control
Write_Cmd_Data(0x0007,0x0021);
delayms(300);
Write_Cmd_Data(0x0007,0x0031);
delayms(300);
Write_Cmd_Data(0x0007,0x0173);
delayms(300);

Write_Cmd_Data(0x00,0x22);
CS_H;
}




/*=========================================
*-函数功能 : 清屏
*-输入参数 : Color
=========================================*/
void LCD_Clear(uint16_t Color)
{
uint32_t index=0;

SetWindow(0,240,0,320);
for( index = 0; index < MAX_X * MAX_Y; index++ )
{
LCD_Write_Data(Color); 

}
/*=========================================
*-函数功能 : 设计坐标
*-输入参数 : Xpos,Ypos
=========================================*/
void SetWindow(unsigned int X_Start,unsigned int X_End,unsigned int Y_Start,unsigned int Y_End)
{
Write_Cmd_Data(0X0050,X_Start);  
Write_Cmd_Data(0X0051,X_End);  
Write_Cmd_Data(0X0052,Y_Start);  
Write_Cmd_Data(0X0053,Y_End);  
Write_Cmd_Data(0X0020,X_Start);  
Write_Cmd_Data(0X0021,Y_Start);  
LCD_Write_Cmd(0x0022);  
}
/*=========================================
*-函数功能 : 打点函数
*-输入参数 : Xpos,Ypos,point
=========================================*/
void LCD_SetPoint(uint16_t Xpos,uint16_t Ypos,uint16_t point)
{
SetWindow(Xpos,Xpos+1,Ypos,Ypos+1);
Write_Cmd_Data(0x0022,point);
}


//在指定区域内填充单个颜色
//(sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)   
//color:要填充的颜色
void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)
{          
u32 j;
u32 xlen=0;
SetWindow(sx,ex,sy,ey);       //设置光标位置 
LCD_Write_Cmd(0x0022);
xlen=(ex-sx)*(ey-sy);
for(j=0;j}


/*=========================================
*-函数功能 : 读点函数
*-输入参数 : Xpos,Ypos,point
=========================================*/
u16 LCD_ReadPoint(uint16_t Xpos,uint16_t Ypos)
{
SetWindow(Xpos,Xpos+1,Ypos,Ypos+1);
return LCD_ReadReg(0x0022);
}


/*=========================================
*-函数功能 : 画点触摸用到
*-输入参数 : X,Y,color
=========================================*/
void Draw_Pixel(uint16_t X,uint16_t Y,uint16_t color)
{    
LCD_SetPoint(X, Y, color);//中心点 
LCD_SetPoint(X+1, Y, color);
LCD_SetPoint(X, Y+1,color);
LCD_SetPoint(X+1, Y+1,color);   



/*=========================================
*-函数功能 : 划线函数
*-输入参数 : x1,y1,x2,y2
=========================================*/
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
uint16_t t; 
int xerr=0,yerr=0,delta_x,delta_y,distance; 
int incx,incy,uRow,uCol; 


delta_x=x2-x1; 
delta_y=y2-y1; 
uRow=x1; 
uCol=y1; 
if(delta_x>0)incx=1; 
else if(delta_x==0)incx=0;
else {incx=-1;delta_x=-delta_x;} 
if(delta_y>0)incy=1; 
else if(delta_y==0)incy=0;
else{incy=-1;delta_y=-delta_y;} 
if( delta_x>delta_y)distance=delta_x; 
else distance=delta_y; 
for(t=0;t<=distance+1;t++ )
{  
LCD_SetPoint(uRow,uCol,0XF800);
xerr+=delta_x ; 
yerr+=delta_y ; 
if(xerr>distance) 

xerr-=distance; 
uRow+=incx; 

if(yerr>distance) 

yerr-=distance; 
uCol+=incy; 

}  
}
u16 RGB(u8 R,u8 G,u8 B)
{
return((u16)(R&0XF8)<<8|(u16)(G&0XFC)<<3|(u16)(B&0XF8)>>3);



 

 #ifndef __ILI93XX_H
#define __ILI93XX_H


#include "stm32f4xx.h"




/* LCD color */
#define White          0xFFFF
#define Black          0x0000
#define Blue           0x001F
#define Blue2          0x051F
#define Red            0xF800
#define Magenta        0xF81F
#define Green          0x07E0
#define Cyan           0x7FFF
#define Yellow         0xFFE0




void LCD_WriteReg(uint16_t Cmd); //写指令
void LCD_Write_Data(uint16_t Data); //写数据
uint16_t LCD_Read_Data(void); //读数据
uint16_t Read_ID(void); //读ID


void Write_Cmd_Data(uint16_t Cmd, uint16_t Data); //写指令和写数据
u16 LCD_ReadReg(u16 LCD_Reg); //读寄存器
void TFT_Init(void); //液晶初始化


void LCD_Clear(uint16_t Color); //清屏
void SetWindow(unsigned int X_Start,unsigned int X_End,unsigned int Y_Start,unsigned int Y_End); //设置坐标
void LCD_SetPoint(uint16_t Xpos,uint16_t Ypos,uint16_t point); //画点函数
u16 LCD_ReadPoint(uint16_t Xpos,uint16_t Ypos); //读点函数
void Draw_Pixel(uint16_t X,uint16_t Y,uint16_t color); //触摸画笔最小像素
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);  //画线函数




#endif


关键字:STM32F401  ILI9235  液晶屏屏

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
可升级和可配置的PSoC62系列MCU平台架构