📄 tft.h
字号:
u32 result=1;
while(n--)result*=m;
return result;
}
//显示2个数字
//x,y :起点坐标
//len :数字的位数
//size:字体大小
//color:颜色
//num:数值(0~4294967295);
void LCD_ShowNum(u8 x,u16 y,u32 num,u8 len,u8 size)
{
u8 t,temp;
u8 enshow=0;
for(t=0;t<len;t++)
{
temp=(num/mypow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
LCD_ShowChar(x+(size/2)*t,y,' ',size,0);
continue;
}else enshow=1;
}
LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,0);
}
}
//显示2个数字
//x,y:起点坐标
//size:字体大小
//mode:模式 0,填充模式;1,叠加模式
//num:数值(0~99);
void LCD_Show2Num(u8 x,u16 y,u16 num,u8 len,u8 size,u8 mode)
{
u8 t,temp;
for(t=0;t<len;t++)
{
temp=(num/mypow(10,len-t-1))%10;
LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,mode);
}
}
//显示字符串
//x,y:起点坐标
//*p:字符串起始地址
//用16字体
void LCD_ShowString(u8 x,u16 y,const u8 *p)
{
while(*p!='\0')
{
if(x>MAX_CHAR_POSX){x=0;y+=16;}
if(y>MAX_CHAR_POSY){y=x=0;LCD_Clear(WHITE);}
LCD_ShowChar(x,y,*p,16,0);
x+=8;
p++;
}
}
void LCD_LineCfg(void)
{
RCC->AHBENR|=1<<8; //使能FSMC
RCC->APB2ENR|=1<<0; //使能AFIO时钟
RCC->APB2ENR|=1<<4; //使能PORTC时钟
RCC->APB2ENR|=1<<5; //使能PORTD时钟
RCC->APB2ENR|=1<<6; //使能PORTE时钟
GPIOD->CRL&=0X0000FF00;
GPIOD->CRL|=0XB3BB00BB;//PD0,PD1,PD4,PD5,PD7推挽输出
GPIOD->CRH&=0X00FF0000;
GPIOD->CRH|=0XBB00BBBB;//PD8~PD11,PD14,PD15 推挽输出
GPIOD->ODR|=0XC733; //输出高
GPIOE->CRL&=0X0FFFF0FF;
GPIOE->CRL|=0XB0000B00;//PE7,E2 推挽输出
GPIOE->CRH=0XBBBBBBBB;//PE8~PE15推挽输出
GPIOE->ODR|=0XFFC0; //输出高
}
void LCD_FSMCConfig(void)
{
FSMC_Bank1->BTCR[FSMC_Bank1_NORSRAM1]= (u32)FSMC_DataAddressMux_Disable|
FSMC_MemoryType_NOR|FSMC_MemoryDataWidth_16b|FSMC_BurstAccessMode_Disable|
FSMC_WaitSignalPolarity_Low|FSMC_WrapMode_Disable|FSMC_WaitSignalActive_BeforeWaitState|
FSMC_WriteOperation_Enable|FSMC_WaitSignal_Disable|FSMC_ExtendedMode_Disable|
FSMC_AsyncWait_Disable|FSMC_WriteBurst_Disable;
FSMC_Bank1->BTCR[FSMC_Bank1_NORSRAM1]|=((u32)0x00000040);//(u32)BCR_FACCEN_Set;
FSMC_Bank1->BTCR[FSMC_Bank1_NORSRAM1+1]=
(u32)0x00|//FSMC_AddressSetupTime
(0x00<<4)|//FSMC_AddressHoldTime
(0x02<<8)|//FSMC_DataSetupTime
(0x00<<16)|//SMC_BusTurnAroundDuration
(0x00<<20)|//FSMC_CLKDivision
(0x00<<24)|//FSMC_DataLatency
FSMC_AccessMode_A;//FSMC_AccessMode
FSMC_Bank1E->BWTR[FSMC_Bank1_NORSRAM1]=0x0FFFFFFF;
FSMC_Bank1->BTCR[FSMC_Bank1_NORSRAM1]|=((u32)0x00000001);//Enable FSMC Bank1_SRAM Bank
}
//初始化lcd
//该初始化函数可以初始化各种ILI93XX液晶,但是其他函数是基于ILI9320的!!!
//在其他型号的驱动芯片上没有测试!
void LCD_Init(void)
{
u32 i;
LCD_LineCfg();
LCD_FSMCConfig();
LCD_WriteReg(0x0000,0x0001);
Delay(5); // delay 50 ms
DeviceCode = LCD_ReadReg(0x0000);
// printf("ID:%d\n",DeviceCode);
if(DeviceCode==0x9325||DeviceCode==0x9328)
{
LCD_WriteReg(0x00e7,0x0010);
LCD_WriteReg(0x0000,0x0001); //start internal osc
LCD_WriteReg(0x0001,0x0100);
LCD_WriteReg(0x0002,0x0700); //power on sequence
LCD_WriteReg(0x0003,(1<<12)|(1<<5)|(1<<4) ); //65K
LCD_WriteReg(0x0004,0x0000);
LCD_WriteReg(0x0008,0x0207);
LCD_WriteReg(0x0009,0x0000);
LCD_WriteReg(0x000a,0x0000); //display setting
LCD_WriteReg(0x000c,0x0001); //display setting
LCD_WriteReg(0x000d,0x0000); //0f3c
LCD_WriteReg(0x000f,0x0000);
LCD_WriteReg(0x0010,0x0000);
LCD_WriteReg(0x0011,0x0007);
LCD_WriteReg(0x0012,0x0000);
LCD_WriteReg(0x0013,0x0000);
for(i=50000;i>0;i--);
for(i=50000;i>0;i--);
LCD_WriteReg(0x0010,0x1590);
LCD_WriteReg(0x0011,0x0227);
for(i=50000;i>0;i--);
for(i=50000;i>0;i--);
LCD_WriteReg(0x0012,0x009c);
for(i=50000;i>0;i--);
for(i=50000;i>0;i--);
LCD_WriteReg(0x0013,0x1900);
LCD_WriteReg(0x0029,0x0023);
LCD_WriteReg(0x002b,0x000e);
for(i=50000;i>0;i--);
for(i=50000;i>0;i--);
LCD_WriteReg(0x0020,0x0000);
LCD_WriteReg(0x0021,0x0000);
for(i=50000;i>0;i--);
for(i=50000;i>0;i--);
LCD_WriteReg(0x0030,0x0007);
LCD_WriteReg(0x0031,0x0707);
LCD_WriteReg(0x0032,0x0006);
LCD_WriteReg(0x0035,0x0704);
LCD_WriteReg(0x0036,0x1f04);
LCD_WriteReg(0x0037,0x0004);
LCD_WriteReg(0x0038,0x0000);
LCD_WriteReg(0x0039,0x0706);
LCD_WriteReg(0x003c,0x0701);
LCD_WriteReg(0x003d,0x000f);
for(i=50000;i>0;i--);
for(i=50000;i>0;i--);
LCD_WriteReg(0x0050,0x0000);
LCD_WriteReg(0x0051,0x00ef);
LCD_WriteReg(0x0052,0x0000);
LCD_WriteReg(0x0053,0x013f);
LCD_WriteReg(0x0060,0xa700);
LCD_WriteReg(0x0061,0x0001);
LCD_WriteReg(0x006a,0x0000);
LCD_WriteReg(0x0080,0x0000);
LCD_WriteReg(0x0081,0x0000);
LCD_WriteReg(0x0082,0x0000);
LCD_WriteReg(0x0083,0x0000);
LCD_WriteReg(0x0084,0x0000);
LCD_WriteReg(0x0085,0x0000);
LCD_WriteReg(0x0090,0x0010);
LCD_WriteReg(0x0092,0x0000);
LCD_WriteReg(0x0093,0x0003);
LCD_WriteReg(0x0095,0x0110);
LCD_WriteReg(0x0097,0x0000);
LCD_WriteReg(0x0098,0x0000);
LCD_WriteReg(0x0007,0x0133);
LCD_WriteReg(0x0020,0x0000);
LCD_WriteReg(0x0021,0x0000);
}
else if(DeviceCode==0x9320||DeviceCode==0x9300)
{
LCD_WriteReg(0x00,0x0000);
LCD_WriteReg(0x01,0x0100); //Driver Output Contral.
LCD_WriteReg(0x02,0x0700); //LCD Driver Waveform Contral.
LCD_WriteReg(0x03,0x1018); //Entry Mode Set.
LCD_WriteReg(0x04,0x0000); //Scalling Contral.
LCD_WriteReg(0x08,0x0202); //Display Contral 2.(0x0207)
LCD_WriteReg(0x09,0x0000); //Display Contral 3.(0x0000)
LCD_WriteReg(0x0a,0x0000); //Frame Cycle Contal.(0x0000)
LCD_WriteReg(0x0c,(1<<0)); //Extern Display Interface Contral 1.(0x0000)
LCD_WriteReg(0x0d,0x0000); //Frame Maker Position.
LCD_WriteReg(0x0f,0x0000); //Extern Display Interface Contral 2.
for(i=50000;i>0;i--);
for(i=50000;i>0;i--);
LCD_WriteReg(0x07,0x0101); //Display Contral.
for(i=50000;i>0;i--);
for(i=50000;i>0;i--);
LCD_WriteReg(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4)); //Power Control 1.(0x16b0)
LCD_WriteReg(0x11,0x0007); //Power Control 2.(0x0001)
LCD_WriteReg(0x12,(1<<8)|(1<<4)|(0<<0)); //Power Control 3.(0x0138)
LCD_WriteReg(0x13,0x0b00); //Power Control 4.
LCD_WriteReg(0x29,0x0000); //Power Control 7.
LCD_WriteReg(0x2b,(1<<14)|(1<<4));
LCD_WriteReg(0x50,0); //Set X Start.
LCD_WriteReg(0x51,239); //Set X End.
LCD_WriteReg(0x52,0); //Set Y Start.
LCD_WriteReg(0x53,319); //Set Y End.
LCD_WriteReg(0x60,0x2700); //Driver Output Control.
LCD_WriteReg(0x61,0x0001); //Driver Output Control.
LCD_WriteReg(0x6a,0x0000); //Vertical Srcoll Control.
LCD_WriteReg(0x80,0x0000); //Display Position? Partial Display 1.
LCD_WriteReg(0x81,0x0000); //RAM Address Start? Partial Display 1.
LCD_WriteReg(0x82,0x0000); //RAM Address End-Partial Display 1.
LCD_WriteReg(0x83,0x0000); //Displsy Position? Partial Display 2.
LCD_WriteReg(0x84,0x0000); //RAM Address Start? Partial Display 2.
LCD_WriteReg(0x85,0x0000); //RAM Address End? Partial Display 2.
LCD_WriteReg(0x90,(0<<7)|(16<<0)); //Frame Cycle Contral.(0x0013)
LCD_WriteReg(0x92,0x0000); //Panel Interface Contral 2.(0x0000)
LCD_WriteReg(0x93,0x0001); //Panel Interface Contral 3.
LCD_WriteReg(0x95,0x0110); //Frame Cycle Contral.(0x0110)
LCD_WriteReg(0x97,(0<<8)); //
LCD_WriteReg(0x98,0x0000); //Frame Cycle Contral.
LCD_WriteReg(0x07,0x0173); //(0x0173)
}
else if(DeviceCode==0x4531)
{
LCD_WriteReg(0x00,0x0001);
LCD_WriteReg(0x10,0x0628);
LCD_WriteReg(0x12,0x0006);
LCD_WriteReg(0x13,0x0A32);
LCD_WriteReg(0x11,0x0040);
LCD_WriteReg(0x15,0x0050);
LCD_WriteReg(0x12,0x0016);
Delay(10);
LCD_WriteReg(0x10,0x5660);
Delay(10);
LCD_WriteReg(0x13,0x2A4E);
LCD_WriteReg(0x01,0x0100);
LCD_WriteReg(0x02,0x0300);
LCD_WriteReg(0x03,0x1030);
LCD_WriteReg(0x08,0x0202);
LCD_WriteReg(0x0A,0x0000);
LCD_WriteReg(0x30,0x0000);
LCD_WriteReg(0x31,0x0402);
LCD_WriteReg(0x32,0x0106);
LCD_WriteReg(0x33,0x0700);
LCD_WriteReg(0x34,0x0104);
LCD_WriteReg(0x35,0x0301);
LCD_WriteReg(0x36,0x0707);
LCD_WriteReg(0x37,0x0305);
LCD_WriteReg(0x38,0x0208);
LCD_WriteReg(0x39,0x0F0B);
Delay(10);
LCD_WriteReg(0x41,0x0002);
LCD_WriteReg(0x60,0x2700);
LCD_WriteReg(0x61,0x0001);
LCD_WriteReg(0x90,0x0119);
LCD_WriteReg(0x92,0x010A);
LCD_WriteReg(0x93,0x0004);
LCD_WriteReg(0xA0,0x0100);
Delay(10);
LCD_WriteReg(0x07,0x0133);
Delay(10);
LCD_WriteReg(0xA0,0x0000);
Delay(10);
}
for(i=50000;i>0;i--);
LCD_Clear(WHITE);
}
/*********************************************
** 硬件连接说明 **
** STM32 ili9481 **
** PE/PD(FSMC_D0-15) <----> DB0~15 **
** PD4 (FSMC_NOE) <----> nRD **
** PD5 (FSMC_NWE) <----> nWR **
** PD7 (FSMC_NE1) <----> nCS **
** PD11(FSMC_A23) <----> RS **
** PC1 <----> nReset **
PD.14(D0), PD.15(D1), PD.00(D2), PD.01(D3), PD.08(D13), PD.09(D14), PD.10(D15),
PD.04(RD), PD.05(WR), PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8),
PE.12(D9), PE.13(D10), PE.14(D11), PE.15(D12)
*********************************************/
//设置窗口
//入口参数: x0 y0,为显示窗口左上角坐标;x1,y1为显示窗口右下角坐标。
//说明:该函数设置TFT模块的显示窗口。
void TFT_window(unsigned char x0,unsigned int y0,unsigned char x1,unsigned int y1)
{
LCD_WriteReg(0x0050,x0);//水平起始位置
LCD_WriteReg(0x0051,x1);//水平终止位置
LCD_WriteReg(0x0052,y0);//垂直起始位置
LCD_WriteReg(0x0053,y1);//垂直终止位置
LCD_WriteReg(0x0020,x0);//设置X坐标位置
LCD_WriteReg(0x0021,y0);//设置Y坐标位置
LCD_WriteRAM_Prepare();//LCD_WriteCMD(GRAMWR);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -