请教单片机按键跟ad问题
void main()
{
delay(10); //延时
lcd_init(); //液晶初始化
begindisplay();//开机显示界面
while(1)
{
keyscan(); //按键扫描
ad_start(); //开启ad采集
}
}
我在keyscan()里是有设置界面显示的,跟上面一样写的话,开机显示界面的文字就被后面界面文字覆盖了,不明白问题在哪里了
第三按键判断改成这样,增加一个全局变量,unsigned char key_3_on = 0,
if(key_ok==0) //确认调节
{ delay(5);
if(key_ok==0)
{
while(key_ok!=0); //释放按键
flag=0; //设置键按键次数清零
key_3_on = 1;
}
}
主程序改成这样,
void main()
{
delay(10); //延时
lcd_init(); //液晶初始化
begindisplay();//开机显示界面
while(1)
{
keyscan(); //按键扫描
if(key_3_on == 1)ad_start(); //开启ad采集
}
}
这样试试吧
根据你的操作流程,ad采集程序应该放在按键扫描函数的后面,但是应该增加一个是否是第三个键按下的判断,是则启动ad采集程序
第三个键按下的判断有的哦
if(key_ok==0) //确认调节
{ delay(5);
if(key_ok==0)
{
while(key_ok!=0); //释放按键
flag=0; //设置键按键次数清零
// lcd_wcmd(0x0c); //取消光标闪烁
while(1)
{
start_ad();
}
}
}
这样一个while里,按了这个键,其他键就没反应了。比如已经才采集了,再想改上下限,按其他键没用了,这要怎么办?请指教
程序不完整,不知道你的第三个键按下的判断在哪个程序里,另外这个
while(1)
{
start_ad();
}
执行后就是死循环了,只会不停的执行start_ad(); ,你的思路和程序结构有问题,while不能随便用,特别是while(1)
第三个键按下的判断程序应该跟加减键的keyscan()程序分开吗?可不可以私聊你,给我个联系方式哈!
我知道有问题,就是这里想不出问题在哪里,麻烦指导我一下
我知道有问题,就是这里想不出问题在哪里,麻烦指导我一下
我知道有问题,就是这里想不出问题在哪里,麻烦指导我一下
while(1)
{
start_ad();
}
把while(1)去掉,只保留start_ad(); 试试
这样可以的,但是采集不能连续了
感谢啊,好像可以了,厉害了~~我再试试其他功能~
怎么写判断采集到的压力值与压力设置的上下限阈值比较的程序,我的如下,就是运行不出来,急救~
#include<reg52.h>
#include<intrins.h>
#include<string.h>
#define uint unsigned int
#define uchar unsigned char
uint bai,shi,ge,fen,pbai,pshi,pge,pfen;
uint flag;
uchar i;
uchar break1=1;//全局变量,开始键按下后,置-1
uint p;
uint p1,p2; //用于判断压力高低用,p1上限,p2下限
sbit lcdrs=P3^5;
sbit lcdrw=P3^6;
sbit lcden=P3^4;
uchar code dis1[] = {"欢迎使用"};
uchar code dis2[] = {"压力系统"};
uchar code dis3[] = {"设置"};
uchar code dis4[] = {"开始"};
uchar code dis5[] ={"设置压力范围"};
uchar code dis6[]={"当前压力"};
uchar code dis7[]={"压力高,放气中.."};
uchar code dis8[]={"压力低,充气中.."};
//uchar code dis9[]={"v"};
//uchar code dis10[]={"cmH2O"};
uchar code dis9[]={"压力正常"};
uchar code dis10[]={"设置完成"};
uchar code dis11[]={"设置中.."};
uchar code pressure[]={"0123456789"};
uchar tab1[] ={"H:35cmH2O"}; //上域
uchar tab2[] ={"L:25cmH2O"}; //下域
uchar tab3[11] ={"电压:0.000v"}; //当前电压值
uchar tab4[14] ={"压力:0000cmH2O"}; //当前压力值
uint yuzhi[3]={35,25,00};//存放阈值数组
void main()
{
delay(10); //延时
wela=0; //屏蔽数码管位选
dula=0; //屏蔽数码管段选
lcd_init();
begin();
while(1)
{
keyscan(); //按键扫描
if (break1==-1)
{
display();
p1=10*tab1[2]+tab1[3];
p2=10*tab2[2]+tab2[3];
if(p2<p<p1)
{
lcd_pos(3,0);
i = 0;
while(dis9 != '\0')
{
lcd_wdat(dis9); //压力高,放气中提示
i++;
}
}
if (p>p1)
{
lcd_pos(3,0);
i = 0;
while(dis7 != '\0')
{
lcd_wdat(dis7); //压力高,放气中提示
i++;
}
}
if (p<p2)
{
lcd_pos(3,0);
i = 0;
while(dis8 != '\0')
{
lcd_wdat(dis8); //压力低,充气中提示
i++;
}
}
}//if后括号
}
}
void keyscan() //按键扫描
{
uchar i;
uint volt,p;
/* 以下是设置键按下功能*/
if(key_set==0) //设置键按下
{
delay(10); //消抖
if(key_set==0) //设置键确认按下
{
flag++; //记录设置键按下次0
if(break1!=-1)
{
if(flag==1)//第一次按下功能键进入设置界面
{
lcd_wcmd(0x01); //清除LCD的显示内容
delay(10);
lcd_pos(0,1);
i = 0;
while(dis5 != '\0')
{
lcd_wdat(dis5); //显示设置压力范围
i++;
}
lcd_pos(1,2);
i = 0;
while(tab1 != '\0')
{
lcd_wdat(tab1); //显示高阈值初始值
i++;
}
lcd_pos(2,2);
i = 0;
while(tab2 != '\0')
{
lcd_wdat(tab2); //显示低阈值初始值
i++;
}
}
if(flag==2) //第二次按下设置键,低阈值位闪烁
{
lcd_pos(3,2);
i = 0;
while(dis11 != '\0')
{
lcd_wdat(dis11); //显示设置完成
i++;
}
lcd_wcmd (0x93); //光标定位低阈值35位置
lcd_wcmd (0x0f); //光标开始闪烁
}
if(flag==3) //第三次按下设置键,高阈值位闪烁
{
lcd_pos(3,2);
i = 0;
while(dis11 != '\0')
{
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 != '\0')
{
lcd_wdat(dis10); //显示设置完成
i++;
}
}
}//与if break1!=-1对应
//while(key_set!=0); //释放按键
while(!key_set); //释放按键
delay(10);
while(!key_set); //释放按键
}
}
/* 以下是增加键按下功能*/
if(flag!=0)
{
if(key_up==0) //只有设置键按下后,增大和减少键才有效
{
delay(10);
if(key_up==0) //确认增加按键按下
{
//while(key_up!=0); //释放按键
if(flag==2) //设置键第2次按下调节
{
yuzhi[0]++;
if (yuzhi[0]==100)
{
yuzhi[0]=01;
}
tab1[2]=yuzhi[0]/10+0x30;
tab1[3]=yuzhi[0]%10+0x30;
lcd_pos(1,2); //显示阈值高位
i = 0;
while(tab1 != '\0')
{
lcd_wdat(tab1); //显示字符
i++;
}
lcd_wcmd (0x93); //光标定位高阈值35位置
lcd_wcmd (0x0f); //光标开始闪烁
}
if(flag==3) //设置键第3次按下调节
{
yuzhi[1]++;
if (yuzhi[1]==100)
{
yuzhi[1]=01;
}
tab2[2]=yuzhi[1]/10+0x30;
tab2[3]=yuzhi[1]%10+0x30;
lcd_pos(2,2); //显示阈值高位
i = 0;
while(tab2 != '\0')
{
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次按下调节
{
yuzhi[0]--;
if (yuzhi[0]==00)
{
yuzhi[0]=99;
}
tab1[2]=yuzhi[0]/10+0x30;
tab1[3]=yuzhi[0]%10+0x30;
lcd_pos(1,2); //显示阈值高位
i = 0;
while(tab1 != '\0')
{
lcd_wdat(tab1); //显示字符
i++;
}
lcd_wcmd (0x93); //光标定位低阈值25位置
lcd_wcmd (0x0f); //光标开始闪烁
}
if(flag==3) //设置键第3次按下调节
{
yuzhi[1]--;
if (yuzhi[1]==00)
{
yuzhi[1]=99;
}
tab2[2]=yuzhi[1]/10+0x30;
tab2[3]=yuzhi[1]%10+0x30;
lcd_pos(2,2); //显示阈值高位
i = 0;
while(tab2 != '\0')
{
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;
}
}
}//按键扫描函数的括号
/*********************************************************/
/* */
/* 采集数据显示程序 */
/* */
/*********************************************************/
void display()
{
uint volt;
start_ad();
volt=read_ad();//ad采集存入volt
volt=(uint)((volt*5.0*1000)/256);
bai = volt/1000;//电压百位
shi = volt/100%10;//电压十位
ge = volt/10%10;//电压个位
fen = volt%10;//电压分位
p = 1000*bai+100*shi+10*ge+fen-273;
p=p/9;
p=p/0.98;
//p=(volt-0.2)/0.09; //读取的电压值转化为气压值,单位kpa
//p=p/0.098; //气压值单位转换为cmH20
pbai=p/1000;//压力百位
pshi=p/100%10;//压力十位
pge=p/10%10;//压力个位
pfen=p%10;//压力分位
tab3[5]=bai+0x30;
tab3[7]=shi+0x30;
tab3[8]=ge+0x30;
tab3[9]=fen+0x30;
lcd_wcmd(0x82);
i = 0;
while(dis6 != '\0')
{
lcd_wdat(dis6); //显示当前压力
i++;
}
lcd_wcmd(0x90);
for(i=0;i<11;i++)
{
lcd_wdat(tab3); //显示电压值
}
tab4[5]=pbai+0x30;
tab4[6]=pshi+0x30;
tab4[7]=pge+0x30;
tab4[8]=pfen+0x30;
//p=10*pge+pfen;//把当前压力值赋给p
//p=10*pressure[pge]+pressure[pfen];//把当前压力值赋给p
lcd_wcmd(0x88);
for(i=0;i<14;i++)
{
lcd_wdat(tab4); //显示压力值
}
}
怎么写判断采集到的压力值与压力设置的上下限阈值比较的程序,我的如下,就是运行不出来,急救~
#include<reg52.h>
#include<intrins.h>
#include<string.h>
#define uint unsigned int
#define uchar unsigned char
uint bai,shi,ge,fen,pbai,pshi,pge,pfen;
uint flag;
uchar i;
uchar break1=1;//全局变量,开始键按下后,置-1
uint p;
uint p1,p2; //用于判断压力高低用,p1上限,p2下限
sbit lcdrs=P3^5;
sbit lcdrw=P3^6;
sbit lcden=P3^4;
uchar code dis1[] = {"欢迎使用"};
uchar code dis2[] = {"压力系统"};
uchar code dis3[] = {"设置"};
uchar code dis4[] = {"开始"};
uchar code dis5[] ={"设置压力范围"};
uchar code dis6[]={"当前压力"};
uchar code dis7[]={"压力高,放气中.."};
uchar code dis8[]={"压力低,充气中.."};
//uchar code dis9[]={"v"};
//uchar code dis10[]={"cmH2O"};
uchar code dis9[]={"压力正常"};
uchar code dis10[]={"设置完成"};
uchar code dis11[]={"设置中.."};
uchar code pressure[]={"0123456789"};
uchar tab1[] ={"H:35cmH2O"}; //上域
uchar tab2[] ={"L:25cmH2O"}; //下域
uchar tab3[11] ={"电压:0.000v"}; //当前电压值
uchar tab4[14] ={"压力:0000cmH2O"}; //当前压力值
uint yuzhi[3]={35,25,00};//存放阈值数组
void main()
{
delay(10); //延时
wela=0; //屏蔽数码管位选
dula=0; //屏蔽数码管段选
lcd_init();
begin();
while(1)
{
keyscan(); //按键扫描
if (break1==-1)
{
display();
p1=10*tab1[2]+tab1[3];
p2=10*tab2[2]+tab2[3];
if(p2<p<p1)
{
lcd_pos(3,0);
i = 0;
while(dis9 != '\0')
{
lcd_wdat(dis9); //压力高,放气中提示
i++;
}
}
if (p>p1)
{
lcd_pos(3,0);
i = 0;
while(dis7 != '\0')
{
lcd_wdat(dis7); //压力高,放气中提示
i++;
}
}
if (p<p2)
{
lcd_pos(3,0);
i = 0;
while(dis8 != '\0')
{
lcd_wdat(dis8); //压力低,充气中提示
i++;
}
}
}//if后括号
}
}
void keyscan() //按键扫描
{
uchar i;
uint volt,p;
/* 以下是设置键按下功能*/
if(key_set==0) //设置键按下
{
delay(10); //消抖
if(key_set==0) //设置键确认按下
{
flag++; //记录设置键按下次0
if(break1!=-1)
{
if(flag==1)//第一次按下功能键进入设置界面
{
lcd_wcmd(0x01); //清除LCD的显示内容
delay(10);
lcd_pos(0,1);
i = 0;
while(dis5 != '\0')
{
lcd_wdat(dis5); //显示设置压力范围
i++;
}
lcd_pos(1,2);
i = 0;
while(tab1 != '\0')
{
lcd_wdat(tab1); //显示高阈值初始值
i++;
}
lcd_pos(2,2);
i = 0;
while(tab2 != '\0')
{
lcd_wdat(tab2); //显示低阈值初始值
i++;
}
}
if(flag==2) //第二次按下设置键,低阈值位闪烁
{
lcd_pos(3,2);
i = 0;
while(dis11 != '\0')
{
lcd_wdat(dis11); //显示设置完成
i++;
}
lcd_wcmd (0x93); //光标定位低阈值35位置
lcd_wcmd (0x0f); //光标开始闪烁
}
if(flag==3) //第三次按下设置键,高阈值位闪烁
{
lcd_pos(3,2);
i = 0;
while(dis11 != '\0')
{
lcd_wdat(dis11); //显示设置完成
i++;
}
lcd_wcmd (0x8b); //光标定位高阈值25位置
lcd_wcmd (0x0f); //光标开始闪烁