基于stm32f103rct6标准库的菜单系统

学习目标:利用菜单查看更多参数


本次的菜单主要是一,循环语句嵌套。相比网上那些用定时器、结构体指针、数组调用来说,更适合新手。新手朋友可以一点点的把代码复制,从显示一级开始,一级一级的来实现,这样就非常快的把代码完全明白。

其他子文件就不上传了,感兴趣的可以看链接里面的工程,里面包括了dac读取,正弦波,三角波,方波的生成写法。

下面是menu.c

这里只实现了二级菜单,三级菜单只有界面,道理都一样的。文章下面会附上三级菜单工程链接

#include "menu.h"
#include "delay.h"
#include "oled.h"
#include "key.h"
#include "dac.h"
#include "math.h"
#include "usart.h"
#include "led.h"   

#define PI 3.14
extern float time;

extern int number;

/*****************************************/
/**************以下为一级菜单**************/
/*****************************************/
int menu1()           
{
	int flag1=1;         //记录你的选择
//	OLED_ShowStr(10,0,(unsigned char*)"1.GesLed",2);
//	OLED_ShowStr(10,2,(unsigned char*)"2.Key-Wave",2);
//	OLED_ShowStr(10,6,(unsigned char*)"3.Gesture-Wave",2);
	OLED_ShowCN(10,0,0);OLED_ShowCN(26,0,1);OLED_ShowCN(42,0,2);OLED_ShowCN(58,0,3);//灯亮次数
	OLED_ShowCN(10,3,4);OLED_ShowCN(26,3,5);OLED_ShowCN(42,3,6);OLED_ShowCN(58,3,7);//按键波型	
	OLED_ShowCN(10,6,8);OLED_ShowCN(26,6,9);OLED_ShowCN(42,6,10);OLED_ShowCN(58,6,11);//其他参数	
/**************************************以上为一级菜单显示界面**********************************************/
	while(1)
	{
		if(key1==0)       //***下一项***
		{		
			delay_ms(10);	  //防抖
			while(key1==0); //按下后不松手,则停在这
			delay_ms(10);	  //防抖
			
			flag1++;
			if(flag1==4) flag1=1;			
		}
		
		if(key2==0)       //***确认***
		{
			delay_ms(10);	  //防抖
			while(key2==0); //按下后不松手,则停在这
			delay_ms(10);	  //防抖			
			OLED_Clear();   //清屏
			return(flag1);   //返回你的选择
		}		
/*********************************************************/	
		switch(flag1)      //光标移动
		{
			case 1:
			{
				OLED_ShowStr(0,3,(unsigned char*)" ",2);
				OLED_ShowStr(0,6,(unsigned char*)" ",2);
				OLED_ShowStr(0,0,(unsigned char*)"*",2);
			}break;
			case 2:
			{
				OLED_ShowStr(0,0,(unsigned char*)" ",2);
				OLED_ShowStr(0,6,(unsigned char*)" ",2);
				OLED_ShowStr(0,3,(unsigned char*)"*",2);
			}break;
			case 3:
			{
				OLED_ShowStr(0,0,(unsigned char*)" ",2);
				OLED_ShowStr(0,3,(unsigned char*)" ",2);
				OLED_ShowStr(0,6,(unsigned char*)"*",2);				
			}break;
		}				
	}
}

/*****************************************/
/**************以下为二级菜单**************/
/*****************************************/
int menu2_gesled()
{
	int GesLed;
	OLED_ShowStr(0,0,(unsigned char*)"Your GesLed:",2);
	while(1)
	{
		GesLed = (LEDnumber()+1)/2;//获取LED翻转次数
		
		delay_ms(10);
		OLED_ShowStr(0,3,(unsigned char*)"number:",2);
    OLED_ShowNum(56,3,GesLed, 2);    //显示累计次数  		
		printf("number=%d\r\n",number/2);//串口打印累积次数
		
		if(key3_up==0)//***chang返回***
		{
			delay_ms(10);	     //防抖
			while(key3_up==0); //长按1-2秒返回
			delay_ms(10);	     //防抖
			number=0;//返回一级菜单时清空计数
			GPIO_SetBits(GPIOA,GPIO_Pin_8);	//熄灭LED		
			OLED_Clear();
			return 0;
		}		
	}
}
/**************************************以上为二级菜单LED亮的次数显示界面**********************************************/

int menu2_key_wave(void)
{
	int flag2=1;
	OLED_ShowStr(10,0,(unsigned char*)"1.Sine wave",2);//正选波选项
	OLED_ShowStr(10,2,(unsigned char*)"2.Square wave",2);//方波选项
	OLED_ShowStr(10,4,(unsigned char*)"3.Angle wave",2);//三角波选项
	OLED_ShowStr(0, 0,(unsigned char*)"*",2);
/**************************************以上为按键波形二级菜单显示界面**********************************************/	
	while(1)
	{
		if(key1==0)       //***下一项***
		{		
			delay_ms(10);	  //防抖
			while(key1==0); //按下后不松手,则停在这
			delay_ms(10);	  //防抖
			flag2++;
			if(flag2==4) flag2=1;	

			switch(flag2)   //光标移动
			{
				case 1:
				{
					OLED_ShowStr(0,2,(unsigned char*)" ",2);
					OLED_ShowStr(0,4,(unsigned char*)" ",2);
					OLED_ShowStr(0,0,(unsigned char*)"*",2);
				}break;
				case 2:
				{
					OLED_ShowStr(0,0,(unsigned char*)" ",2);
					OLED_ShowStr(0,4,(unsigned char*)" ",2);
					OLED_ShowStr(0,2,(unsigned char*)"*",2);
				}break;
				case 3:
				{
					OLED_ShowStr(0,0,(unsigned char*)" ",2);
					OLED_ShowStr(0,2,(unsigned char*)" ",2);
					OLED_ShowStr(0,4,(unsigned char*)"*",2);				
				}break;
			}
		}		
		if(key2==0)       //***确认***
		{
			delay_ms(10);	  //防抖
			while(key2==0); //按下后不松手,则停在这
			delay_ms(10);	  //防抖			
			OLED_Clear();   //清屏
/***************************************************************调用三级菜单******************************************/			
			if(flag2==1) Sine_wave();   //三级菜单 - 产生正弦波
//			if(flag2==2) Square_wave(); //三级菜单 - 产生方波
//			if(flag2==3) Angle_wave();  //三级菜单 - 产生三角波
			
			time=0;                     //时间清0
			OLED_ShowStr(10,0,(unsigned char*)"1.Sine wave",2);
			OLED_ShowStr(10,2,(unsigned char*)"2.Square wave",2);
			OLED_ShowStr(10,4,(unsigned char*)"3.Angle wave",2);
			OLED_ShowStr(0, 0,(unsigned char*)"*",2);
			flag2=1;
		}
		
		if(key3_up==0)       //***返回***
		{
			delay_ms(10);	     //防抖
			while(key3_up==0); //按下后不松手,则停在这
			delay_ms(10);	     //防抖
			DAC_set(0);        //电压清0
			OLED_Clear();
			return 0;
		}
	}
}
/***********************************************
*******************三级菜单*********************
***********************************************/
/****************************************************产生正弦波的界面***********************/
int Sine_wave(void)
{
	int flag3=1;
	float frequency = 0.5; //设定初始频率
	float amplitude=1200;   //设定初始幅值
	float phase=0;          //设定初始相位
	OLED_ShowStr(10,0,(unsigned char*)"1.Frequency",2);//调频率
	OLED_ShowStr(10,2,(unsigned char*)"2.Amplitude",2);//调幅值
	OLED_ShowStr(10,4,(unsigned char*)"3.Phase",2);    //调相位
	OLED_ShowStr(0,0, (unsigned char*)"*",2);
	
	while(1)
	{
		wave_sin(frequency,amplitude,phase); //产生波形
		
		if(key1==0)       //***下一项***
		{		
			delay_ms(10);	  //防抖
			while(key1==0); //按下后不松手,则停在这
			delay_ms(10);	  //防抖
			flag3++;
			if(flag3==4) flag3=1;	

			switch(flag3)    //光标移动
			{
				case 1:
				{
					OLED_ShowStr(0,2,(unsigned char*)" ",2);
					OLED_ShowStr(0,4,(unsigned char*)" ",2);
					OLED_ShowStr(0,0,(unsigned char*)"*",2);
				}break;
				case 2:
				{
					OLED_ShowStr(0,0,(unsigned char*)" ",2);
					OLED_ShowStr(0,4,(unsigned char*)" ",2);
					OLED_ShowStr(0,2,(unsigned char*)"*",2);
				}break;
				case 3:
				{
					OLED_ShowStr(0,0,(unsigned char*)" ",2);
					OLED_ShowStr(0,2,(unsigned char*)" ",2);
					OLED_ShowStr(0,4,(unsigned char*)"*",2);				
				}break;
			}				
		}
/*************************************************以上已经调试成功**********************************************/
			if(key2==0)         //***确认***
			{
					delay_ms(10);	  //防抖
					while(key2==0); //按下后不松手,则停在这
					delay_ms(10);	  //防抖
					
					if(flag3==1)     //1.调频率
					{
						OLED_ShowStr(100,1,(unsigned char*)"...",1);
						OLED_ShowStr(100,3,(unsigned char*)"   ",1);
						OLED_ShowStr(68, 5,(unsigned char*)"   ",1);
						while(1)
						{
							wave_sin(frequency,amplitude,phase); //产生波形
							if(key1==0)
							{
								frequency+=0.000005;
								if(frequency>0.1) frequency=0.1;
							}	
							
							if(key2==0)
							{
								frequency-=0.000005;
								if(frequency<0.001) frequency=0.001;
							}		

							if(key3_up==1)
							{
								delay_ms(10);	    //防抖
								while(key3_up==1); //按下后不松手,则停在这
								delay_ms(10);
								
								break;
							}
						}
					}
						
					if(flag3==2)     //2.调幅值
					{
						OLED_ShowStr(100,1,(unsigned char*)"   ",1);
						OLED_ShowStr(100,3,(unsigned char*)"...",1);
						OLED_ShowStr(68, 5,(unsigned char*)"   ",1);
						while(1)
						{
							wave_sin(frequency,amplitude,phase); //产生波形					
							if(key1==0)
							{
								amplitude+= 0.05;
								if(amplitude>2047) amplitude=2047;
							}	
							
							if(key2==0)
							{
								amplitude-= 0.05;
								if(amplitude<0) amplitude=0;
							}
							
							if(key3_up==1)
							{
								delay_ms(10);	    //防抖
								while(key3_up==1); //按下后不松手,则停在这
								delay_ms(10);
								
								break;
							}
						}
					}
						
					if(flag3==3)     //3.调相位
					{
						OLED_ShowStr(100,1,(unsigned char*)"   ",1);
						OLED_ShowStr(100,3,(unsigned char*)"   ",1);
						OLED_ShowStr(68, 5,(unsigned char*)"...",1);
						while(1)
						{
							wave_sin(frequency,amplitude,phase); //产生波形					
							if(key1==0)
							{
								phase+= PI/200;
							}	
							
							if(key2==0)
							{
								phase-= PI/200;
							}
							
							if(key3_up==1)
							{
								delay_ms(10);	    //防抖
								while(key3_up==1); //按下后不松手,则停在这
								delay_ms(10);
								
								break;
							}				
					 }
				 }
				OLED_ShowStr(100,1,(unsigned char*)"   ",1);
				OLED_ShowStr(100,3,(unsigned char*)"   ",1);
				OLED_ShowStr(68, 5,(unsigned char*)"   ",1);
		 }
		
			if(key3_up==1)       //***返回***
			{
				delay_ms(10);	    //防抖
				while(key3_up==1); //按下后不松手,则停在这
				delay_ms(10);	
				DAC_set(0);       //电压清0
				OLED_Clear();
				return 0;
			}	
	}		
}

