找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2143|回复: 10
收起左侧

用C语言能把一个单刀双掷(带关断)开关,写出5个开关状态来?

  [复制链接]
ID:138119 发表于 2019-2-16 22:42 | 显示全部楼层 |阅读模式
本帖最后由 yfpc2006 于 2019-2-16 22:44 编辑

用C语言能把一个单刀双掷(带关断)开关,写出5个开关状态来?


第0档(K1==1 && K2==1):FLAG=0;
第1档(K1==0 && K2==1):FLAG=1;
第2档(K1==1 && K2==0):FLAG=2;
第3档(K1==0 && K2==1):原第1档:FLAG=3;
第4档(K1==1 && K2==1):原第0档:FLAG=4;


换挡过程(K1==1 && K2==1)。


请大哥哥、大姐姐们帮忙!

回复

使用道具 举报

ID:474670 发表于 2019-2-17 04:39 | 显示全部楼层
很简单的事,用定时中断在标识位就好,再努一把力就好了
回复

使用道具 举报

ID:474670 发表于 2019-2-17 04:43 | 显示全部楼层
这里有一份义隆的定时长按与短按代码,多看看http://www.51hei.com/bbs/dpj-146093-1.html

评分

参与人数 1黑币 +10 收起 理由
春风十里吹死你 + 10 很给力!

查看全部评分

回复

使用道具 举报

ID:303383 发表于 2019-2-17 09:20 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:213173 发表于 2019-2-18 07:34 | 显示全部楼层
你所描述的5种状态其实就是3种状态的往复:0-1-2-1-0,在你上一个贴子我给你的程序基础上加一条判断语句就可以解决换挡过程短暂 K1=1与K2=1引起的不稳定。请仔细看我的注释以便理解程序。
#include <reg52.h>
#define key_S 5000        //预设延时计数值,12M晶振约230ms(根据响应需求进行调节)
                                  //如果需要精确延时就要使用定时器。
sbit KEY1=P2^0;
sbit KEY2=P2^1;
sbit OUT1=P3^0;
sbit OUT2=P3^1;

void Key_Scan()//按键扫描程序
{
        static unsigned int count_1=0,count_2=0,count_3=0;//延时计数变量               
        
        if((KEY1==0)&&(KEY2==1))//轻按 状态1
        {
                if(++count_1>=key_S)//计数延时
                {
                        count_1=key_S;//防止溢出
                        OUT1=1;
                        OUT2=0;
                        count_2=0;                //count_2清0
                        count_3=0;                //count_3清0
                }
        }
        else if((KEY1==1)&&(KEY2==0))//重按 状态2
        {
                if(++count_2>=key_S)//计数延时
                {
                        count_2=key_S;//防止溢出
                        OUT1=1;
                        OUT2=1;
                        count_1=0;                //count_1清0
                        count_3=0;                //count_3清0
                }
        }   
        else //松手或不按   状态0
        {
                if(++count_3>=key_S)//计数延时
                {
                        count_3=key_S;//防止溢出
                        OUT1=0;
                        OUT2=0;
                        count_1=0;                //count_1清0
                        count_2=0;                //count_2清0
                }
        }
}

void main()
{
        OUT1=0;//初始化输出1端口
        OUT2=0;//初始化输出2端口
        while(1)
        {
                Key_Scan(); //按键扫描
        }
}
回复

使用道具 举报

ID:158375 发表于 2019-2-18 13:05 | 显示全部楼层
楼主把简单的问题复杂化了,按你说的:
第0档(K1==1 && K2==1):FLAG=0;     能从FLAG=1来; 能从FLAG=2来;
第1档(K1==0 && K2==1):FLAG=1;     只能从FLAG=0来;
第2档(K1==1 && K2==0):FLAG=2;     只能从FLAG=0来;

只有三个状态;
回复

使用道具 举报

ID:138119 发表于 2019-2-18 18:44 | 显示全部楼层
#include <reg52.h>
#define key_S 5000
sbit KEY1=P2^0;
sbit KEY2=P2^1;


sbit OUT1=P3^5;
sbit OUT2=P3^6;
sbit OUT3=P3^7;
sbit OUT4=P3^4;

#define num 2000 //预设延时计数值,根据响应需求进行调节

#define OUT_RL_bit  OUT1
#define OUT_LED_bit OUT2

unsigned int FLAG1_bit=0,FLAG2_bit=0,a1=0,a2=0,a3=0,a4=0;


//延时函数
void delay_ms(unsigned int n)
{
        unsigned int j;
        unsigned char k;
        for(j=0;j<n;j++)
                for(k= 110;k>0;k--);
                        //NOP();
}

void Key_Scan()
{
        if(KEY1==0 && KEY2==1 && FLAG1_bit==0 && FLAG2_bit==0)
        {
                if(++a1 >= num)
                {
                        a1=num;
                        OUT1=0;
                        OUT2=1;
                        OUT3=1;
                        OUT4=1;
                        FLAG1_bit=1;
                        FLAG2_bit=0;
                        a1=0;
                        a2=0;
                        a3=0;
                        a4=0;
                }

        }
       
        else if(KEY1==1 && KEY2==0 && FLAG1_bit==1 && FLAG2_bit==0)
        {
                if(++a2 >= num)
                {
                        a2=num;
                        OUT1=1;
                        OUT2=0;
                        OUT3=1;
                        OUT4=1;
                        FLAG1_bit=0;
                        FLAG2_bit=1;
                        a1=0;
                        a2=0;
                        a3=0;
                        a4=0;
                }
        }
        else if(KEY1==0 && KEY2==1 && FLAG1_bit==0 && FLAG2_bit==1)
        {
                if(++a3 >= num)
                {
                        a3=num;
                        OUT1=1;
                        OUT2=1;
                        OUT3=0;
                        OUT4=1;
                        FLAG1_bit=1;
                        FLAG2_bit=0;
                        a1=0;
                        a2=0;
                        a3=0;
                        a4=0;
                }
        }
        else if(KEY1==1 && KEY2==1 && FLAG1_bit==1 && FLAG2_bit==0)
        {
                if(++a4 >= num)
                {
                        a4=num;
                        OUT1=1;
                        OUT2=1;
                        OUT3=1;
                        OUT4=0;
                        FLAG1_bit=0;
                        FLAG1_bit=0;
                        a1=0;
                        a2=0;
                        a3=0;
                        a4=0;
                }
        }
        else
        {
                a1=0;
                a2=0;
                a3=0;
                a4=0;
        }
}


void main()
{
        while(1)
        {
                Key_Scan();        //按键扫描
        }
}
回复

使用道具 举报

ID:138119 发表于 2019-2-18 18:45 | 显示全部楼层
wulin 发表于 2019-2-18 07:34
你所描述的5种状态其实就是3种状态的往复:0-1-2-1-0,在你上一个贴子我给你的程序基础上加一条判断语句就 ...

再一次谢谢大哥哥的帮助!~
在您的基础上,我也做了一个,小有成就感!
么么哒~
回复

使用道具 举报

ID:213173 发表于 2019-2-18 19:59 | 显示全部楼层
yfpc2006 发表于 2019-2-18 18:45
再一次谢谢大哥哥的帮助!~
在您的基础上,我也做了一个,小有成就感!
么么哒~

                if(++a1 >= num)
                {
                        a1=num;
                        OUT1=0;
                        OUT2=1;
                        OUT3=1;
                        OUT4=1;
                        FLAG1_bit=1;
                        FLAG2_bit=0;
                        a1=0;//有添足之嫌,下同。
                        a2=0;
                        a3=0;
                        a4=0;
                }
回复

使用道具 举报

ID:471889 发表于 2019-2-18 23:25 | 显示全部楼层
好事多磨啊!再加油!

评分

参与人数 1黑币 +10 收起 理由
static + 10

查看全部评分

回复

使用道具 举报

ID:478073 发表于 2019-2-19 13:45 | 显示全部楼层
哪个,顶起先,看楼主是否还有好的方法分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表