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

📄 tftlcd.c

📁 基于stm32的MP3播放器
💻 C
📖 第 1 页 / 共 2 页
字号:
	{	 
		for(n=0;n<9;n++)
		{
			temp=Button_XX[t1][n];
			for(t=0;t<8;t++)
			{
				if(temp&0x80) TFT_WR_Data16(POINT_COLOR); 
				else TFT_WR_Data16(BACK_COLOR);
				temp<<=1;						   
			}
		}
	} 	  
	//恢复面板
	TFT_WR_CMD(0,0x04,239);//结束列数(0~239)	
	TFT_WR_CMD(1,0x05,319); //结束行数(0~319)
}
  
//指定某行填充指定颜色.
//消掉第x列的y行
void Drow_Line_FFT(u8 x,u16 y,u16 color)
{
	u8 t;			   										     
	TFT_WR_CMD(0,0x2,x);//设置到原点
	TFT_WR_CMD(1,0x3,219-y);   
	TFT_WR_CMD(0,0x04,x+15);//结束列数(0~239)	
	TFT_WR_CMD(1,0x05,219-y); //结束行数(0~319)
	TFT_WR_REG(0x0E);
	for(t=0;t<16;t++)TFT_WR_Data16(color);				    
} 
//顶点/高端处理
//*flyval:当前顶点位置(14个)
//topstay1:用来标记在0~6顶点是否需要停留
//topstay2:用来标记在7~13顶点是否需要停留
void Top_Delet_FFT(u8 *flyval,u32 *topstay1,u32 *topstay2)
{
	u8 t;
	u32 temp;
	u32 temp1;
	temp=*topstay1;
	BACK_COLOR=BLACK;//背景黑色   
	for(t=0;t<14;t++)
	{   
		if(t==7)temp=*topstay2;
		temp1=temp&0x0F;
		if(temp1==0)//不需要停留
		{	 
			Drow_Line_FFT(t*17,flyval[t],BLACK);
			if(flyval[t])flyval[t]--;
			Drow_Line_FFT(t*17,flyval[t],RED);
		}else 
		{	
			temp1--;
			if(t<7) 
			{
				*topstay1&=~(0X0F<<4*t);
				*topstay1|=temp1<<4*t;//取消停留标志
			}else
			{
				*topstay2&=~(0X0F<<4*(t-7));
				*topstay2|=temp1<<4*(t-7);//取消停留标志
			}
		}	 							
		temp>>=4;	  
	} 
}  
//升高频谱图
//10*127大小的频谱
//显示从y-->top 这么高的柱形
void TFT_ShowFFT(u8* curv,u8* topv,u8 *flyv,u32 *toppos1,u32 *toppos2)
{			    
	u8 t1,n,t,ts;
	u16 temp;	 

	TFT_WR_CMD(0,0x00,0x24);	//扫描方向控制 左至右,下至上  
	for(ts=0;ts<14;ts++)
	{	
		if(*curv>*topv)//需要更新 
		{
			t1=*curv-*topv;//要升高这么多 
	
			TFT_WR_CMD(0,0x2,ts*17);//开始列数
			temp=319-*topv;
			TFT_WR_CMD(1,0x3,temp-t1-100);   
			TFT_WR_CMD(0,0x04,ts*17+15);//结束列数 	
			TFT_WR_CMD(1,0x05,temp-100); //结束行数(0~319)
			//10*50大小	   	   
			TFT_WR_REG(0x0E); 	     
			//显示有效数据
			for(n=0;n<t1;n++)
			{	
				if(*topv+n<25)POINT_COLOR=BOTC;
				else if(*topv+n<50)POINT_COLOR=MIDC;
				else POINT_COLOR=TOPC;						    					    
				for(t=0;t<16;t++)TFT_WR_Data16(POINT_COLOR); 
			} 
			*topv=*curv;  
		}
		topv++;
		curv++;
	} 		  
	topv-=14; //偏移回原来的位置
	for(ts=0;ts<14;ts++)
	{
		if(*flyv<=*topv)//处理当前柱的顶点是不是超过了先前柱的顶点,超过了则重置顶点
		{
			if(*flyv<25)POINT_COLOR=BOTC;
			else if(*flyv<50)POINT_COLOR=MIDC;
			else POINT_COLOR=TOPC;	  
			Drow_Line_FFT(ts*17,*flyv,POINT_COLOR);//把顶点去掉
			*flyv=*topv+1;
			Drow_Line_FFT(ts*17,*flyv,RED);	//重新置位顶点
			if(ts<7)*toppos1|=0x0f<<ts*4; 
			else *toppos2|=0x0f<<(ts-7)*4;
		}
		flyv++;
		topv++; 
	}   
	topv-=14; //偏移回原来的位置
	for(ts=0;ts<14;ts++) //有规律的消除一格
	{		 
		Drow_Line_FFT(ts*17,*topv,BLACK);//背景黑色	
		if(*topv)(*topv)--;   
		topv++;
	}   									    
}
//收音机的进度条等。
//进度条相关参数
u8  PROBAR_X=0;
u16	PROBAR_Y=0;
u8  PROBAR_LEN=0;
//进度条初始化函数
//(x,y):设置进度条起始点坐标			 
//len  :设置进度条长度 
void Pro_Bar_Init(u8 x,u16 y,u8 len)
{				   
	TFT_Fill(x,y,x+len,y+10,WHITE);//清空进度条,填充白色
	PROBAR_LEN=len;
	PROBAR_X=x;
	PROBAR_Y=y;			 
}	
//进度条显示函数
//min:低端数值
//max:高端数值				 
//pos:当前数值   
void Pro_Bar(u16 min,u16 max,u16 pos)
{
	static u8 lastpos=0;
	float temp;	 
	u8 realpos=0;   
	if(pos>max||pos<min)return;
	temp=(float)(pos-min)/(max-min);
	temp*=(PROBAR_LEN-10);
	realpos=(u8)temp;
	if(lastpos<=(PROBAR_LEN-10))TFT_Fill(PROBAR_X+lastpos,PROBAR_Y,PROBAR_X+lastpos+10,PROBAR_Y+10,WHITE);//清空进度条,填充白色
	TFT_Fill(PROBAR_X+realpos,PROBAR_Y,PROBAR_X+realpos+10,PROBAR_Y+10,BLUE);//显示进度条位置
	lastpos=realpos;
}
//MP3的进度条
//显示进度条
void TFT_ProBar(u8 lenth)
{                    
    u32 n;
	u16 color;
	if(lenth>180)return;
	TFT_WR_CMD(0,0x0,0x84);//上至下,左至右扫描
	TFT_WR_CMD(0,0x2,30);//设置到原点
	TFT_WR_CMD(1,0x3,85);    
	 
	TFT_WR_CMD(0,0x04,30+180-1);//显示180*10大小的进度条 
	TFT_WR_CMD(1,0x05,85+10-1); //   
	TFT_WR_REG(0x0E); 
	for(n=0;n<1800;n++)
	{
		if(n<10*lenth)color=BLUE;
		else color=WHITE;
		TFT_WR_Data16(color);//显示所填充的颜色. 
	}
	TFT_WR_CMD(0,0x0,0x04);//恢复原始设置
}  
//显示一个数字
//x,y:起点坐标
//num:数值(0~9);
void TFT_ShowBigNum(u8 x,u16 y,u8 num)
{   
    TFT_ShowBigChar(x,y,(num/10)%10); 
    TFT_ShowBigChar(x+30,y,num%10);        							     
} 	   	 
//m^n函数
u32 mypow(u8 m,u8 n)
{
	u32 result=1;	 
	while(n--)result*=m;    
	return result;
}				  
//显示2个数字
//x,y:起点坐标
//size:字体大小
//mode:模式	0,填充模式;1,叠加模式
//num:数值(0~99);
void TFT_ShowNum(u8 x,u16 y,u8 num,u8 size,u8 mode)
{         							   
    TFT_ShowChar(x,y,(num/10)%10+'0',size,mode); 
    TFT_ShowChar(x+size/2,y,num%10+'0',size,mode); 
} 		   
//显示3个数字
//x,y:起点坐标
//size:字体大小
//mode:模式	0,填充模式;1,叠加模式
//num:数值(0~999);
void TFT_Show3Num(u8 x,u16 y,u16 num,u8 size,u8 mode)
{   
	TFT_ShowChar(x,y,(num/100)%10+'0',size,mode);      							   
    TFT_ShowChar(x+size/2,y,(num/10)%10+'0',size,mode); 
    TFT_ShowChar(x+size,y,num%10+'0',size,mode); 
} 
//显示字符串
//x,y:起点坐标  
//*p:字符串起始地址
//用16字体
void TFT_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;TFT_CLEAR(WHITE);}
        TFT_ShowChar(x,y,*p,16,0);
        x+=8;
        p++;
    }  
}
//画一个大点
//2*2的点
//包括清屏"按钮"RST
void drawbigpoint(u8 x,u16 y)
{
	if(x>220&&y<12)
	{
		TFT_CLEAR(WHITE);//清屏 
    	TFT_ShowString(220,0,"RST");//显示清屏区域
	}else 
	{
		TFT_DrawPoint(x,y);//中心点 
		TFT_DrawPoint(x+1,y);
		TFT_DrawPoint(x,y+1);
		TFT_DrawPoint(x+1,y+1);	
	}		  	
}
//显示一副图片
//x,y:图片起始位置
//lenth:图片的宽度(0~240)  
//wide: 图片高度(0~320)
//*p:图片首地址        
//不带范围判断
/*
void TFT_ShowBmp(u8 x,u16 y,u8 lenth,u16 wide,const u8 *p)
{      
    u32 size,temp; 
    //开辟窗口
	TFT_WR_CMD(0,0x2,x);//起始坐标
	TFT_WR_CMD(1,0x3,y); 
	TFT_WR_CMD(0,0x04,(u16)x+lenth-1);//结束列数(0~239)	
	TFT_WR_CMD(1,0x05,y+wide-1);      //结束行数(0~319)   
	TFT_WR_REG(0x0E);       
	temp=(u32)lenth*wide*2;
	for(size=0;size<temp;size++)TFT_WR_DATA(p[size]); 
} */        

//初始化函数
void TFT_Init(void)
{       
    //液晶接口初始化    
 	RCC->APB2ENR|=0X0000001C;//先使能外设IO PORTA,B,C时钟
	
	GPIOC->CRL=0X33333333; //PC0-7 推挽输出
	GPIOC->ODR|=0X00FF;    //全部输出高
											 
	GPIOB->CRL&=0XFFFFF000;//PB0~2 推挽输出
	GPIOB->CRL|=0X00000333;	   
	GPIOB->ODR|=0X0007;    //0-2 输出高

	GPIOA->CRL&=0XFFF000FF;//PA2~4 推挽输出
	GPIOA->CRL|=0X00033300;	   
	GPIOA->ODR|=0X001C;    //2~4 输出高											 
    
	TFT_RST_SET(0);//硬件复位
	delay_ms(200);
	TFT_RST_SET(1);
	delay_ms(200); 
	//initializing funciton 1 
	TFT_WR_REG(0xA1);  
	TFT_WR_DATA(0x00);
	delay_us(90); 
	TFT_WR_REG(0xA0); 
	TFT_WR_DATA(0x00); 
	delay_us(90); 
	TFT_WR_CMD(0,0x70,0xc8);//对亮度有影响 
	delay_ms(20); 
	TFT_WR_CMD(0,0x72,0xA3); 
	TFT_WR_CMD(0,0x73,0x04); 
	TFT_WR_CMD(0,0x75,0x45); 
	TFT_WR_CMD(0,0x76,0x23); 
	TFT_WR_CMD(0,0x77,0x08); 
	TFT_WR_CMD(0,0x78,0x08); 
	TFT_WR_CMD(0,0x79,0x00); 
	TFT_WR_CMD(0,0x7F,0xF0);  
	TFT_WR_CMD(0,0x71,0x81);	  
	delay_ms(2); 
	TFT_WR_CMD(0,0x0D,0x23);//GRAM接口模式设置 
	TFT_WR_CMD(0,0x11,0x00); 
	TFT_WR_CMD(0,0x12,0x00); 
	TFT_WR_CMD(0,0x21,0x37); 
	TFT_WR_CMD(0,0x22,0x02); 
	TFT_WR_CMD(0,0x23,0x24);  
	TFT_WR_CMD(0,0x24,0x13); 
	TFT_WR_CMD(0,0x25,0x0A); 
	TFT_WR_CMD(0,0x26,0x82); 
	TFT_WR_CMD(0,0x27,0x01); 
	TFT_WR_CMD(0,0x1E,0x25); 
	TFT_WR_CMD(0,0x1F,0x59);//有影响  
	//GAMMA设置
	TFT_WR_CMD(1,0x30,0x0777); 
	TFT_WR_CMD(1,0x31,0x0444); 
	TFT_WR_CMD(1,0x32,0x0555); 
	TFT_WR_CMD(1,0x33,0x0444); 
	TFT_WR_CMD(1,0x34,0x0333); 
	TFT_WR_CMD(1,0x35,0x0333); 
	TFT_WR_CMD(1,0x36,0x0333); 
	TFT_WR_CMD(1,0x37,0x0333); 
	TFT_WR_CMD(1,0x38,0x0444); 
	TFT_WR_CMD(1,0x39,0x0555); 
	TFT_WR_CMD(1,0x3A,0x0666); 
	TFT_WR_CMD(1,0x3B,0x0666); 
	TFT_WR_CMD(1,0x3C,0x0777); 
	TFT_WR_CMD(1,0x3D,0x0777); 
	TFT_WR_CMD(1,0x3E,0x0777); 
	TFT_WR_CMD(1,0x3F,0x0777); 
	TFT_WR_CMD(1,0x40,0x0777); 
	TFT_WR_CMD(1,0x41,0x0777); 
	TFT_WR_CMD(1,0x42,0x0777); 
	TFT_WR_CMD(1,0x43,0x0777); 
	TFT_WR_CMD(1,0x44,0x0777); 
	TFT_WR_CMD(1,0x45,0x0777); 
	TFT_WR_CMD(1,0x46,0x0777); 
	TFT_WR_CMD(1,0x47,0x0777); 
	TFT_WR_CMD(1,0x48,0x0777); 
	TFT_WR_CMD(1,0x49,0x0777); 
	TFT_WR_CMD(1,0x4A,0x0777); 
	TFT_WR_CMD(1,0x4B,0x0777); 
	TFT_WR_CMD(1,0x4C,0x0777); 
	TFT_WR_CMD(1,0x4D,0x0666); 
	TFT_WR_CMD(1,0x4E,0x0666); 
	TFT_WR_CMD(1,0x4F,0x0666);  
	//地址00H:方向控制	 
	//bit2控制X的方向 0:0-->239;1:239-->0;
	//bit5控制Y的方向 0:0-->319;1:319-->0;  
	//bit7控制X的方向 0:左至右; 1:右至左
	//MAYBE NOT ????? 
	//0x84:上至下,左至右 型扫描	+
	//0x04:左至右,上至下 型扫描	+  
	//0x24:左至右,下至上 型扫描	+
	TFT_WR_CMD(0,0x00,0x04);	//扫描方向控制 0x00,0x80,0x84,0x04
	TFT_WR_CMD(0,0x01,0x07);	//扫描方向控制  
	
	//面板大小设置
	TFT_WR_CMD(0,0x02,0x00);	//设置X坐标点
	TFT_WR_CMD(1,0x03,0x0000);	//设置Y坐标点   
	TFT_WR_CMD(0,0x04,0xEF);	//结束列数(0~239)	
	TFT_WR_CMD(1,0x05,0x013F);	//结束行数(0~319) 
	//窗口设置
	TFT_WR_CMD(0,0x06,0x00);	//水平起始位置
	TFT_WR_CMD(1,0x07,0x0000);	//垂直起始位置
	TFT_WR_CMD(0,0x08,0xEF);	//水平结束位置
	TFT_WR_CMD(1,0x09,0x013F);	//垂直结束位置   
	
	TFT_WR_CMD(0,0x0A,0x00); 
	TFT_WR_CMD(0,0x0B,0x00); 
	TFT_WR_CMD(0,0x0C,0x00); 
	TFT_WR_CMD(0,0x14,0x00); 
	TFT_WR_CMD(0,0x15,0x00); 
	TFT_WR_CMD(0,0x16,0x00); 
	TFT_WR_CMD(1,0x17,0x01FF); 
	TFT_WR_CMD(1,0x18,0x01FF); 
	TFT_WR_CMD(0,0x13,0x00); 
	TFT_WR_CMD(1,0x19,0x01FF); 
	TFT_WR_CMD(1,0x1B,0x01FF); 
	TFT_WR_CMD(1,0x1C,0x01FF); 
	TFT_WR_CMD(1,0x1A,0x01FF);	 
	TFT_WR_CMD(0,0x1D,0x0E);//无影响 
	TFT_WR_CMD(0,0x10,0x06);//显示模式控制,开显示
	TFT_WR_REG(0x0E);//开始写数据到GRAM 
	TFT_CLEAR(WHITE);//清屏
	TFT_LED_SET(1);        //开启LED背光 
} 		 

⌨️ 快捷键说明

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