menu.h

#ifndef __MENU_H
#define __MENU_H

int menu1(void);
int menu2_gesled(void);
int menu2_key_wave(void);
int Sine_wave(void);

#endif

主函数main.c

#include "stm32f10x.h"
#include "oled.h"
#include "usart.h"
#include "delay.h"
#include "dac.h"
#include "key.h"
#include "led.h"
#include "menu.h"

int main(void)
{
	int menu;                           //选择进入二级菜单的哪一项
	delay_init();                        //初始化延时函数
	OLED_Init();                         //初始化屏幕
	DAC_init();                          //初始化dac通道1
	uart_init(115200);                   //初始化串口1
	key_init();                          //初始化按键gpio
	led_init();                          //初始化led gpio
	OLED_Clear();
	

	
	while(1)
	{
		menu = menu1();                   //进入一级菜单,并返回你的选择
		if(menu2==1) menu2_gesture();      //二级菜单 
		if(menu2==2) menu2_key_wave();     //二级菜单 
		//if(menu2==3) menu2_gesture_wave(); //二级菜单 
	}
}

另一个版本完整三级菜单,写法跟上面是一样的

#include "menu.h"
#include "delay.h"
#include "oled.h"
#include "key.h"
#include "dac.h"
#include "math.h"
#include "usart.h"
#include "paj7620u2.h"
#define PI 3.14
extern float time;
/**********************************************************
                     以下为一级菜单
**********************************************************/
int menu1()           
{
	int flag=1;         //记录选择
	OLED_ShowStr(10,0,"1.Gesture",2);
	OLED_ShowStr(10,2,"2.Key-Wave",2);
	OLED_ShowStr(10,4,"3.Gesture-Wave",2);
	while(1)
	{
		if(key0==0)       //***下一项***
		{		
			delay_ms(10);	  //防抖
			while(key0==0); //按下后不松手,则停在这
			delay_ms(10);	  //防抖
			flag++;
			if(flag==4) flag=1;			
		}
		
		if(key1==0)       //***确认***
		{
			delay_ms(10);	  //防抖
			while(key1==0); //按下后不松手,则停在这
			delay_ms(10);	  //防抖			
			OLED_Clear();   //清屏
			return(flag);   //返回你的选择
		}
		
		switch(flag)      //光标移动
		{
			case 1:
			{
				OLED_ShowStr(0,2," ",2);
				OLED_ShowStr(0,4," ",2);
				OLED_ShowStr(0,0,"*",2);
			}break;
			case 2:
			{
				OLED_ShowStr(0,0," ",2);
				OLED_ShowStr(0,4," ",2);
				OLED_ShowStr(0,2,"*",2);
			}break;
			case 3:
			{
				OLED_ShowStr(0,0," ",2);
				OLED_ShowStr(0,2," ",2);
				OLED_ShowStr(0,4,"*",2);				
			}break;
		}		
		
	}
}
	
/**********************************************************
                     以下为二级菜单
**********************************************************/
//********************* 手势识别 **********************
int menu2_gesture()
{
	int gesture;
	OLED_ShowStr(0,0,"Your gesture:",2);
	while(1)
	{
		gesture = Gesture_recog(); //得到手势识别结果
		
		//1.屏幕显示结果:
		switch(gesture)                 
		{
			case 1: OLED_ShowStr(45,3,"Up       ",2);break; //向上
			case 2: OLED_ShowStr(45,3,"Dowm     ",2);break; //向下
			case 3: OLED_ShowStr(45,3,"Left     ",2);break; //向左
			case 4: OLED_ShowStr(45,3,"Right    ",2);break; //向右
			case 5: OLED_ShowStr(45,3,"Forward  ",2);break; //向前
			case 6: OLED_ShowStr(45,3,"Backward ",2);break; //向后
			case 7: OLED_ShowStr(45,3,"Clockwise",2);break; //顺时针
			case 8: OLED_ShowStr(45,3,"AntiClock",2);break; //逆时针
			case 9: OLED_ShowStr(45,3,"Wave     ",2);break; //挥动	
		}
		delay_ms(150);
		OLED_ShowStr(45,3,"         ",2);
		
		//2.led显示结果:
		if(gesture==3) GPIO_SetBits(GPIOA,GPIO_Pin_8);    //关灯
		if(gesture==4) GPIO_ResetBits(GPIOA,GPIO_Pin_8);  //开灯
		
		//3.串口发送
		if(gesture)		
		switch(gesture)                 
		{
			case 1: printf("Up ");break;                    //向上
			case 2: printf("Dowm ");break;                  //向下
			case 3: printf("Left ");break; 									//向左
			case 4: printf("Right ");break; 								//向右
			case 5: printf("Forward ");break;								//向前
			case 6: printf("Backward ");break; 							//向后
			case 7: printf("Clockwise ");break; 						//顺时针
			case 8: printf("AntiClock ");break; 						//逆时针
			case 9: printf("Wave ");break; 									//挥动	
		}		
				
		if(key_up==1)//***返回***
		{
			delay_ms(10);	    //防抖
			while(key_up==1); //按下后不松手,则停在这
			delay_ms(10);	    //防抖
			OLED_Clear();
			return 0;
		}
	}
}

