⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ili9331.c

📁 STM32摄像头程序
💻 C
字号:

/*
TFT实际控制器型号MTM3225A 2。8“
GUANFU_WANG
*/



#include  "english_16x8.h"
#include"ILI9331.h"
#include"delay.h"
extern unsigned char val_Speed[16][100];
/*******************************************************************************
* Function Name  : GPIO_Config
* Description    : Configures the different GPIO ports pins.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/

void LCD_GPIO_OUTPUT(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable GPIOB clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void LCD_GPIO_INPUT(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable GPIOB clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

}

void  LCD_Set_GPIO_Config(void)
{
  
  GPIO_InitTypeDef GPIO_InitStructure;
  /* Enable GPIOB clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  GPIO_InitStructure.GPIO_Pin =LCD_CS_BIT|LCD_RS_BIT|LCD_WR_BIT|LCD_RD_BIT;                               
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  LCD_RD_H();
  LCD_RS_H();
  LCD_CS_H();  
  LCD_WR_H();
}
void  LCD_BL_GPIO_Config(void)
{
  
  GPIO_InitTypeDef GPIO_InitStructure;
  /* Enable GPIOA clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
  GPIO_InitStructure.GPIO_Pin =LCD_BL_BIT;                               
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure); 
}


void LCD_WR_DATA16(unsigned int data)//写积存器数据
{
     LCD_RD_H();
     LCD_RS_H();
     LCD_CS_L();
     GPIOB->ODR=(GPIOB->ODR&0XFF00)| (unsigned char)(data>>8);  
     LCD_WR_L();
     
     LCD_WR_H();
     GPIOB->ODR=(GPIOB->ODR&0XFF00)|(unsigned char)data;
     LCD_WR_L();
     
     LCD_WR_H();
     LCD_CS_H();
  
}
void LCD_WR_REG16(unsigned int index)//写积存器命令
{
     LCD_RD_H();
     LCD_RS_L();
     LCD_CS_L(); 
     GPIOB->ODR=(GPIOB->ODR&0XFF00)| (unsigned char)(index>>8); 
     LCD_WR_L();
     
     LCD_WR_H();
      GPIOB->ODR=(GPIOB->ODR&0XFF00)|(unsigned char)index;    
     LCD_WR_L();

     LCD_WR_H();
     LCD_CS_H();
}
unsigned int LCD_RD_DATA16(void)//读积存器数据
{
     unsigned int data;
     LCD_WR_H();
     LCD_RS_H();
     LCD_GPIO_INPUT();
     LCD_CS_L(); 
 
     LCD_RD_L();
     
     LCD_RD_H();
     data=(0x00ff&DATA_LCD_PIN); 
     data=data<<8;
     
	 
     LCD_RD_L();
     
     LCD_RD_H();
     data|=(0x00ff&DATA_LCD_PIN);
     
     LCD_CS_H();
     LCD_GPIO_OUTPUT();
     return data;
  
}
void LCD_WR_REG(unsigned int index,unsigned int data)
{
     LCD_WR_REG16(index);
     LCD_WR_DATA16(data);
}


void LCD_Init(void)
{   

    LCD_BL_GPIO_Config();
    LCD_GPIO_OUTPUT();
    LCD_Set_GPIO_Config();   
   // LCD_RST_L();
    
   // LCD_RST_H();
    LCD_BL_L(); 
    delay_ms(2000); 
	LCD_WR_REG(0x00E3,0x3008);        
	LCD_WR_REG(0x00E7,0x0012);
	LCD_WR_REG(0x00Ef,0x1231); 	// Set the internal timing;    
	//initializing funciton 1 
         LCD_WR_REG(0x00,0x0001);
         LCD_WR_REG(0x01, 0x0000); // set SS and SM bit
         LCD_WR_REG(0x02, 0x0700); // set 1 line inversion
        // LCD_WR_REG(0x03, 0x10B0); // set GRAM write direction and BGR=1.
#if   ID_AM==000       
	     LCD_WR_REG(0x0003,0x1000);//屏幕旋转控制 TFM=0,TRI=0,SWAP=1,16 bits system interface  swap RGB to BRG,此处ORG和HWM 为0
#elif ID_AM==001        
	     LCD_WR_REG(0x0003,0x1008);      
#elif ID_AM==010  
	     LCD_WR_REG(0x0003,0x1010);        
#elif ID_AM==011
	     LCD_WR_REG(0x0003,0x1018);
#elif ID_AM==100  
	     LCD_WR_REG(0x0003,0x1020);      
#elif ID_AM==101  
	     LCD_WR_REG(0x0003,0x1028);      
#elif ID_AM==110  
	     LCD_WR_REG(0x0003,0x1030);      
#elif ID_AM==111  
	     LCD_WR_REG(0x0003,0x1038);
#endif    
         LCD_WR_REG(0x04, 0x0000); // Resize register
         LCD_WR_REG(0x08, 0x0404); // set the back porch and front porch
         LCD_WR_REG(0x09, 0x0000); // set non-display area refresh cycle ISC[3:0]
         LCD_WR_REG(0x0A, 0x0000); // FMARK function
        // LCD_WR_REG(0x0C, 0x0000); // RGB interface setting
        // LCD_WR_REG(0x0D, 0x0000); // Frame marker Position
        // LCD_WR_REG(0x0F, 0x0000); // RGB interface polarity
//Power On sequence //
         LCD_WR_REG(0x10, 0x0080); // SAP, BT[3:0], AP, DSTB, SLP, STB
         LCD_WR_REG(0x11, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0]
         LCD_WR_REG(0x12, 0x0000); // VREG1OUT voltage
         LCD_WR_REG(0x13, 0x0000); // VDV[4:0] for VCOM amplitude
	 LCD_WR_REG(0x07, 0x0001); // 
		 
         delay_ms(2000); // Dis-charge capacitor power voltage
         
         LCD_WR_REG(0x10, 0x1790); // SAP, BT[3:0], AP, DSTB, SLP, STB
         LCD_WR_REG(0x11, 0x0137); // DC1[2:0], DC0[2:0], VC[2:0]
         delay_ms(1000); // Delay 50ms
        
         LCD_WR_REG(0x12, 0x001f); // Internal reference voltage= Vci;
         delay_ms(1000); // Delay 50ms
         LCD_WR_REG(0x13, 0x1500); // Set VDV[4:0] for VCOM amplitude
         LCD_WR_REG(0x29, 0x002d); // Set VCM[5:0] for VCOMH
         LCD_WR_REG(0x2B, 0x000f); // Set Frame Rate
         delay_ms(500); // Delay 50ms
         
#if   ID_AM==000         
	     LCD_WR_REG(0x0020,0x00ef);//GRAM水平起始位置
	     LCD_WR_REG(0x0021,0x013f);      
#elif ID_AM==001
	     LCD_WR_REG(0x0020,0x00ef);
	     LCD_WR_REG(0x0021,0x013f);      
#elif ID_AM==010
	     LCD_WR_REG(0x0020,0x0000);
	     LCD_WR_REG(0x0021,0x013f);      
#elif ID_AM==011
	     LCD_WR_REG(0x0020,0x0000);
	     LCD_WR_REG(0x0021,0x013f);       
#elif ID_AM==100
	     LCD_WR_REG(0x0020,0x00ef);
	     LCD_WR_REG(0x0021,0x0000);      
#elif ID_AM==101  
	     LCD_WR_REG(0x0020,0x00ef);
	     LCD_WR_REG(0x0021,0x0000);      
#elif ID_AM==110
	     LCD_WR_REG(0x0020,0x0000);
	     LCD_WR_REG(0x0021,0x0000);      
#elif ID_AM==111
	     LCD_WR_REG(0x0020,0x0000);
	     LCD_WR_REG(0x0021,0x0000);         
#endif  
// ----------- Adjust the Gamma Curve ----------//
		LCD_WR_REG(0x0030,0x0101);
		LCD_WR_REG(0x0031,0x0707);
		LCD_WR_REG(0x0032,0x0505);
		LCD_WR_REG(0x0035,0x0407);
		LCD_WR_REG(0x0036,0x0102);
		LCD_WR_REG(0x0037,0x0102);
		LCD_WR_REG(0x0038,0x0202);
		LCD_WR_REG(0x0039,0x0106);
		LCD_WR_REG(0x003C,0x0202);
		LCD_WR_REG(0x003D,0x0706);
//------------------ Set GRAM area ---------------//
         LCD_WR_REG(0x0050, 0x0000); // Horizontal GRAM Start Address
         LCD_WR_REG(0x0051, 0x00EF); // Horizontal GRAM End Address
         LCD_WR_REG(0x0052, 0x0000); // Vertical GRAM Start Address
         LCD_WR_REG(0x0053, 0x013F); // Vertical GRAM Start Address
         LCD_WR_REG(0x0060, 0xA700); // Gate Scan Line
         LCD_WR_REG(0x0061, 0x0001); // NDL,VLE, REV
         LCD_WR_REG(0x006A, 0x0000); // set scrolling line
//-------------- Partial Display Control ---------//
         LCD_WR_REG(0x80, 0x0000);
         LCD_WR_REG(0x81, 0x0000);
         LCD_WR_REG(0x82, 0x0000);
         LCD_WR_REG(0x83, 0x0000);
         LCD_WR_REG(0x84, 0x0000);
         LCD_WR_REG(0x85, 0x0000);
//-------------- Panel Control -------------------//
         LCD_WR_REG(0x90, 0x0010);
         LCD_WR_REG(0x92, 0x0000);
         LCD_WR_REG(0x93, 0x0003);
         LCD_WR_REG(0x95, 0x0110);
         LCD_WR_REG(0x97, 0x0000);
         LCD_WR_REG(0x98, 0x0000);
         LCD_WR_REG(0x07, 0x0173); // 262K color and display ON   0133
	 LCD_Clear(0x0000);
         delay_ms(1000); // Delay 5ms
         LCD_BL_H();
  
}


/**********************************************
函数名:Lcd全屏擦除函数
功能:将Lcd整屏擦为指定颜色
入口参数:color 指定Lcd全屏颜色 RGB(5-6-5)
返回值:无
***********************************************/
void LCD_Clear(unsigned int Color)
{
  unsigned long index = 0;
  
#if   ID_AM==000         
	     LCD_WR_REG(0x0020,0x00ef);//GRAM水平起始位置
	     LCD_WR_REG(0x0021,0x013f);      
#elif ID_AM==001
	     LCD_WR_REG(0x0020,0x00ef);
	     LCD_WR_REG(0x0021,0x013f);      
#elif ID_AM==010
	     LCD_WR_REG(0x0020,0x0000);
	     LCD_WR_REG(0x0021,0x013f);      
#elif ID_AM==011
	     LCD_WR_REG(0x0020,0x0000);
	     LCD_WR_REG(0x0021,0x013f);       
#elif ID_AM==100
	     LCD_WR_REG(0x0020,0x00ef);
	     LCD_WR_REG(0x0021,0x0000);      
#elif ID_AM==101  
	     LCD_WR_REG(0x0020,0x00ef);
	     LCD_WR_REG(0x0021,0x0000);      
#elif ID_AM==110
	     LCD_WR_REG(0x0020,0x0000);
	     LCD_WR_REG(0x0021,0x0000);      
#elif ID_AM==111
	     LCD_WR_REG(0x0020,0x0000);
	     LCD_WR_REG(0x0021,0x0000);         
#endif     

  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_REG16(0x0022);
  
 // LCD_RD_H();
//  LCD_RS_H();
  //LCD_CS_L();   
  for(index = 0; index < 76800; index++)
  {
   // LCD_WR_DATA16(Color);
 
    LCD_WR_DATA16(Color);
 
   
  } 
  // LCD_CS_H();
}

void LCD_write_english(unsigned char data,unsigned int color,unsigned int xcolor)//写字符
{

  unsigned char avl,i,n;
   LCD_WR_REG16(0x0022);  
  for (i=0;i<16;i++)
  { 
      avl=english[data-32][i];
	  for (n=0;n<8;n++)
	   {
	     if(avl&0x80) LCD_WR_DATA16(color);
             else LCD_WR_DATA16(xcolor);
           
	     avl<<=1;
	   }
	}
}
void LCD_write_english_string(unsigned int x,unsigned int y,unsigned char *s,unsigned int color,unsigned int xcolor)//英文字符串显示
{
 unsigned int k=0;
 while (*s) 
  {
     Lcd_SetBox(y,x+k,15,8);
     LCD_write_english( *s,color,xcolor);
     k=k+8;
     s++;
  
  }

}  

void LCD_write_SUM(unsigned int x,unsigned int y,unsigned char SUM,unsigned int color,unsigned int xcolor)//写数字
{

  unsigned char avl,i,n;
   Lcd_SetBox(y,x,15,8);
   LCD_WR_REG16(0x0022);  
  for (i=0;i<16;i++)
  { 
      avl=english[SUM+16][15-i];
	  for (n=0;n<8;n++)
	   {
	     if(avl&0x80) LCD_WR_DATA16(color);
             else LCD_WR_DATA16(xcolor);
           
	     avl<<=1;
	   }
	}
}
/**********************************************
函数名:Lcd块选函数
功能:选定Lcd上指定的矩形区域

注意:xStart和 yStart随着屏幕的旋转而改变,位置是矩形框的四个角

入口参数:xStart x方向的起始点
          ySrart y方向的终止点
          xLong 要选定矩形的x方向长度
          yLong  要选定矩形的y方向长度
返回值:无
***********************************************/
void Lcd_SetBox(unsigned int xStart,unsigned int yStart,unsigned int xLong,unsigned int yLong)
{
  
#if ID_AM==000    
	LCD_SetCursor(xStart+xLong-1,312-yStart+yLong-1);

#elif ID_AM==001
	LCD_SetCursor(xStart+xLong-1,312-yStart+yLong-1);
     
#elif ID_AM==010
	LCD_SetCursor(xStart,312-yStart+yLong-1);
     
#elif ID_AM==011 
	LCD_SetCursor(xStart,312-yStart+yLong-1);
     
#elif ID_AM==100
	LCD_SetCursor(xStart+xLong-1,312-yStart);     
     
#elif ID_AM==101
	LCD_SetCursor(xStart+xLong-1,312-yStart);     
     
#elif ID_AM==110
	LCD_SetCursor(xStart,312-yStart); 
     
#elif ID_AM==111
	LCD_SetCursor(xStart,312-yStart);  
     
#endif
     
	LCD_WR_REG(0x0050,xStart);//水平 GRAM起始位置
	LCD_WR_REG(0x0051,xStart+xLong-1);//水平GRAM终止位置
	LCD_WR_REG(0x0052,312-yStart);//垂直GRAM起始位置
	LCD_WR_REG(0x0053,312-yStart+yLong-1);//垂直GRAM终止位置 
}


