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

📄 gui.c

📁 STM32不完全手册 例程源码 29个
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "gui.h"			   
#include "lcd.h"			 
#include "delay.h"
#include "text.h"
#include "touch.h"
#include "fat.h"
#include "sysfile.h"
#include "jpegbmp.h"
#include "usart.h"
#include "led.h"
//////////////////////////////////////////////////////////////////////////////////	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//综合实验 驱动代码		 					    
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/6/6
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////	 


//系统主菜单
const u8 *Menu[9]=
{
"电子图书",
"数码相框",
"拼图游戏",
"触摸画板",
"系统时间",
"鼠标画板",
"USB连接 ",
"红外遥控",
"无线传书",	 
};
//////////////////////////GUI 按钮///////////////////////////////
void GUI_DrawLine(u16 x,u16 y,u16 xlen,u16 ylen,u16 color)
{
	u16 tempcolor=POINT_COLOR;
	POINT_COLOR=color;
	LCD_DrawLine(x,y,x+xlen,y+ylen);
	POINT_COLOR=tempcolor;	
}
//在指定位置显示指定颜色的按钮
//(x,y):按钮起始坐标
//xlen,ylen:x,y方向的长度
//str:按钮上要显示的字符
//color:字符颜色
void GUI_Draw_Button(u16 x,u16 y,u16 xlen,u16 ylen,u8 *str,u16 color)
{	
	u16 tback_color,tpoint_color;
	//////////////////画按钮部分//////////////////////   
	LCD_Fill(x,y,x+xlen,y+ylen,LGRAY);//画实体
	GUI_DrawLine(x,y,xlen,0,WHITE);   //上外边框
	GUI_DrawLine(x,y,0,ylen,WHITE);   //左外边框   	   
	GUI_DrawLine(x+1,y+1,xlen-1,0,0XB5B6);//上内边框
	GUI_DrawLine(x+1,y+1,0,ylen-1,0XB5B6);//左内边框
	GUI_DrawLine(x,y+ylen,xlen,0,0X8431); //下外边框
	GUI_DrawLine(x+xlen,y,0,ylen,0X8431); //右外边框   	   
	GUI_DrawLine(x+1,y+ylen-1,xlen-2,0,0XA535);//下内边框
	GUI_DrawLine(x+xlen-1,y,0,ylen-1,0XA535);  //右内边框
	//////////////////显示按钮上面的信息///////////////  
	if(ylen<16)return;//不够画	 
	tback_color=BACK_COLOR;
	tpoint_color=POINT_COLOR;
	BACK_COLOR=LGRAY;
	POINT_COLOR=color; 
	Show_Str_Mid(x,y+(ylen-16)/2,str,16,xlen);//只对16字体
	BACK_COLOR=tback_color;	 //恢复之前的颜色
	POINT_COLOR=tpoint_color; 
}
/////////////////////////界面图形加载/////////////////////////////

//选择菜单
void Select_Menu(u8 M_Type,u8 Cnt,u8 En)
{
	u8 tx;
	u16 ty;
	u8 t;	
	ty=10; 
	if(M_Type==0)//主菜单
	{	  
		tx=80*(Cnt%3)+10;//10,90,170			
		
		if(Cnt>5)ty=216;
		else if(Cnt>2)ty=113;	
		//显示外框部分 
		if(En)POINT_COLOR=BLUE;
		else POINT_COLOR=WHITE;
		for(t=0;t<4;t++)
		{
			LCD_DrawRectangle(tx-7+t,ty-7+t,tx+66-t,ty+67-t); 
		} 
		//显示字体,反白
		if(En)//选中当前的菜单
		{	  
			POINT_COLOR=WHITE;//白色字体
			BACK_COLOR=LBBLUE;  //蓝色背景      
		}else
		{
			POINT_COLOR=DARKBLUE;//深蓝色字体
			BACK_COLOR=WHITE; //白色背景   
		}	 												  
		Show_Str(tx-3,ty+74,(u8*)Menu[Cnt],16,0);	
	}
}
//加载主界面
void Load_Sys_ICO(void)
{		  
	u8 t,tx;
	u16 ty;	   
	FileInfoStruct temp; 
	POINT_COLOR=RED;//黑色字体				   
    LCD_Clear(WHITE);//清屏 
	temp.F_Type=T_BMP;//文件属性设置 
	tx=10;ty=10;
	for(t=0;t<9;t++)
	{	   
		temp.F_StartCluster=sys_ico[t];								    
		tx=80*(t%3)+10;//10,90,170	    
		AI_LoadPicFile(&temp,tx,ty,tx+59,ty+60);
		Select_Menu(0,t,0);//加载字体    		  
		if(t>=5)ty=216;
		else if(t>=2)ty=113;  
	}
}
//加载游戏界面
//size:3,3*3图片
//     4,4*4图片
//     5,5*5图片
//#define FRAME1 0XBC40 //棕色
void Load_Game_ICO(u8 size)
{
	u8 i;
	LCD_Clear(LGRAY);//清屏
	for(i=0;i<4;i++)//画大边框
	{		
		POINT_COLOR=FRAME1;
		LCD_DrawRectangle(i,i,239-i,239-i);
	}
	if(size==3)
	{
		for(i=0;i<4;i++)//画小边框
		{		
			POINT_COLOR=FRAME1;
			LCD_DrawRectangle(154+i,235+i,239-i,316-i);
		}									 
	    LCD_Fill(158,235,235,239,WHITE);//把多余的去掉	
		POINT_COLOR=RED;
		LCD_DrawRectangle(158,235,235,312);//画空的方框,事先不放图片
		LCD_DrawRectangle(4,4,235,235); //画最大的红框

		LCD_DrawLine(81,4,81,235);  //画内部红框
		LCD_DrawLine(158,4,158,235);//画内部红框
		LCD_DrawLine(4,81,235,81);  //画内部红框
		LCD_DrawLine(4,158,235,158);//画内部红框
	}else if(size==4)
	{
		for(i=0;i<4;i++)//画小边框
		{		
			POINT_COLOR=FRAME1;
			LCD_DrawRectangle(174+i,236+i,239-i,298-i);
		}									 
	    LCD_Fill(178,236,236,240,WHITE);//把多余的去掉	
		POINT_COLOR=RED;
		LCD_DrawRectangle(178,236,236,294);//画空的方框,第十六格
		LCD_DrawRectangle(4,4,236,236);    //画最大的红框

		for(i=0;i<size;i++)LCD_DrawLine(4,4+58*i,236,4+58*i);  //画内部横网格线
		for(i=0;i<size;i++)LCD_DrawLine(4+58*i,4,4+58*i,236);  //画内部竖网格线	   										  
	}else if(size==5)
	{
		for(i=0;i<4;i++)//画小边框
		{		
			POINT_COLOR=FRAME1;
			LCD_DrawRectangle(184+i,234+i,239-i,284-i);
		}	
		LCD_DrawLine(4,235,236,235);  //误差横线填充线
		LCD_DrawLine(235,4,235,281);  //误差竖线填充线
										 
	    LCD_Fill(188,234,234,239,WHITE);//把多余的去掉	
		POINT_COLOR=RED;
		LCD_DrawRectangle(188,234,234,280);//画空的方框,第十六格
		LCD_DrawRectangle(4,4,234,234);    //画最大的红框

		for(i=0;i<size;i++)LCD_DrawLine(4,4+46*i,234,4+46*i);  //画内部横网格线
		for(i=0;i<size;i++)LCD_DrawLine(4+46*i,4,4+46*i,234);  //画内部竖网格线
	}	  		  								    	  		  
	LCD_DrawRectangle(2,241,79,318);//包括预览图片
	
	BACK_COLOR=WHITE;
	POINT_COLOR=BLUE;//画笔颜色
	Show_Str(81,242,"等级:",16,0x01);
	POINT_COLOR=RED;//画笔颜色
	if(size==3)Show_Str(121,242,"简单",16,0x01);
	else if(size==4)Show_Str(121,242,"一般",16,0x01);
	else Show_Str(121,242,"困难",16,0x01);
	POINT_COLOR=BLUE;//画笔颜色
	Show_Str(81,258,"步数:",16,0x01);
	Show_Str(81,274,"用时:",16,0x01);   
	GUI_Draw_Button(98,298,37,20,"退出",BLACK);		  					     
} 		 	 
//加载浏览界面
//设置界面 
//str:"选择/确定"
void Load_Gui_Bro(u8 * str)
{			 	   					  			   
    LCD_Clear(WHITE);//清屏
	//顶部 						   
 	LCD_Fill(0,0,239,9,LIGHTBLUE);  //填充底部颜色(浅蓝色)	
 	LCD_Fill(0,10,239,20,GRAYBLUE); //填充底部颜色(灰蓝色)
	//中部
	POINT_COLOR=DARKBLUE;//深蓝色  
	LCD_DrawLine(0,21,239,21);
	LCD_Fill(0,22,239,41,LIGHTBLUE);//填充中部部颜色(浅灰蓝色)
	LCD_DrawLine(0,41,239,41);	    
	//底部
	LCD_DrawLine(0,298,239,298);
 	LCD_Fill(0,299,239,308,LIGHTBLUE);//填充底部颜色(浅蓝色)	
 	LCD_Fill(0,308,239,319,GRAYBLUE);//填充底部颜色(灰蓝色)

	POINT_COLOR=DARKBLUE;
	Show_Str(0,23,"请选择:",16,0x01); //叠加模式,非自动换行
	POINT_COLOR=WHITE;
	Show_Str(5,300,str,16,0x01);   //叠加模式,非自动换行
	Show_Str(203,300,"返回",16,0x01); //叠加模式,非自动换行  
}
//加载显示界面
//在PS2/触控画图时用到
//设置界面 
//str:"选择/确定"
void Load_Gui_Show(u8 *lbtstr,u8 *mbtstr,u8 *rbtstr)
{			 	   					  			   
    LCD_Clear(WHITE);  //清屏  
 	POINT_COLOR=DARKBLUE;//深蓝色	 
	LCD_DrawLine(0,297,239,297);
 	LCD_Fill(0,298,239,308,LIGHTBLUE);//填充底部颜色(浅蓝色)	
 	LCD_Fill(0,308,239,319,GRAYBLUE); //填充底部颜色(灰蓝色)	  	   
	POINT_COLOR=WHITE;//白色字体
	Show_Str(5,300,lbtstr,16,0x01);    //叠加模式,非自动换行
	Show_Str(104,300,mbtstr,16,0x01);  //叠加模式,非自动换行		  
	Show_Str(203,300,rbtstr,16,0x01);  //叠加模式,非自动换行  
}

////////////////////////////////与触摸屏控制相关的函数////////////////////////////
//把触摸屏得到的数据转换为数字(按钮值)
//M_Type:按钮模式;
//0,系统菜单	
//1,文件浏览模式 	
//2,时间模式下,按键的获取,连按支持! 
//3,音乐播放模式下
//4,功能选择模式下
//5,收音机模式下
//6,闹钟中断程序按键

//7,TXT浏览/JPEG浏览 时按键处理			  
//返回值:对应的按键值(1~n)
//返回0,则表示此次按键无效  
u8 Touch_To_Num(u8 M_Type)
{
	u8 xtemp;
	u16 t,ytemp;
	switch(M_Type)
	{
		case 0://系统菜单下										  
			ytemp=10;
			for(t=0;t<9;t++)
			{
				xtemp=80*(t%3)+10;
				if(t>5)ytemp=216;
				else if(t>2)ytemp=113;
				if(Is_In_Area(xtemp,ytemp,59,90))return t+1;//返回按键值 
			}			  
		case 1://1,文件浏览模式	   	  
			for(t=0;t<8;t++)
			{	  
				if(Is_In_Area(0,42+t*32,240,32))return t+1;
			}
			if(Is_In_Area(0,300,40,20))return 9;//选择按钮被按下
			if(Is_In_Area(200,300,40,20))return 10;//返回按钮被按下
			return 0;//按键无效	    
//			if(xtemp)return xtemp&0xf0;//滑动触摸了!! 
			//break; 
		case 2://4,功能选择模式下 
			for(t=0;t<8;t++)
			{	  
				if(Is_In_Area(0,42+t*32,240,32))return t+1;
			}
			if(Is_In_Area(0,300,40,20))return 9;//选择按钮被按下
			if(Is_In_Area(200,300,40,20))return 10;//返回按钮被按下
			return 0;//按键无效	 
			//break;
		case 3:
			break;
		case 4:						    
			break;
		case 5://5,收音机模式下 
			break; 
		case 6://6,闹钟中断程序按键	  
			break;
		case 7://JPEG/BMP/TXT浏览按键模式  
			if(Is_In_Area(0,0,239,60))return KEY_PREV;        //向上
			else if(Is_In_Area(0,60,239,200))return KEY_FUNC; //不定		    
			else if(Is_In_Area(0,260,239,60))return KEY_NEXT; //向下翻 	   
			return 0;//按键无效	    			
			//break; 	  	    		 
	}
	return 0;
}
//按键滑动检测
u8 KEY_Move_Check(void)
{
#define MOVE_PIXES 30 //滑动距离						    
	if(Pen_Point.X>Pen_Point.X0)//右移
	{
		if(T_abs(Pen_Point.X0,Pen_Point.X)>MOVE_PIXES&&T_abs(Pen_Point.Y0,Pen_Point.Y)<MOVE_PIXES)return MOVE_RIGHT;
	}else  //左移
	{
		if(T_abs(Pen_Point.X0,Pen_Point.X)>MOVE_PIXES&&T_abs(Pen_Point.Y0,Pen_Point.Y)<MOVE_PIXES)return MOVE_LEFT;
	}
	if(Pen_Point.Y>Pen_Point.Y0)//下移
	{
		if(T_abs(Pen_Point.Y0,Pen_Point.Y)>MOVE_PIXES&&T_abs(Pen_Point.X0,Pen_Point.X)<MOVE_PIXES)return MOVE_DOWN;
	}else			   //上移
	{
		if(T_abs(Pen_Point.Y0,Pen_Point.Y)>MOVE_PIXES&&T_abs(Pen_Point.X0,Pen_Point.X)<MOVE_PIXES)return MOVE_UP;
	}	 
	return 0;							 
}
//////////////////////////////与文件浏览相关的函数//////////////////////////////
//功能选择调度函数	    
//list  :功能条目指针
//title :标题
//func  :选择/确定/。。。
//len   :功能条目的个数(1~8)
//sel   :开始选中的条目(0~7)
//返回值:0~7,选中的条目;8,没有选择任何条目。
u8 Load_Fun_Sel(const u8 * *list,const u8 *title,u8 *func,u8 len,u8 sel)
{	
	u8 t,key;
	Load_Gui_Bro(func);	   
	//显示标题
	POINT_COLOR=WHITE;
	Show_Str_Mid(0,2,(u8*)title,16,240); //叠加模式,非自动换行  
	POINT_COLOR=DARKBLUE;
	Show_Str(0,23,"请选择:",16,0x01);    //叠加模式,非自动换行	 
	//加载条目信息
	for(t=0;t<len;t++)
	{	 											    
		if(t==sel)
		{
			LCD_Fill(0,45+sel*32,239,37+(sel+1)*32,LBBLUE );//对选中的条目,填充棕色 
			POINT_COLOR=WHITE;
		}else POINT_COLOR=DARKBLUE;	  
		Show_Str(0,50+t*32,(u8*)list[t],16,0x01); //叠加模式,非自动换行       
	} 
 	key=0;
	Pen_Point.Key_Sta=Key_Up;//释放显示期间的触发	    
	while(1)//等待按键

⌨️ 快捷键说明

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