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

📄 gui.c

📁 STM32不完全手册 例程源码 29个
💻 C
📖 第 1 页 / 共 2 页
字号:
	{	 
		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 + -