[讨论] 请教个C编程问题

liangben   2014-6-29 10:05 楼主
自学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;

回复评论 (3)

数码管显示用定时中断扫描,按键弄成松开按键响应就好了。
点赞  2014-6-29 11:12
把按键处理和LED显示分开写
点赞  2014-6-29 23:16
改好了。 试了下效果很好。谢谢。 就是当需要显示字母时,需要关闭定时器先,用其他函数显示。显示数字时在打开定时器。有点麻烦。可能我思路有限,大神们可否分享下你们怎么写的 定时中断显示。 另外用来 按键中断的设置键 偶尔会按一下,跳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 编辑
点赞  2014-6-30 08:50
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复