📄 gui.c
字号:
{
key=AI_Read_TP(30);
if(key)Pen_Point.Key_Reg|=0X80;//标记按键已经按下了
if(key==0&&(Pen_Point.Key_Reg&0X80))//按键松开了
{
Pen_Point.Key_Reg=0;
key=Touch_To_Num(2);
if(key)//有按键按下
{
switch(key)
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9://确认键按下
key-=1;
if(sel!=key&&key<len)//选中一个
{
POINT_COLOR=DARKBLUE;//画笔颜色选择
LCD_Fill(0,45+sel*32,239,37+(sel+1)*32,WHITE);//清空上次选择的
Show_Str(0,50+sel*32,(u8*)list[sel],16,0x01);//重新显示上次的名字
sel=key;//选择这次选择的
LCD_Fill(0,45+sel*32,239,37+(sel+1)*32,LBBLUE);//填充底色
POINT_COLOR=WHITE;//画笔颜色选择
Show_Str(0,50+sel*32,(u8*)list[sel],16,0x01);//显示名字
}else if(sel==key||key==8)//选择按钮,或者双击
{
return sel;//返回选择的条目号
}
break;
case 10:return 8;//选择了"返回"按钮,返回一个不可能值
}
key=0;//取消按键值
}
}
delay_ms(1);
}
}
//显示文件
//fcnt:要显示文件的多少
//sel :选中第几个1~8
//返回值:要打开的文件编号1~8(包括文件夹,在FileInfo里面的)
//返回9,代表直接退回上一层目录
//显示文件
//check ok 09/04/19
u8 Show_File(u8 fcnt,u8 sel)
{
u16 t;
u8 key;
FileInfoStruct temp;
temp.F_Type=T_BMP;//文件属性设置
sel-=1;
LCD_Fill(0,42,239,297,WHITE);//填充白色,清空上次的显示
for(t=0;t<fcnt;t++)
{
if(F_Info[t].F_Type==T_FILE)temp.F_StartCluster=file_ico[0];//文件夹图标
else
{
if(F_Info[t].F_Type&(T_JPG|T_JPEG|T_BMP))temp.F_StartCluster=file_ico[2];//图片类图标
else if(F_Info[t].F_Type&(T_MP3|T_OGG|T_WMA|T_WAV|T_FLAC|T_MID))temp.F_StartCluster=file_ico[1];//音乐类图标
else if(F_Info[t].F_Type&(T_LRC|T_TXT|T_C|T_H))temp.F_StartCluster=file_ico[3];//文字类图标
}
AI_LoadPicFile(&temp,0,42+t*32,32,42+t*32+32);//加载图标
if(t==sel)
{
LCD_Fill(32,45,239,69,LBBLUE);//填充棕色 BROWN
POINT_COLOR=WHITE;
}else POINT_COLOR=DARKBLUE;
Show_Str(32,50+t*32,F_Info[t].F_Name,16,0x03); //叠加模式,非自动换行
//printf("N[%d]%s\n",t,F_Info[t].F_Name);
}
key=0;
Pen_Point.Key_Sta=Key_Up;//释放显示期间的触发
while(1)//等待按键操作
{
key=AI_Read_TP(50);//适合滑动检测
if(key)
{
if((Pen_Point.Key_Reg&0x03)==1)//第一次是滑动按下
{
t=KEY_Move_Check();//检查滑动按下
if(t)
{
key=t;
goto KEY_D;
}
}
Pen_Point.Key_Reg|=0X80; //标记按键已经按下
}
if(key==0&&(Pen_Point.Key_Reg&0X80))//按键松开了
{
key=Touch_To_Num(1);
KEY_D:
Pen_Point.Key_Reg=0;
if(key)//有按键按下
{
switch(key)
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
key-=1;
if(sel!=key&&key<fcnt)//选中一个
{
POINT_COLOR=DARKBLUE;//画笔颜色选择
LCD_Fill(32,45+sel*32,239,37+(sel+1)*32,WHITE);//清空上次选择的
Show_Str(32,50+sel*32,F_Info[sel].F_Name,16,0x03);//重新显示上次的名字
sel=key;//选择这次选择的
LCD_Fill(32,45+sel*32,239,37+(sel+1)*32,LBBLUE);//清空上次选择的
POINT_COLOR=WHITE;//画笔颜色选择
Show_Str(32,50+sel*32,F_Info[sel].F_Name,16,0x03);//显示名字
}else if(sel==key)return sel+1;//再次选择,双击打开.
break;
case 9: //选择了"选择"按钮
return sel+1;
case 10://选择了"返回"按钮
return 9;
case MOVE_UP: //翻页操作
case MOVE_LEFT:
case MOVE_DOWN:
case MOVE_RIGHT:
return key;
}
key=0;//把按键值取消掉
Pen_Point.Key_Sta=Key_Up;//释放显示期间的触发
}
}
delay_ms(1);
t++;
if(t%500==0)LED0=!LED0;
}
}
//浏览文件夹下面的文件
//file_type:要浏览的文件类型
//返回要打开的目标文件编号 1~n(在总目标文件里面的)
//不包括文件夹!!!
//如果返回0则代表退出浏览
u16 File_Browse(u32 file_type)
{
FileInfoStruct *FileInfo;
u16 folder_cnt;//文件夹的个数
u16 des_cnt; //目标文件的个数
u8 fcnt; //显示的文件数目
u16 temp;
u16 total_file;//总文件数目
u16 pos_cnt;//当前文件号 1~folder_cnt+des_cnt
u8 key;
Reset:
POINT_COLOR=BLUE; //蓝色笔头使用
folder_cnt=0;des_cnt=0;fcnt=0;key=0;pos_cnt=0;
Get_File_Info(Cur_Dir_Cluster,FileInfo,T_FILE,&folder_cnt);//得到当前目录下文件夹的个数
Get_File_Info(Cur_Dir_Cluster,FileInfo,file_type,&des_cnt);//得到当前目录下目标文件的个数
total_file=des_cnt+folder_cnt;//总的文件数目=文件夹数目+目标文件数目
while(1)
{
if(pos_cnt<total_file)//文件标尺,未到达文件末尾
{
FileInfo=&F_Info[fcnt];
if(pos_cnt<folder_cnt)//找文件夹
{
temp=pos_cnt+1;
Get_File_Info(Cur_Dir_Cluster,FileInfo,T_FILE,&temp);
}else //找目标文件
{
temp=pos_cnt-folder_cnt+1;
Get_File_Info(Cur_Dir_Cluster,FileInfo,file_type,&temp);
}
fcnt++; //已存的文件数目增加
pos_cnt++;//文件位置标志增加
}
if(fcnt==8||pos_cnt==total_file)//找满八个了,或者文件夹已经找完了
{
key=Show_File(fcnt,1);//显示此次得到的文件
switch(key)
{
case 1://要打开目标文件
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
key-=1;
if(key<fcnt)//按键在有效范围内
{
if(F_Info[key].F_Type==T_FILE)//要打开的是个文件夹
{
Cur_Dir_Cluster=F_Info[key].F_StartCluster;//打开这个文件夹
goto Reset;
}else //要打开的是目标文件
{
//LCD_Clear(WHITE);//清屏
return pos_cnt+key-folder_cnt-fcnt+1;//返回目标文件编号
}
}
break;
case 9: //选择了返回按钮.退出到上一层目录
//在主目录浏览里面,按下返回按钮,则退出浏览模式
if((FAT32_Enable&&Cur_Dir_Cluster==FirstDirClust)||Cur_Dir_Cluster==0)return 0;//退出浏览模式
Cur_Dir_Cluster=Fat_Dir_Cluster;//退到父目录
goto Reset;
case MOVE_UP: //向上翻页
case MOVE_LEFT:
if(pos_cnt>8)pos_cnt-=(8+fcnt);//回到上一页
else pos_cnt=0;//从头开始了
break;
case MOVE_DOWN://向下翻页
case MOVE_RIGHT:
if(pos_cnt==total_file)pos_cnt-=fcnt;//重新找
break;
}
fcnt=0;//清除显示文件计数器
}
}
}
//////////////////////////与LCD显示相关的函数//////////////////////////////////
//画粗线
//x1,y1:起点坐标
//x2,y2:终点坐标
void LCD_DrawDLine(u16 x1, u16 y1, u16 x2, u16 y2)
{
u16 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++ )//画线输出
{
Draw_Big_Point(uRow,uCol);//画点
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
u16 *Temp_Color_Buf=(u16*)iclip;//把数据存放在iclip区域,与JPEG解码共享
//读取显存到Temp_Color_Buf
//(x,y):起始坐标
//xsize:x方向上的长度
//ysize:y方向上的长度
//总共读出的数据大小为:xsize*ysize
void Read_Temp_Color(u16 x,u16 y,u16 xsize,u16 ysize)
{
u16 i,t;
u16 tcnt=0;
for(i=0;i<xsize;i++)
{
for(t=0;t<ysize;t++)
{
Temp_Color_Buf[tcnt]=LCD_ReadPoint(x+i,y+t);//读取当前点的颜色值
tcnt++;
}
}
}
//将读取的显存Temp_Color_Buf重新显示出来
//(x,y):起始坐标
//xsize:x方向上的长度
//ysize:y方向上的长度
//总写入的数据大小为:xsize*ysize
void Reshow_Temp_Color(u16 x,u16 y,u16 xsize,u16 ysize)
{
u16 i,t;
u16 tcnt=0;
for(i=0;i<xsize;i++)
{
for(t=0;t<ysize;t++)
{
POINT_COLOR=Temp_Color_Buf[tcnt];//读取当前点的颜色值
LCD_DrawPoint(x+i,y+t);
tcnt++;
}
}
}
//画颜色列表
//该颜色表外框大小为51*37
//分成5*7个颜色块,总共35种颜色
const u16 Color_Tab[3][7]=
{
{0XF800,0X7E00,0X001F,0X0000,0XFFFF,0X8000,0X0400},
{0XFFE0,0X07FF,0XF81F,0X2B12,0X8400,0XFFF0,0XFC10},
{0X0010,0X841F,0X041F,0XFC10,0X87F0,0XF810,0XFC00},
};
//画颜色列表
//该颜色表外框大小为65*29
//分成3*7个颜色块,总共21种颜色
//#define FRAME1 0XEF5B //窗体色
//#define FRAME2 0XDED7 //窗体色
void Draw_Color_Table(u16 x,u16 y)
{
u8 t,i;
POINT_COLOR=FRAME2;
for(i=0;i<4;i++)
{
LCD_DrawLine(x,y+i*9,x+63,y+i*9);
}
for(i=0;i<4;i++)
{
LCD_DrawLine(x,y+i*9+1,x+63,y+i*9+1);
}
for(i=0;i<8;i++)
{
LCD_DrawLine(x+9*i,y,x+9*i,y+28);
}
for(i=0;i<8;i++)//画小边框
{
LCD_DrawLine(x+9*i+1,y,x+9*i+1,y+28);
}
for(t=0;t<3;t++)
{
for(i=0;i<7;i++)
{
LCD_Fill(x+2+i*9,y+2+t*9,x+2+i*9+6,y+2+t*9+6,Color_Tab[t][i]);//把多余的去掉
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -