p2.0,p2.1,p2.2,p2.3分别是设置,加,减,开始4个独立按键功能是:按设置键一次后后,显示设置界面,再按设置键后,光标在35,上限处闪烁,此时,加减键功能可用,可调节上限值。再按设置键后,光标置于25,下限处闪烁,此时加减键功能可用,可调节下限值,再按设置键时,完成设置,光标退出。此时再按开始键,程序开始采集实时压力。
想法:在设置时,可以按开始键开始采集,在采集过程中,如果想修改压力上下限,也可以按设置键进入设置界面进行设置。
我的程序如下,不知道有没有问题?效果总是不如意
void keyscan() //按键扫描
{
uchar i;
uint volt,p;
/* 以下是设置键按下功能*/
if(key_set==0) //设置键按下
{
delay(10); //消抖
if(key_set==0) //设置键确认按下
{
flag++; //记录设置键次数
break1=1;//设置键按下,break1置1
if(break1==1)
{
if(flag==1)//第一次按下功能键进入设置界面
{
lcd_wcmd(0x01); //清除LCD的显示内容
delay(10);
lcd_pos(0,1);
i = 0;
while(dis5
!= ' ')
{
lcd_wdat(dis5); //显示设置压力范围
i++;
}
lcd_pos(1,2);
i = 0;
while(tab1 != ' ')
{
lcd_wdat(tab1); //显示高阈值初始值
i++;
}
lcd_pos(2,2);
i = 0;
while(tab2 != ' ')
{
lcd_wdat(tab2); //显示低阈值初始值
i++;
}
}
if(flag==2) //第二次按下设置键,低阈值位闪烁
{
lcd_pos(3,2);
i = 0;
while(dis11 != ' ')
{
lcd_wdat(dis11); //显示设置完成
i++;
}
lcd_wcmd (0x93); //光标定位低阈值35位置
lcd_wcmd (0x0f); //光标开始闪烁
}
if(flag==3) //第三次按下设置键,高阈值位闪烁
{
lcd_pos(3,2);
i = 0;
while(dis11 != ' ')
{
lcd_wdat(dis11); //显示设置完成
i++;
}
lcd_wcmd (0x8b); //光标定位高阈值25位置
lcd_wcmd (0x0f); //光标开始闪烁
}
if(flag==4) //第四次按下设置键,不闪烁,标记位置1
{
lcd_wcmd(0x0c); //取消光标闪烁
flag=1;//记录变成1
lcd_pos(3,2);
i = 0;
while(dis10 != ' ')
{
lcd_wdat(dis10); //显示设置完成
i++;
}
//if(key_start=0)
// {break1=-1;}
}
}//与if break1!=-1对应
//while(key_set!=0); //释放按键
while(!key_set); //释放按键
delay(20);
while(!key_set); //释放按键
}
}
/* 以下是增加键按下功能*/
if(flag!=0)
{
if(key_up==0) //只有设置键按下后,增大和减少键才有效
{
delay(10);
if(key_up==0) //确认增加按键按下
{
//while(key_up!=0); //释放按键
if(flag==2) //设置键第2次按下调节
{
phigh++;
if (phigh==51)
{
phigh=05;
}
tab1[2]=phigh/10+0x30;
tab1[3]=phigh%10+0x30;
lcd_pos(1,2); //显示阈值高位
i = 0;
while(tab1 != ' ')
{
lcd_wdat(tab1); //显示字符
i++;
}
lcd_wcmd (0x93); //光标定位高阈值35位置
lcd_wcmd (0x0f); //光标开始闪烁
}
if(flag==3) //设置键第3次按下调节
{
plow++;
if (plow==51)
{
plow=05;
}
tab2[2]=plow/10+0x30;
tab2[3]=plow%10+0x30;
lcd_pos(2,2); //显示阈值高位
i = 0;
while(tab2 != ' ')
{
lcd_wdat(tab2); //显示字符
i++;
}
lcd_wcmd (0x8b); //光标定位高阈值35位置
lcd_wcmd (0x0f); //光标开始闪烁
}
//以上设置键第3次按下调节
while(!key_up); //释放按键
delay(10);
while(!key_up); //释放按键
}
}
}
/* 以下是减小键按下功能*/
if(flag!=0)
{
if(key_down==0)
{
delay(10);
if(key_down==0) //确认减少键被按下
{
//while(key_down!=0); //按键释放
if(flag==2) //设置键第2次按下调节
{
phigh--;
if (phigh==04)
{
phigh=50;
}
tab1[2]=phigh/10+0x30;
tab1[3]=phigh%10+0x30;
lcd_pos(1,2); //显示阈值高位
i = 0;
while(tab1 != ' ')
{
lcd_wdat(tab1); //显示字符
i++;
}
lcd_wcmd (0x93); //光标定位低阈值25位置
lcd_wcmd (0x0f); //光标开始闪烁
}
if(flag==3) //设置键第3次按下调节
{
plow--;
if (plow==04)
{
plow=50;
}
tab2[2]=plow/10+0x30;
tab2[3]=plow%10+0x30;
lcd_pos(2,2); //显示阈值高位
i = 0;
while(tab2 != ' ')
{
lcd_wdat(tab2); //显示字符
i++;
}
lcd_wcmd (0x8b); //光标定位高阈值35位置
lcd_wcmd (0x0f); //光标开始闪烁
}
while(!key_down); //释放按键
delay(10);
while(!key_down); //释放按键
}
}
}
/* 以下是确定键按下功能*/
if(key_start==0) //确认调节
{
delay(5);
if(key_start==0)
{
while(key_start!=0); //释放按键
flag=0; //设置键按键次数清零
// lcd_wcmd(0x0c); //取消光标闪烁
lcd_wcmd(0x01); //清除LCD的显示内容
break1=-1;//开始键按下,break1置-1
flag=0;
}
}
}//按键扫描函数的括号
下面是界面显示,供各位大神直观感受。
感谢各位大神留言指导,小弟万分感谢
我也觉得程序结构有问题,但是不知道如何下手,你可以帮我改个框架吗?
首先把各个模块程序写好,在主程序里调用。特别是按键扫描模块,最好不要在里面写其他不必要的判断功能,只要判断对应开关是否按下或双击等等即可。让主程序来决定开关的工作状态。
一,unsigned char key_scan(void),按键扫描,返回是否有按键按下,并返回按键值,比如返回0xff为无按键按下,0x01为设置键等等。
二,manual_0(),第一个菜单函数,如设置上限值。
三,manual_1(),第二个菜单函数,如设置下限值。
四,manual_2(),第三个菜单函数,如开始采样。
五,设置一个菜单编号,主程序根据菜单编号调用相应的菜单函数。
在每个菜单函数里调用按键扫描函数,并根据返回值进行对应的操作。
好复杂,会不会我的设计会越来越复杂,
更加不会了,求指导
一周热门 更多>