单片机/MCU论坛
直播中

刘玉兰

7年用户 940经验值
私信 关注
[问答]

求助,单片机不同按键控制不同IO口输出驱动三极管遇到难题求解答

4个按键  K1 K2 K3 K4 其中 K1是开启和暂停键(本来想长按开显示短按启动定时器 新手还没这么去编程),K2 K3 K4 按键每个按键下可以选择工作时长:按一下能切 5分钟 10分钟 15分钟  K2对应一个IO口驱动三极管 K3K4都是一样的(工作时长略微不同而已)。 现在遇到的问题点是, 1.K2选好时间档位,我按下K1开关/暂停 键,正常运行倒计时,时间没到00能正常启动/暂停,到00了选其他时间档位就不能正常启动了倒计时。。。2.K2控制的输出IO口置高,然后其他2个输出口为0但是实际编出来的效果是暂停了 K2控制的IO口还是输出高。。。不同按键单独控制一个IO口 暂停时关闭,启动是打开,思路是有,但是C语音编程就是没效果。。。一直查资料2天了没进展,附上 按键和定时器的编码

单片机源程序如下:
void Key_Event_Handle()  
{
                if((K1==0)  (munite_counts!=0))     
                                                {
                                                        DelayMS(10);
                                                        if(K1==0)
                                                        {
                                                                while(!K1);
                                                                ET0=~ET0;
                                                                TR0=~TR0;
                                                        /@@*        if((flag==1)  (TR0==1))
                                                                {
                                                                        flag=0;
                                                                        SONIC=1;
                                                                        HEAT=0;
                                                                        UV=0;
                                                                }
                                                                if((flag1==1)  (TR0==1))
                                                                {
                                                                        flag1=0;
                                                                        SONIC=0;
                                                                        HEAT=1;
                                                                        UV=0;
                                                                }        
                                                                if((flag2==1)  (TR0==1))
                                                                {
                                                                        flag2=0;
                                                                        SONIC=0;
                                                                        HEAT=0;
                                                                        UV=1;
                                                                }        */        
                                                        }        
                                                }
               
                if(K2==0)
                {
                        DelayMS(10);
                                if(K2==0)
                                {
                                 flag=1;
                                        flag1=0;
                                        flag2=0;
                                                K2num++;           
                                                while(!K2);  
                                                K3num=0;
                                                K4num=0;
                                //                ET0=0;
                                        //        TR0=0;

                                                if(K2num==1)
                                                {
                                                        munite_counts=3;
                                                        Second_Counts=0;
                                                }
                                                if(K2num==2)                         //
                                                {
                                                        munite_counts=10;
                                                }
                                                if(K2num==3)                 //
                                                {
                                                        munite_counts=15;
                                                }
                                                if(K2num==4)                 //
                                                {
                                                        munite_counts=20;
                                                }
                                                if(K2num==5)                         //
                                                {
                                                        K2num=0;
                                                        munite_counts=2;
                                                }
                                        }
                                Key_Flag_Idx=0;
                                        i=0;
                        }        
               
                if(K3==0)
                {
                        DelayMS(10);  
                                if(K3==0)
                                {
                                        flag=0;
                                        flag1=1;
                                        flag2=0;
                                                K3num++;         
                                                while(!K3);
                                                K2num=0;
                                                K4num=0;
                                                //ET0=0;
                                                //TR0=0;

                                                if(K3num==1)  
                                                {
                                                        munite_counts=2;
                                                        Second_Counts=0;
                                                }
                                                if(K3num==2)                         //
                                                {
                                                        munite_counts=10;
                                                }
                                                if(K3num==3)                 //
                                                {
                                                        munite_counts=20;
                                                }
                                                if(K3num==4)                         //
                                                {
                                                        munite_counts=30;
                                                }
                                                if(K3num==5)                         //
                                                {
                                                        K3num=0;
                                                        munite_counts=3;
                                                }
                                }
                                Key_Flag_Idx=0;
                                i=0;
                        }
                                
                if(K4==0)
                        {
                        DelayMS(10);
                                if(K4==0)
                                {
                                        flag=0;
                                        flag1=0;
                                        flag2=1;
                                while(!K4);
                                                K2num=0;
                                                K3num=0;
                                //ET0=0;
                                //TR0=0;
                                munite_counts=1;
                                        Second_Counts=0;
                                }
                                Key_Flag_Idx=0;
                                i=0;
                        }
}


void DSY_Refresh() interrupt 1
{
        TH0=(65536-5000)/256;
        TL0=(65536-5000)%256;
        i++;
        if(i==2)  
        {
                i=0;
                Second_Counts++;                        
                if(Second_Counts==60)
                {
                        Second_Counts=0;
                        munite_counts--;
                        if(munite_counts==0)
                        {
                                TR0=0;
                        }
                }
        }
}

回帖(1)

梁宏满

2023-10-8 09:27:56
觉得你的逻辑有问题,在按键处理完后只是修改了状态特征变量,并没有进行相应的 开始、暂停处理
此外你的编程习惯很不好,全是全局变量,连一个i都是全局变量,这样很容易跑飞程序的
举报

更多回帖

发帖
×
20
完善资料,
赚取积分