自学51一段时间了,最近在学写温度控制的程序。碰到点问题,请大神指导下
问题是,在用按键设置温度报警值时, 按上、下调节按键,数值变化太快,但是如果加个延时,变化是慢了, 但是数码管(动态扫描的)就显示不均匀了,前2位很暗。
按键部分程序如下:
switch(sezd)
{
case 1:
while(sezd==1)
{ displayabc(1,9,8); //当按下设置按键先显示要设置的项目,用3个字母表示。
if(up==0){ud=1;} //判断上下按键
if(down==0){ud=1;} //判断上下按键
while(ud==1) //当上下按键有动作时
{
delay(100); //100mS , 这里延时是想让上下键按下时数字变化慢一些★★★★★
display(temp); //循环显示设置的 数值★★(上一句延时大了,这里显示亮度不均匀了)
if(up==0)
{delay(10); //消抖
if(up==0)
{
if(temp<300)
temp++;
}
}
if(down==0)
{delay(10); //消抖
if(down==0)
{
if(temp>0)
temp--;
}
}
}
}
break;
数码管显示用定时中断扫描,按键弄成松开按键响应就好了。
改好了。 试了下效果很好。谢谢。
就是当需要显示字母时,需要关闭定时器先,用其他函数显示。显示数字时在打开定时器。有点麻烦。可能我思路有限,大神们可否分享下你们怎么写的 定时中断显示。
另外用来 按键中断的设置键 偶尔会按一下,跳2次。 用于中断的按键消抖应该写在哪里?
定时部分。
void time0() interrupt 1
{ uchar A1,A2,A2t,A3;
TH0=0Xfd;
TL0=0X64;
A1=temp11/100;
A2t=temp11%100;
A2=A2t/10;
A3=A2t%10;
r++;
if(r>2)
{r=0;}
switch(r)
{
case 0:
dula=0;
P0=table[A1]; //显示百位
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
break;
case 1:
dula=0;
P0=table[A2]; //显示十位
dula=1;
dula=0;
wela=0;
P0=0xfd;
wela=1;
wela=0;
break;
case 2:
dula=0;
P0=table[A3]; //显示个位
dula=1;
dula=0;
wela=0;
P0=0xfb;
wela=1;
wela=0;
break;
default:
break;
}
}
主程序部分的按键部分:
switch(sezd)
{
case 1:
while(sezd==1)
{ TR0=0;displayabc(19,16,8); // 此处显示英文时将定时器关闭,用其他函数显示。
//delay(1);
if(up==0){ud=1;}
if(down==0){ud=1;}
while(ud==1)
{
TR0=1; 此处显示数字重新打开定时器 temp11=temp;
delay(100);
// display(temp);
if(up==0)
{delay(10);
if(up==0) //消抖
{
if(temp<300)
temp++;
}
}
if(down==0)
{delay(10);
if(down==0) //消抖
{
if(temp>0)
temp--;
}
}
}
}
break; 本帖最后由 liangben 于 2014-6-30 08:54 编辑