📄 tftlcd.c
字号:
{
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 + -