//******************** 按键控制波形部分 *******************
int menu2_key_wave()
{	
	int menu3=1;
	OLED_ShowStr(10,0,"1.Sine wave",2);
	OLED_ShowStr(10,2,"2.Square wave",2);
	OLED_ShowStr(10,4,"3.Angle wave",2);
	OLED_ShowStr(0,0,"*",2);
	
	while(1)
	{		
		if(key0==0)       //***下一项***
		{		
			delay_ms(10);	  //防抖
			while(key0==0); //按下后不松手,则停在这
			delay_ms(10);	  //防抖
			menu3++;
			if(menu3==4) menu3=1;	

			switch(menu3)   //光标移动
			{
				case 1:
				{
					OLED_ShowStr(0,2," ",2);
					OLED_ShowStr(0,4," ",2);
					OLED_ShowStr(0,0,"*",2);
				}break;
				case 2:
				{
					OLED_ShowStr(0,0," ",2);
					OLED_ShowStr(0,4," ",2);
					OLED_ShowStr(0,2,"*",2);
				}break;
				case 3:
				{
					OLED_ShowStr(0,0," ",2);
					OLED_ShowStr(0,2," ",2);
					OLED_ShowStr(0,4,"*",2);				
				}break;
			}
		}
		
		
		if(key1==0)       //***确认***
		{
			delay_ms(10);	  //防抖
			while(key1==0); //按下后不松手,则停在这
			delay_ms(10);	  //防抖			
			OLED_Clear();   //清屏
			
			if(menu3==1) Sine_wave();   //三级菜单 - 产生正弦波
			if(menu3==2) Square_wave(); //三级菜单 - 产生方波
			if(menu3==3) Angle_wave();  //三级菜单 - 产生三角波
			
			time=0;                     //时间清0
			OLED_ShowStr(10,0,"1.Sine wave",2);
			OLED_ShowStr(10,2,"2.Square wave",2);
			OLED_ShowStr(10,4,"3.Angle wave",2);
			OLED_ShowStr(0,0,"*",2);
			menu3=1;
		}
		
		
  	if(key_up==1)       //***返回***
		{
			delay_ms(10);	    //防抖
			while(key_up==1); //按下后不松手,则停在这
			delay_ms(10);	    //防抖
			DAC_set(0);       //电压清0
			OLED_Clear();
			return 0;
		}
		
	}
}

//******************** 手势控制波形部分 *******************
int menu2_gesture_wave()
{
	int menu3=1;
	OLED_ShowStr(10,0,"1.Sine wave",2);
	OLED_ShowStr(10,2,"2.Square wave",2);
	OLED_ShowStr(10,4,"3.Angle wave",2);
	OLED_ShowStr(0,0,"*",2);
	
	while(1)
	{		
		if(key0==0)       //***下一项***
		{		
			delay_ms(10);	  //防抖
			while(key0==0); //按下后不松手,则停在这
			delay_ms(10);	  //防抖
			menu3++;
			if(menu3==4) menu3=1;	

			switch(menu3)   //光标移动
			{
				case 1:
				{
					OLED_ShowStr(0,2," ",2);
					OLED_ShowStr(0,4," ",2);
					OLED_ShowStr(0,0,"*",2);
				}break;
				case 2:
				{
					OLED_ShowStr(0,0," ",2);
					OLED_ShowStr(0,4," ",2);
					OLED_ShowStr(0,2,"*",2);
				}break;
				case 3:
				{
					OLED_ShowStr(0,0," ",2);
					OLED_ShowStr(0,2," ",2);
					OLED_ShowStr(0,4,"*",2);				
				}break;
			}
		}
		
		
		if(key1==0)         //***确认***
		{
			delay_ms(10);	    //防抖
			while(key1==0);   //按下后不松手,则停在这
			delay_ms(10);	    //防抖			
			OLED_Clear();     //清屏
			
			if(menu3==1) gesture_Sine_wave();   //三级菜单 - 手势产生正弦波
			if(menu3==2) gesture_Square_wave(); //三级菜单 - 手势产生方波
			if(menu3==3) gesture_Angle_wave();  //三级菜单 - 手势产生三角波
			
			time=0;           //时间清0
			OLED_ShowStr(10,0,"1.Sine wave",2);
			OLED_ShowStr(10,2,"2.Square wave",2);
			OLED_ShowStr(10,4,"3.Angle wave",2);
			OLED_ShowStr(0,0,"*",2);
			menu3=1;
		}
		
		
  	if(key_up==1)       //***返回***
		{
			delay_ms(10);	    //防抖
			while(key_up==1); //按下后不松手,则停在这
			delay_ms(10);	    //防抖
			DAC_set(0);       //电压清0
			OLED_Clear();
			return 0;
		}
		
	}
}