/*************************************************
函数名:Lcd光标起点定位函数
功能:指定320240液晶上的一点作为写数据的起始点
入口参数:x 坐标 0~239
          y 坐标 0~319
返回值:无
*************************************************/
void LCD_SetCursor(unsigned int Xpos, unsigned int Ypos)
{
 // CLR_RS;
  LCD_WR_REG(0x20, Xpos);
  LCD_WR_REG(0x21, Ypos);
}

/*
void Test_tu(void)
{
   unsigned int i;
  // unsigned char  val;
  LCD_WR_REG(0x0020,20);//Lcd光标GRAM水平起始位置
  LCD_WR_REG(0x0021,105); //Lcd光标垂直GRAM起始位置     

  LCD_WR_REG(0x0050,20);//水平 GRAM起始位置
  LCD_WR_REG(0x0051,207);//水平GRAM终止位置
  LCD_WR_REG(0x0052,105);//垂直GRAM起始位置
  LCD_WR_REG(0x0053,207);//垂直GRAM终止位置 
  LCD_WR_REG16(0x0022);
    	
   LCD_RD_H();
   LCD_RS_H();
   LCD_CS_L(); 
  for (i=0;i<21218;)
  { 

     LCD_WR_L();
	 //LCD_WR_L();
     DATA_LCD_PORT=gImage[i++];
     LCD_WR_H();

     LCD_WR_L();
	 //LCD_WR_L();
     DATA_LCD_PORT=gImage[i++];
     LCD_WR_H(); 

	}
   LCD_CS_H();
}
*/




