发布时间:2023-11-21 18:00
组合显示屏和按键实现一个两级窗口,程序由三个页面组成,交互方式自定
一级窗口A
:
有陀螺仪显示和LED控制两个选项,分别对应跳转二级窗口A和B
二级窗口A
:
显示陀螺仪数据,如果无陀螺仪插入应当报错
二级窗口B
:
显示任意两个LED状态,仅可在此界面控制LED亮灭,控制方式自定
进入二级窗口后还应当具备返回的功能,窗口可以重复调用,多次窗口跳转LED状态自锁
窗口的跳转和返回要符合菜单的思想,不能一个按键绑定一个窗口直接跳转
第一个界面显示,陀螺仪选择key1,LED选择key2 ok
按下key1来到二级窗口A
显示陀螺仪数据
int main (void){//主程序
u16 t[6]={0};
delay_ms(500); //上电时等待其他器件就绪
RCC_Configuration(); //系统时钟初始化
RELAY_Init();//继电器初始化
I2C_Configuration();//I2C初始化
KEY_Init();
LED_Init();
TOUCH_KEY_Init();
OLED0561_Init(); //OLED初始化
OLED_DISPLAY_8x16_BUFFER(0," MPU6050");
OLED_DISPLAY_8x16_BUFFER(2,"key1");
OLED_DISPLAY_8x16_BUFFER(4," LED Control");
OLED_DISPLAY_8x16_BUFFER(6,"key2");
MPU6050_Init(); //MPU6050初始化
while(1){
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
OLED_DISPLAY_CLEAR();
OLED_DISPLAY_8x16_BUFFER(0," MPU6050");
OLED_DISPLAY_8x16_BUFFER(2,"X: X: "); //显示字符串
OLED_DISPLAY_8x16_BUFFER(4,"Y: Y: "); //显示字符串
OLED_DISPLAY_8x16_BUFFER(6,"Z: Z: "); //显示字符串
while(1)
{
MPU6050_READ(t); //加速度
//其中t[0~2]是加速度ACCEL,t[3~5]是陀螺仪GYRO
OLED_DISPLAY_8x16(2,2*8,t[0]/10000 +0x30);//显示
OLED_DISPLAY_8x16(2,3*8,t[0]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(2,4*8,t[0]%1000/100 +0x30);//
OLED_DISPLAY_8x16(2,5*8,t[0]%100/10 +0x30);//
OLED_DISPLAY_8x16(2,6*8,t[0]%10 +0x30);//
OLED_DISPLAY_8x16(2,11*8,t[3]/10000 +0x30);//显示
OLED_DISPLAY_8x16(2,12*8,t[3]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(2,13*8,t[3]%1000/100 +0x30);//
OLED_DISPLAY_8x16(2,14*8,t[3]%100/10 +0x30);//
OLED_DISPLAY_8x16(2,15*8,t[3]%10 +0x30);//
OLED_DISPLAY_8x16(4,2*8,t[1]/10000 +0x30);//显示
OLED_DISPLAY_8x16(4,3*8,t[1]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(4,4*8,t[1]%1000/100 +0x30);//
OLED_DISPLAY_8x16(4,5*8,t[1]%100/10 +0x30);//
OLED_DISPLAY_8x16(4,6*8,t[1]%10 +0x30);//
OLED_DISPLAY_8x16(4,11*8,t[4]/10000 +0x30);//显示
OLED_DISPLAY_8x16(4,12*8,t[4]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(4,13*8,t[4]%1000/100 +0x30);//
OLED_DISPLAY_8x16(4,14*8,t[4]%100/10 +0x30);//
OLED_DISPLAY_8x16(4,15*8,t[4]%10 +0x30);//
OLED_DISPLAY_8x16(6,2*8,t[2]/10000 +0x30);//显示
OLED_DISPLAY_8x16(6,3*8,t[2]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(6,4*8,t[2]%1000/100 +0x30);//
OLED_DISPLAY_8x16(6,5*8,t[2]%100/10 +0x30);//
OLED_DISPLAY_8x16(6,6*8,t[2]%10 +0x30);//
OLED_DISPLAY_8x16(6,11*8,t[5]/10000 +0x30);//显示
OLED_DISPLAY_8x16(6,12*8,t[5]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(6,13*8,t[5]%1000/100 +0x30);//
OLED_DISPLAY_8x16(6,14*8,t[5]%100/10 +0x30);//
OLED_DISPLAY_8x16(6,15*8,t[5]%10 +0x30);//
delay_ms(200); //延时(决定刷新速度)
}
while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开
}
}
if(!GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //读按键接口的电平
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //读按键接口的电平
OLED_DISPLAY_CLEAR();
OLED_DISPLAY_8x16_BUFFER(0," LED Control");
OLED_DISPLAY_8x16_BUFFER(2,"LED1 TOUCH_C");
OLED_DISPLAY_8x16_BUFFER(4,"LED2 TOUVH_D");
while(1)
{
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读按键接口的电平
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读按键接口的电平
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1))); //LED取反
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)); //等待按键松开 防止程序在按键没有松开的情况下反复运行
}
}
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){ //读按键接口的电平
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){ //读按键接口的电平
GPIO_WriteBit(LEDPORT,LED2,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED2))); //LED取反
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)); //等待按键松开 防止程序在按键没有松开的情况下反复运行
}
}
}
while(!GPIO_ReadInputDataBit(KEYPORT,KEY2)); //等待按键松开
}
}
}
}
现在的代码只能实现从一级窗口跳转到一个二级窗口,不能返回一级窗口,而且二级窗口之间也不能互转,到了二级窗口只能就在那个窗口。
因为代码进入了二级窗口的while(1)死循环里面了
int main (void){//主程序
u16 t[6]={0};
delay_ms(500); //上电时等待其他器件就绪
RCC_Configuration(); //系统时钟初始化
RELAY_Init();//继电器初始化
I2C_Configuration();//I2C初始化
KEY_Init();
LED_Init();
TOUCH_KEY_Init();
OLED0561_Init(); //OLED初始化
OLED_DISPLAY_8x16_BUFFER(0," MPU6050");
OLED_DISPLAY_8x16_BUFFER(2,"key1");
OLED_DISPLAY_8x16_BUFFER(4," LED Control");
OLED_DISPLAY_8x16_BUFFER(6,"key2");
MPU6050_Init(); //MPU6050初始化
while(1){
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
OLED_DISPLAY_CLEAR();
OLED_DISPLAY_8x16_BUFFER(0," MPU6050");
OLED_DISPLAY_8x16_BUFFER(2,"X: X: "); //显示字符串
OLED_DISPLAY_8x16_BUFFER(4,"Y: Y: "); //显示字符串
OLED_DISPLAY_8x16_BUFFER(6,"Z: Z: "); //显示字符串
while(1)
{
MPU6050_READ(t); //加速度
//其中t[0~2]是加速度ACCEL,t[3~5]是陀螺仪GYRO
OLED_DISPLAY_8x16(2,2*8,t[0]/10000 +0x30);//显示
OLED_DISPLAY_8x16(2,3*8,t[0]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(2,4*8,t[0]%1000/100 +0x30);//
OLED_DISPLAY_8x16(2,5*8,t[0]%100/10 +0x30);//
OLED_DISPLAY_8x16(2,6*8,t[0]%10 +0x30);//
OLED_DISPLAY_8x16(2,11*8,t[3]/10000 +0x30);//显示
OLED_DISPLAY_8x16(2,12*8,t[3]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(2,13*8,t[3]%1000/100 +0x30);//
OLED_DISPLAY_8x16(2,14*8,t[3]%100/10 +0x30);//
OLED_DISPLAY_8x16(2,15*8,t[3]%10 +0x30);//
OLED_DISPLAY_8x16(4,2*8,t[1]/10000 +0x30);//显示
OLED_DISPLAY_8x16(4,3*8,t[1]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(4,4*8,t[1]%1000/100 +0x30);//
OLED_DISPLAY_8x16(4,5*8,t[1]%100/10 +0x30);//
OLED_DISPLAY_8x16(4,6*8,t[1]%10 +0x30);//
OLED_DISPLAY_8x16(4,11*8,t[4]/10000 +0x30);//显示
OLED_DISPLAY_8x16(4,12*8,t[4]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(4,13*8,t[4]%1000/100 +0x30);//
OLED_DISPLAY_8x16(4,14*8,t[4]%100/10 +0x30);//
OLED_DISPLAY_8x16(4,15*8,t[4]%10 +0x30);//
OLED_DISPLAY_8x16(6,2*8,t[2]/10000 +0x30);//显示
OLED_DISPLAY_8x16(6,3*8,t[2]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(6,4*8,t[2]%1000/100 +0x30);//
OLED_DISPLAY_8x16(6,5*8,t[2]%100/10 +0x30);//
OLED_DISPLAY_8x16(6,6*8,t[2]%10 +0x30);//
OLED_DISPLAY_8x16(6,11*8,t[5]/10000 +0x30);//显示
OLED_DISPLAY_8x16(6,12*8,t[5]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(6,13*8,t[5]%1000/100 +0x30);//
OLED_DISPLAY_8x16(6,14*8,t[5]%100/10 +0x30);//
OLED_DISPLAY_8x16(6,15*8,t[5]%10 +0x30);//
delay_ms(200); //延时(决定刷新速度)
if(!GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //读按键接口的电平
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //读按键接口的电平
while(!GPIO_ReadInputDataBit(KEYPORT,KEY2)); //等待按键松开
}
break;
}
}
while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开
}
}
if(!GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //读按键接口的电平
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //读按键接口的电平
OLED_DISPLAY_CLEAR();
OLED_DISPLAY_8x16_BUFFER(0," LED Control");
OLED_DISPLAY_8x16_BUFFER(2,"LED1 TOUCH_C");
OLED_DISPLAY_8x16_BUFFER(4,"LED2 TOUVH_D");
while(1)
{
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读按键接口的电平
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读按键接口的电平
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1))); //LED取反
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)); //等待按键松开 防止程序在按键没有松开的情况下反复运行
}
}
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){ //读按键接口的电平
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){ //读按键接口的电平
GPIO_WriteBit(LEDPORT,LED2,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED2))); //LED取反
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)); //等待按键松开 防止程序在按键没有松开的情况下反复运行
}
}
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开
}
break;
}
}
while(!GPIO_ReadInputDataBit(KEYPORT,KEY2)); //等待按键松开
}
}
}
}
使用break跳出循环;需要按想要跳转的窗口对应的按键两下就可以跳转,并且LED也能实现自锁,并且只有在二级B窗口才能控制。
第一下按下是停止while循环,第二次按下才会跳转。
实现返回功能!
菜单:
key1 陀螺仪
key2 LED touchD 长按led1亮 双击 led2亮 单击是熄灭
touchC返回
#define KEYA_SPEED1 100 //长按的时间长度(单位10mS)
#define KEYA_SPEED2 10 //双击的时间长度(单位20mS)
int main (void){//主程序
u16 t[6]={0};
u8 a=0,b,c=0;
// u8 dir = 1;
// u8 p=0;
delay_ms(500); //上电时等待其他器件就绪
RCC_Configuration(); //系统时钟初始化
RELAY_Init();//继电器初始化
I2C_Configuration();//I2C初始化
KEY_Init();
LED_Init();
TOUCH_KEY_Init();
OLED0561_Init(); //OLED初始化
//一A
OLED_DISPLAY_8x16_BUFFER(0," The menu");
OLED_DISPLAY_8x16_BUFFER(2,"key1 MPU6050");
OLED_DISPLAY_8x16_BUFFER(4,"key2 LED Control");
OLED_DISPLAY_8x16_BUFFER(6,"TOUCH_C Return");
MPU6050_Init(); //MPU6050初始化
while(1){
//二A
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
OLED_DISPLAY_CLEAR();
OLED_DISPLAY_8x16_BUFFER(0," MPU6050");
OLED_DISPLAY_8x16_BUFFER(2,"X: X: "); //显示字符串
OLED_DISPLAY_8x16_BUFFER(4,"Y: Y: "); //显示字符串
OLED_DISPLAY_8x16_BUFFER(6,"Z: Z: "); //显示字符串
while(1){
MPU6050_READ(t); //加速度
//其中t[0~2]是加速度ACCEL,t[3~5]是陀螺仪GYRO
OLED_DISPLAY_8x16(2,2*8,t[0]/10000 +0x30);//显示
OLED_DISPLAY_8x16(2,3*8,t[0]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(2,4*8,t[0]%1000/100 +0x30);//
OLED_DISPLAY_8x16(2,5*8,t[0]%100/10 +0x30);//
OLED_DISPLAY_8x16(2,6*8,t[0]%10 +0x30);//
OLED_DISPLAY_8x16(2,11*8,t[3]/10000 +0x30);//显示
OLED_DISPLAY_8x16(2,12*8,t[3]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(2,13*8,t[3]%1000/100 +0x30);//
OLED_DISPLAY_8x16(2,14*8,t[3]%100/10 +0x30);//
OLED_DISPLAY_8x16(2,15*8,t[3]%10 +0x30);//
OLED_DISPLAY_8x16(4,2*8,t[1]/10000 +0x30);//显示
OLED_DISPLAY_8x16(4,3*8,t[1]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(4,4*8,t[1]%1000/100 +0x30);//
OLED_DISPLAY_8x16(4,5*8,t[1]%100/10 +0x30);//
OLED_DISPLAY_8x16(4,6*8,t[1]%10 +0x30);//
OLED_DISPLAY_8x16(4,11*8,t[4]/10000 +0x30);//显示
OLED_DISPLAY_8x16(4,12*8,t[4]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(4,13*8,t[4]%1000/100 +0x30);//
OLED_DISPLAY_8x16(4,14*8,t[4]%100/10 +0x30);//
OLED_DISPLAY_8x16(4,15*8,t[4]%10 +0x30);//
OLED_DISPLAY_8x16(6,2*8,t[2]/10000 +0x30);//显示
OLED_DISPLAY_8x16(6,3*8,t[2]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(6,4*8,t[2]%1000/100 +0x30);//
OLED_DISPLAY_8x16(6,5*8,t[2]%100/10 +0x30);//
OLED_DISPLAY_8x16(6,6*8,t[2]%10 +0x30);//
OLED_DISPLAY_8x16(6,11*8,t[5]/10000 +0x30);//显示
OLED_DISPLAY_8x16(6,12*8,t[5]%10000/1000 +0x30);//显示
OLED_DISPLAY_8x16(6,13*8,t[5]%1000/100 +0x30);//
OLED_DISPLAY_8x16(6,14*8,t[5]%100/10 +0x30);//
OLED_DISPLAY_8x16(6,15*8,t[5]%10 +0x30);//
delay_ms(100); //延时(决定刷新速度)
if(!GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //读按键接口的电平
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //读按键接口的电平
while(!GPIO_ReadInputDataBit(KEYPORT,KEY2)); //等待按键松开
}
break;
}
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读按键接口的电平
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读按键接口的电平
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)); //等待按键松开
}
break;
}
}
while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开
}
}//
//二B
if(!GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //读按键接口的电平
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //读按键接口的电平
OLED_DISPLAY_CLEAR();
OLED_DISPLAY_8x16_BUFFER(0,"LED TOUCH_D");
OLED_DISPLAY_8x16_BUFFER(2,"0 One");
OLED_DISPLAY_8x16_BUFFER(4,"LED1 Long");
OLED_DISPLAY_8x16_BUFFER(6,"LED2 Double");
while(1)
{
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){ //检测按键是否按下
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){//判断长短键
while((!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D))&&c<KEYA_SPEED1){ //循环判断长按,到时跳转
c++;delay_ms(10); //长按判断的计时
}
if(c>=KEYA_SPEED1){ //长键处理
//长按后执行的程序放到此处
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1));//LED控制
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D));
}else{ //单击处理
for(b=0;b<KEYA_SPEED2;b++){//检测双击
delay_ms(20);
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){
a=1;
//双击后执行的程序放到此处
GPIO_WriteBit(LEDPORT,LED2,(BitAction)(1));//LED控制
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D));
}
}
if(a==0){ //判断单击
//单击后执行的程序放到此处
GPIO_WriteBit(LEDPORT,LED1|LED2,(BitAction)(0));//LED控制
}
}
a=0;c=0; //参数清0
}
} //按键判断在此结束
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
delay_ms(20); //延时去抖动
//跳出循环
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开
}
break;
}
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读按键接口的电平
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读按键接口的电平
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)); //等待按键松开
}
break;
}
}
while(!GPIO_ReadInputDataBit(KEYPORT,KEY2)); //等待按键松开
}
}
//返回
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读按键接口的电平
delay_ms(20); //延时去抖动
OLED_DISPLAY_CLEAR();
OLED_DISPLAY_8x16_BUFFER(0," The menu");
OLED_DISPLAY_8x16_BUFFER(2,"key1 MPU6050");
OLED_DISPLAY_8x16_BUFFER(4,"key2 LED Control");
OLED_DISPLAY_8x16_BUFFER(6,"TOUCH_C Return");
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读按键接口的电平
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)); //等待按键松开
}
}
}
}