/**********************************************************
                     以下为三级菜单
**********************************************************/
//******************产生正弦波的界面***********************
int Sine_wave(void)
{
	int flag=1;
	float frequency = 0.01; //设定初始频率
	float amplitude=1200;   //设定初始幅值
	float phase=0;          //设定初始相位
	OLED_ShowStr(10,0,"1.Frequency",2);
	OLED_ShowStr(10,2,"2.Amplitude",2);
	OLED_ShowStr(10,4,"3.Phase",2);
	OLED_ShowStr(0,0,"*",2);
	
	while(1)
	{
		wave_sin(frequency,amplitude,phase); //产生波形
		
		if(key0==0)       //***下一项***
		{		
			delay_ms(10);	  //防抖
			while(key0==0); //按下后不松手,则停在这
			delay_ms(10);	  //防抖
			flag++;
			if(flag==4) flag=1;	

			switch(flag)    //光标移动
			{
				case 1:
				{
					OLED_ShowStr(0,2," ",2);
					OLED_ShowStr(0,4," ",2);
					OLED_ShowStr(0,0,"*",2);
				}break;
				case 2:
				{
					OLED_ShowStr(0,0," ",2);
					OLED_ShowStr(0,4," ",2);
					OLED_ShowStr(0,2,"*",2);
				}break;
				case 3:
				{
					OLED_ShowStr(0,0," ",2);
					OLED_ShowStr(0,2," ",2);
					OLED_ShowStr(0,4,"*",2);				
				}break;
			}				
		}
		
		
		if(key1==0)         //***确认***
		{
				delay_ms(10);	  //防抖
				while(key1==0); //按下后不松手,则停在这
				delay_ms(10);	  //防抖
				
				if(flag==1)     //1.调频率
				{
					OLED_ShowStr(100,1,"...",1);
					OLED_ShowStr(100,3,"   ",1);
					OLED_ShowStr(68,5,"   ",1);
					while(1)
					{
						wave_sin(frequency,amplitude,phase); //产生波形
						if(key0==0)
						{
							frequency+=0.000005;
							if(frequency>0.1) frequency=0.1;
						}	
						
						if(key1==0)
						{
							frequency-=0.000005;
							if(frequency<0.001) frequency=0.001;
						}		

						if(key_up==1)
						{
							delay_ms(10);	    //防抖
							while(key_up==1); //按下后不松手,则停在这
							delay_ms(10);
							
							break;
						}
					}
				}
					
				if(flag==2)     //2.调幅值
				{
					OLED_ShowStr(100,1,"   ",1);
					OLED_ShowStr(100,3,"...",1);
					OLED_ShowStr(68,5,"   ",1);
					while(1)
					{
						wave_sin(frequency,amplitude,phase); //产生波形					
						if(key0==0)
						{
							amplitude+= 0.05;
							if(amplitude>2047) amplitude=2047;
						}	
						
						if(key1==0)
						{
							amplitude-= 0.05;
							if(amplitude<0) amplitude=0;
						}
						
						if(key_up==1)
						{
							delay_ms(10);	    //防抖
							while(key_up==1); //按下后不松手,则停在这
							delay_ms(10);
							
							break;
						}
					}
				}
					
				if(flag==3)     //3.调相位
				{
					OLED_ShowStr(100,1,"   ",1);
					OLED_ShowStr(100,3,"   ",1);
					OLED_ShowStr(68,5,"...",1);
					while(1)
					{
						wave_sin(frequency,amplitude,phase); //产生波形					
						if(key0==0)
						{
							phase+= PI/200;
						}	
						
						if(key1==0)
						{
							phase-= PI/200;
						}
						
						if(key_up==1)
						{
							delay_ms(10);	    //防抖
							while(key_up==1); //按下后不松手,则停在这
							delay_ms(10);
							
							break;
						}				
				 }
			 }
			OLED_ShowStr(100,1,"   ",1);
			OLED_ShowStr(100,3,"   ",1);
			OLED_ShowStr(68,5,"   ",1);
	 }

		if(key_up==1)       //***返回***
		{
			delay_ms(10);	    //防抖
			while(key_up==1); //按下后不松手,则停在这
			delay_ms(10);	
			DAC_set(0);       //电压清0
			OLED_Clear();
			return 0;
		}	
	}
}


//******************产生方波的界面************************
int Square_wave(void)
{
	int flag=1;
	float frequency = 0.01; //设定初始频率
	float amplitude=1200;   //设定初始幅值
	float phase=0;          //设定初始相位
	float ratio=2047;       //设定初始占空比50%
	OLED_ShowStr(10,0,"1.Frequency",2);
	OLED_ShowStr(10,2,"2.Amplitude",2);
	OLED_ShowStr(10,4,"3.Phase",2);
	OLED_ShowStr(10,6,"4.Duty ratio ",2);
	OLED_ShowStr(0,0,"*",2);
	
	while(1)
	{
		wave_square(frequency,amplitude,phase,ratio); //产生波形
		
		if(key0==0)       //***下一项***
		{		
			delay_ms(10);	  //防抖
			while(key0==0); //按下后不松手,则停在这
			delay_ms(10);	  //防抖
			flag++;
			if(flag==5) flag=1;	

			switch(flag)    //光标移动
			{
				case 1:
				{
					OLED_ShowStr(0,0,"*",2);
					OLED_ShowStr(0,2," ",2);
					OLED_ShowStr(0,4," ",2);
					OLED_ShowStr(0,6," ",2);
				}break;
				case 2:
				{
					OLED_ShowStr(0,0," ",2);
					OLED_ShowStr(0,2,"*",2);
					OLED_ShowStr(0,4," ",2);
					OLED_ShowStr(0,6," ",2);
				}break;
				case 3:
				{
					OLED_ShowStr(0,0," ",2);
					OLED_ShowStr(0,2," ",2);
					OLED_ShowStr(0,4,"*",2);
					OLED_ShowStr(0,6," ",2);				
				}break;
				case 4:
				{
					OLED_ShowStr(0,0," ",2);
					OLED_ShowStr(0,2," ",2);
					OLED_ShowStr(0,4," ",2);
					OLED_ShowStr(0,6,"*",2);				
				}break;
			}				
		}
		
		
		if(key1==0)         //***确认***
		{
				delay_ms(10);	  //防抖
				while(key1==0); //按下后不松手,则停在这
				delay_ms(10);	  //防抖
				
				if(flag==1)     //1.调频率
				{
					OLED_ShowStr(100,1,"...",1);
					OLED_ShowStr(100,3,"   ",1);
					OLED_ShowStr(68,5,"   ",1);
					while(1)
					{
						wave_square(frequency,amplitude,phase,ratio); //产生波形
						if(key0==0)
						{
							frequency+=0.000005;
							if(frequency>0.1) frequency=0.1;
						}	
						
						if(key1==0)
						{
							frequency-=0.000005;
							if(frequency<0.001) frequency=0.001;
						}		

						if(key_up==1)
						{
							delay_ms(10);	    //防抖
							while(key_up==1); //按下后不松手,则停在这
							delay_ms(10);
							
							break;
						}
					}
				}
					
				if(flag==2)     //2.调幅值
				{
					OLED_ShowStr(100,1,"   ",1);
					OLED_ShowStr(100,3,"...",1);
					OLED_ShowStr(68,5,"   ",1);
					while(1)
					{
						wave_square(frequency,amplitude,phase,ratio); //产生波形					
						if(key0==0)
						{
							amplitude+= 0.05;
							if(amplitude>2047) amplitude=2047;
						}	
						
						if(key1==0)
						{
							amplitude-= 0.05;
							if(amplitude<0) amplitude=0;
						}
						
						if(key_up==1)
						{
							delay_ms(10);	    //防抖
							while(key_up==1); //按下后不松手,则停在这
							delay_ms(10);
							
							break;
						}
					}
				}
					
				if(flag==3)     //3.调相位
				{
					OLED_ShowStr(100,1,"   ",1);
					OLED_ShowStr(100,3,"   ",1);
					OLED_ShowStr(68,5,"...",1);
					while(1)
					{
						wave_square(frequency,amplitude,phase,ratio); //产生波形					
						if(key0==0)
						{
							phase+= PI/200;
						}	
						
						if(key1==0)
						{
							phase-= PI/200;
						}
						
						if(key_up==1)
						{
							delay_ms(10);	    //防抖
							while(key_up==1); //按下后不松手,则停在这
							delay_ms(10);
							
							break;
						}				
				 }
			 }
				
			if(flag==4)     //4.调占空比
			{
				OLED_ShowStr(100,1,"   ",1);
				OLED_ShowStr(100,3,"   ",1);
				OLED_ShowStr(68,5,"   ",1);
				OLED_ShowStr(106,7,"...",1);
				while(1)
				{
					wave_square(frequency,amplitude,phase,ratio); //产生波形
					if(key0==0)
					{
						ratio+=0.1;
						if(ratio>4094) ratio=4094;
					}	
					
					if(key1==0)
					{
						ratio-=0.1;
						if(ratio<1) ratio=1;
					}		

					if(key_up==1)
					{
						delay_ms(10);	    //防抖
						while(key_up==1); //按下后不松手,则停在这
						delay_ms(10);
						
						break;
					}
				}
			}
			
			OLED_ShowStr(100,1,"   ",1);
			OLED_ShowStr(100,3,"   ",1);
			OLED_ShowStr(68,5,"   ",1);
			OLED_ShowStr(106,7,"   ",1);
	 }

		if(key_up==1)       //***返回***
		{
			delay_ms(10);	    //防抖
			while(key_up==1); //按下后不松手,则停在这
			delay_ms(10);	
			DAC_set(0);       //电压清0
			OLED_Clear();
			return 0;
		}	
	}	
}


//*****************产生三角波的界面***********************
int Angle_wave(void)
{
	int flag=1;
	float frequency = 0.01; //设定初始频率
	float amplitude=1200;   //设定初始幅值
	float phase=0;          //设定初始相位
	float ratio=2047;       //设定初始占空比50%
	OLED_ShowStr(10,0,"1.Frequency",2);
	OLED_ShowStr(10,2,"2.Amplitude",2);
	OLED_ShowStr(10,4,"3.Phase",2);
	OLED_ShowStr(10,6,"4.Duty ratio ",2);
	OLED_ShowStr(0,0,"*",2);
	
	while(1)
	{
		wave_triangle(frequency,amplitude,phase,ratio); //产生波形
		
		if(key0==0)       //***下一项***
		{		
			delay_ms(10);	  //防抖
			while(key0==0); //按下后不松手,则停在这
			delay_ms(10);	  //防抖
			flag++;
			if(flag==5) flag=1;	

			switch(flag)    //光标移动
			{
				case 1:
				{
					OLED_ShowStr(0,0,"*",2);
					OLED_ShowStr(0,2," ",2);
					OLED_ShowStr(0,4," ",2);
					OLED_ShowStr(0,6," ",2);
				}break;
				case 2:
				{
					OLED_ShowStr(0,0," ",2);
					OLED_ShowStr(0,2,"*",2);
					OLED_ShowStr(0,4," ",2);
					OLED_ShowStr(0,6," ",2);
				}break;
				case 3:
				{
					OLED_ShowStr(0,0," ",2);
					OLED_ShowStr(0,2," ",2);
					OLED_ShowStr(0,4,"*",2);
					OLED_ShowStr(0,6," ",2);				
				}break;
				case 4:
				{
					OLED_ShowStr(0,0," ",2);
					OLED_ShowStr(0,2," ",2);
					OLED_ShowStr(0,4," ",2);
					OLED_ShowStr(0,6,"*",2);				
				}break;
			}				
		}
		
		
		if(key1==0)         //***确认***
		{
				delay_ms(10);	  //防抖
				while(key1==0); //按下后不松手,则停在这
				delay_ms(10);	  //防抖
				
				if(flag==1)     //1.调频率
				{
					OLED_ShowStr(100,1,"...",1);
					OLED_ShowStr(100,3,"   ",1);
					OLED_ShowStr(68,5,"   ",1);
					while(1)
					{
						wave_triangle(frequency,amplitude,phase,ratio); //产生波形
						if(key0==0)
						{
							frequency+=0.000003;
							if(frequency>0.1) frequency=0.1;
						}	
						
						if(key1==0)
						{
							frequency-=0.000003;
							if(frequency<0.001) frequency=0.001;
						}		

						if(key_up==1)
						{
							delay_ms(10);	    //防抖
							while(key_up==1); //按下后不松手,则停在这
							delay_ms(10);
							
							break;
						}
					}
				}
					
				if(flag==2)     //2.调幅值
				{
					OLED_ShowStr(100,1,"   ",1);
					OLED_ShowStr(100,3,"...",1);
					OLED_ShowStr(68,5,"   ",1);
					while(1)
					{
						wave_triangle(frequency,amplitude,phase,ratio); //产生波形					
						if(key0==0)
						{
							amplitude+= 0.05;
							if(amplitude>2047) amplitude=2047;
						}	
						
						if(key1==0)
						{
							amplitude-= 0.05;
							if(amplitude<0) amplitude=0;
						}
						
						if(key_up==1)
						{
							delay_ms(10);	    //防抖
							while(key_up==1); //按下后不松手,则停在这
							delay_ms(10);
							
							break;
						}
					}
				}
					
				if(flag==3)     //3.调相位
				{
					OLED_ShowStr(100,1,"   ",1);
					OLED_ShowStr(100,3,"   ",1);
					OLED_ShowStr(68,5,"...",1);
					while(1)
					{
						wave_triangle(frequency,amplitude,phase,ratio); //产生波形					
						if(key0==0)
						{
							phase+= PI/200;
						}	
						
						if(key1==0)
						{
							phase-= PI/200;
						}
						
						if(key_up==1)
						{
							delay_ms(10);	    //防抖
							while(key_up==1); //按下后不松手,则停在这
							delay_ms(10);
							
							break;
						}				
				 }
			 }
				
			if(flag==4)       //4.调占空比
			{
				OLED_ShowStr(100,1,"   ",1);
				OLED_ShowStr(100,3,"   ",1);
				OLED_ShowStr(68,5,"   ",1);
				OLED_ShowStr(106,7,"...",1);
				while(1)
				{
					wave_triangle(frequency,amplitude,phase,ratio); //产生波形
					if(key0==0)
					{
						ratio+=0.1;
						if(ratio>4094) ratio=4094;
					}	
					
					if(key1==0)
					{
						ratio-=0.1;
						if(ratio<1) ratio=1;
					}		

					if(key_up==1)
					{
						delay_ms(10);	    //防抖
						while(key_up==1); //按下后不松手,则停在这
						delay_ms(10);
						
						break;
					}
				}
			}
			
			OLED_ShowStr(100,1,"   ",1);
			OLED_ShowStr(100,3,"   ",1);
			OLED_ShowStr(68,5,"   ",1);
			OLED_ShowStr(106,7,"   ",1);
	 }

		if(key_up==1) 			//***返回***
		{
			delay_ms(10);	    //防抖
			while(key_up==1); //按下后不松手,则停在这
			delay_ms(10);	
			DAC_set(0);       //电压清0
			OLED_Clear();
			return 0;
		}	
	}	
}





//******************手势产生正弦波的界面***********************
int gesture_Sine_wave(void)
{
	int gesture;
	float frequency = 0.05; //设定初始频率
	float amplitude=1200;   //设定初始幅值
	float phase=0;          //设定初始相位
	OLED_ShowStr(0,0,"You are setting up:",1);
	
	while(1)
	{
		wave_sin(frequency,amplitude,phase); //产生波形
		gesture = Gesture_recog();           //得到手势识别结果
		
		if(gesture)                          //收到了手势识别结果
		{
			
			if(gesture==3||gesture==4)        //1.调频率
			{
				
				if(gesture==4)
				{
					OLED_ShowStr(0,3,"Frequncy up   ",2);
					frequency+=0.02;
					if(frequency>0.2) frequency=0.2;
				}	
				
				if(gesture==3)
				{
					OLED_ShowStr(0,3,"Frequncy down ",2);
					frequency-=0.02;
					if(frequency<0.001) frequency=0.001;
				}		
			}
				
			if(gesture==1||gesture==2)       //2.调幅值
			{	

				if(gesture==1)
				{
					OLED_ShowStr(0,3,"Amplitude up  ",2);
					amplitude+= 200;
					if(amplitude>2047) amplitude=2047;
				}	
				
				if(gesture==2)
				{
					OLED_ShowStr(0,3,"Amplitude down",2);
					amplitude-= 200;
					if(amplitude<0) amplitude=0;
				}									
			}
				
			if(gesture==5||gesture==6)      //3.调相位
			{	
				
				if(gesture==5)
				{
				  OLED_ShowStr(0,3,"Phase up      ",2);	
					phase+= PI/2;
				}	
				
				if(gesture==6)
				{
					OLED_ShowStr(0,3,"Phase down    ",2);
					phase-= PI/2;
				}
		 }
	 }

	 
		if(key_up==1)       //***返回***
		{
			delay_ms(10);	    //防抖
			while(key_up==1); //按下后不松手,则停在这
			delay_ms(10);	
			DAC_set(0);       //电压清0
			OLED_Clear();
			return 0;
		}	
	}
}


//******************手势产生方波的界面************************
int gesture_Square_wave(void)
{
	int gesture;
	float frequency = 0.05; //设定初始频率
	float amplitude=1200;   //设定初始幅值
	float phase=0;          //设定初始相位
	float ratio=2047;       //设定初始占空比50%
	OLED_ShowStr(0,0,"You are setting up:",1);
	
	while(1)
	{
		wave_square(frequency,amplitude,phase,ratio); //产生波形
		gesture = Gesture_recog();                    //得到手势识别结果
		
		if(gesture)     
		{						
			if(gesture==3||gesture==4)     //1.调频率
			{
				
				if(gesture==4)
				{
					OLED_ShowStr(0,3,"Frequncy up   ",2);
					frequency+=0.02;
					if(frequency>0.2) frequency=0.2;
				}	
				
				if(gesture==3)
				{
					OLED_ShowStr(0,3,"Frequncy down ",2);
					frequency-=0.02;
					if(frequency<0.001) frequency=0.001;
				}		
			}
					
			if(gesture==1||gesture==2)     //2.调幅值
			{	

				if(gesture==1)
				{
					OLED_ShowStr(0,3,"Amplitude up  ",2);
					amplitude+= 200;
					if(amplitude>2047) amplitude=2047;
				}	
				
				if(gesture==2)
				{
					OLED_ShowStr(0,3,"Amplitude down",2);
					amplitude-= 200;
					if(amplitude<0) amplitude=0;
				}									
			}
					
			if(gesture==5||gesture==6)     //3.调相位
			{	
				
				if(gesture==5)
				{
				  OLED_ShowStr(0,3,"Phase up      ",2);	
					phase+= PI/2;
				}	
				
				if(gesture==6)
				{
					OLED_ShowStr(0,3,"Phase down    ",2);
					phase-= PI/2;
				}
		 }
				
			if(gesture==7||gesture==8)     //4.调占空比
			{
				
				if(gesture==7)
				{
					OLED_ShowStr(0,3,"Duty up       ",2);
					ratio-= 300;
					if(ratio<1) amplitude=1;
				}	
				
				if(gesture==8)
				{
					OLED_ShowStr(0,3,"Duty down     ",2);
					ratio+= 300;
					if(ratio>4094) amplitude=4094;
				}
			}
	 }


		if(key_up==1)       //***返回***
		{
			delay_ms(10);	    //防抖
			while(key_up==1); //按下后不松手,则停在这
			delay_ms(10);	
			DAC_set(0);       //电压清0
			OLED_Clear();
			return 0;
		}	
	}	
}


//*****************手势产生三角波的界面***********************
int gesture_Angle_wave(void)
{
	int gesture;
	float frequency = 0.05; //设定初始频率
	float amplitude=1200;   //设定初始幅值
	float phase=0;          //设定初始相位
	float ratio=2047;       //设定初始占空比50%
	OLED_ShowStr(0,0,"You are setting up:",1);
	
	while(1)
	{
		wave_triangle(frequency,amplitude,phase,ratio); //产生波形
		gesture = Gesture_recog();                    //得到手势识别结果
		
		if(gesture)     
		{						
			if(gesture==3||gesture==4)     //1.调频率
			{
				
				if(gesture==4)
				{
					OLED_ShowStr(0,3,"Frequncy up   ",2);
					frequency+=0.02;
					if(frequency>0.2) frequency=0.2;
				}	
				
				if(gesture==3)
				{
					OLED_ShowStr(0,3,"Frequncy down ",2);
					frequency-=0.02;
					if(frequency<0.001) frequency=0.001;
				}		
			}
					
			if(gesture==1||gesture==2)     //2.调幅值
			{	

				if(gesture==1)
				{
					OLED_ShowStr(0,3,"Amplitude up  ",2);
					amplitude+= 200;
					if(amplitude>2047) amplitude=2047;
				}	
				
				if(gesture==2)
				{
					OLED_ShowStr(0,3,"Amplitude down",2);
					amplitude-= 200;
					if(amplitude<0) amplitude=0;
				}									
			}
					
			if(gesture==5||gesture==6)     //3.调相位
			{	
				
				if(gesture==5)
				{
				  OLED_ShowStr(0,3,"Phase up      ",2);	
					phase+= PI/2;
				}	
				
				if(gesture==6)
				{
					OLED_ShowStr(0,3,"Phase down    ",2);
					phase-= PI/2;
				}
		 }		
	 }

		if(key_up==1)       //***返回***
		{
			delay_ms(10);	    //防抖
			while(key_up==1); //按下后不松手,则停在这
			delay_ms(10);	
			DAC_set(0);       //电压清0
			OLED_Clear();
			return 0;
		}	
	}	
}

主函数


#include "stm32f10x.h"
#include "oled.h"
#include "usart.h"
#include "delay.h"
#include "dac.h"
#include "key.h"
#include "led.h"
#include "menu.h"
#include "paj7620u2.h"

int main(void)
{
	int menu2;                           //选择进入二级菜单的哪一项
	delay_init();                        //初始化延时函数
	OLED_Init();                         //初始化屏幕
	DAC_init();                          //初始化dac通道1
	uart_init(115200);                   //初始化串口1
	key_init();                          //初始化按键gpio
	led_init();                          //初始化led gpio
 	paj7620u2_init();                    //PAJ7620U2手势识别传感器
	OLED_Clear();
	
	while(1)
	{
		menu2 = menu1();                   //进入一级菜单,并返回选择
		if(menu2==1) menu2_gesture();      //二级菜单 - 手势识别
		if(menu2==2) menu2_key_wave();     //二级菜单 - 按键控制波形产生
		if(menu2==3) menu2_gesture_wave(); //二级菜单 - 手势控制波形产生
	}
}



http://链接:https://pan.baidu.com/s/10iYaywZxhuDwhGTtCUvDmg?pwd=hdyo 提取码:hdyo --来自百度网盘超级会员V3的分享

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32F103RCT6是一款32位微控制器,它采用了ARM Cortex-M3内核,并具有丰富的外设和功能。作为一款常用的微控制器,下载和安装它的标准库对于开发人员来说是非常重要的。以下是关于如何下载STM32F103RCT6标准库的简要步骤: 1. 首先,在STMicroelectronics官方网站上注册并登录。访问ST官方网站并创建一个账户,以便可以获取所需的软件和工具。 2. 在官方网站上搜索并找到适用于STM32F103RCT6标准库。通常,标准库可以在产品页面或支持页面中找到。 3. 下载STM32Cube库。ST推出了一款名为STM32Cube的开发工具包,其中包含了针对所有型号的标准库和其他的开发工具。在官方网站上找到适用于STM32F103RCT6STM32Cube库,并下载到本地计算机上。 4. 解压下载的STM32Cube库文件。将下载的文件解压到任意位置,并打开解压后的文件夹。 5. 导入库到开发环境中。如果您使用的是Keil MDK或IAR Embedded Workbench等开发环境,可以通过在工程设置中导入库文件来将其集成到开发环境中。如果您使用的是STM32Cube IDE等ST官方提供的开发环境,那么库文件应该会自动加载。 6. 配置库文件。根据需要配置库文件,例如选择所需的外设和功能,并在代码中引用相应的库函数。 7. 编写代码并进行编译。使用您选择的开发环境编写代码,并将其编译为可执行文件。 8. 烧录程序到STM32F103RCT6。使用合适的烧录工具(如ST-Link或J-Link等)将编译后的程序烧录到STM32F103RCT6微控制器上。 通过按照上述步骤下载STM32F103RCT6标准库,您可以开始使用丰富的外设和功能,为您的应用程序编写代码,并将其部署到STM32F103RCT6微控制器上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漏洞嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值