void Test(void)
{       
        unsigned long n,i;
       LCD_WR_REG(0x0020,0x0000);//GRAM水平起始位置
       LCD_WR_REG(0x0021,0x0000); 
        for(i=0;i<7;i++)
          
        {       
        
            
	        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_REG16(0x0022);       
                for(n=0;n<76800;n++)
                { 
                  
                  
                  if(i==0)LCD_WR_DATA16(BLUE);   
                  if(i==1)LCD_WR_DATA16(RED); 
                  if(i==2)LCD_WR_DATA16(GREEN);
                  if(i==3)LCD_WR_DATA16(CYAN); 
                  if(i==4)LCD_WR_DATA16(MAGENTA); 
                  if(i==5)LCD_WR_DATA16(YELLOW);
				  
                  if(i==6)LCD_WR_DATA16(0x0102); 
                }    
                 delay_ms(100);                   
        }       
}

void BMP_write_english(unsigned char x,unsigned char val_d,unsigned char color)//写字符
{

  unsigned char avl,i,n;
  for (i=0;i<16;i++)
  { 
      avl=english[val_d-32][i];
	  for (n=0;n<8;n++)
	   {
	     if(avl&0x1) val_Speed[15-i][(7-n)+x*8]=color;
             else val_Speed[15-i][(7-n)+x*8]=0;
           
	     avl>>=1;
	   }
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -