学习目标:利用菜单查看更多参数
本次的菜单主要是一,循环语句嵌套。相比网上那些用定时器、结构体指针、数组调用来说,更适合新手。新手朋友可以一点点的把代码复制,从显示一级开始,一级一级的来实现,这样就非常快的把代码完全明白。
其他子文件就不上传了,感兴趣的可以看链接里面的工程,里面包括了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(); //二级菜单 - 手势控制波形产生
}
}