欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 雙開關的問題,就是搞不清邏輯了~ [打印本頁]

作者: yfpc2006    時間: 2019-2-14 02:40
標題: 雙開關的問題,就是搞不清邏輯了~
某汽車玻璃升降器:
一個單刀雙擲開關,KEY1,KEY2;
兩個輸出點OUT1,OUT2

不按:KEY1=1; KEY2=1;
輕按:KEY1=0; KEY2=1;
重按:KEY1=1; KEY2=0;

輕按到重按,或重按到輕按的切換過程中:KEY1=1; KEY2=1; 至少有幾百毫秒時間。


程序OUT1、OUT2輸出要求:

KEY1=0時,OUT1=1;
KEY2=0時,OUT1=1;OUT2=1;
由輕按到重按過程中,保持:OUT1=1;不能中斷
重按到輕按的過程中,保持:OUT1=1;不能中斷
不按下:OUT1=0;OUT2=0;

搞不清怎么寫邏輯了~

請高手大俠們賜教!


作者: zh123456zh    時間: 2019-2-14 10:31
0 1:1 *  --- ---1 0:1 1--- ---1 1:0 0
作者: znz43a    時間: 2019-2-14 10:45
OUT1=(NOT KEY1) OR (NOT KEY2)
OUT2=NOT KEY2

作者: yzwzfyz    時間: 2019-2-14 11:58
當一種開關組合被確認后,0.2秒內不再承認其它其它組合就可以了。
作者: yfpc2006    時間: 2019-2-14 16:07
yzwzfyz 發表于 2019-2-14 11:58
當一種開關組合被確認后,0.2秒內不再承認其它其它組合就可以了。

并沒有那么簡單,
作者: 凌凈清河    時間: 2019-2-14 21:06
以下為個人愚見。
之所以設計切換過程有雙高電平的短暫狀態,是為了能夠將輕按和重按的事件觸發方式轉換成兩個下降沿中斷來處理。這樣一來,KEY1的下降沿說明為輕按事件,KEY2的下降沿為重按事件。
有了這兩個事件,程序可以分為三個部分,分別是輕按中斷服務函數,重按中斷服務函數和主程序循環。
其中中斷服務函數進行事件處理、狀態轉換,標志位切換等動作,主循環中使用標志位作為判斷依據進行處理。
所以重新敘述要求并處理如下:
當輕按事件發生,置輕按事件發生標志位,同時清空重按事件發生標志位;
當重按事件發生,置重按事件發生標志位,同時清空輕按事件發生標志位。使得兩個事件在主循環看來相互獨立瞬時發生。
在主循環中判斷,按照標志位狀態進行“刷新覆蓋式”輸出,此時OUT1==1的輸出一定不會中斷(因為切換過程中,沒有下降沿,程序保持上一狀態對應輸出刷新動作)。

這樣,我們還需要對松開按鍵進行處理,因為按照描述,切換過程不算松開,所以松開的過程僅僅是輕按(KEY1==0,KEY2==1)到無按下(KEY1==1,KEY2==1)的過程,然而輕按無論到松開還是重按均需要經過雙高電平。
這個過程我沒有想到更好的辦法,只能使用定時器進行固定時長計時,定時時長稍大于模式切換時長,定時開始于輕按事件處理結束,定時結束后根據當前輸入決定是否清空輕按標志位。
作者: yfpc2006    時間: 2019-2-15 03:27
本帖最后由 yfpc2006 于 2019-2-15 13:21 編輯
凌凈清河 發表于 2019-2-14 21:06
以下為個人愚見。
之所以設計切換過程有雙高電平的短暫狀態,是為了能夠將輕按和重按的事件觸發方式轉換成 ...

沒有用中斷,用查詢的方法,能實現,但偶爾還是有些不穩定,看一下還需要優化什么?

u8 KEY1,KEY2,KEY1_F=0,KEY2_F=0,OUT1=0,OUT2=0,i=0;

void Scan_KEY(void)
{
        if(KEY1==1 && KEY2==1 && KEY1_F==0 && KEY2_F==0)
        {
                OUT1=0;
                OUT2=0;
        }
        else if(KEY1==0 && KEY2==1 && KEY1_F==0 && KEY2_F==0)
        {
                OUT1=1;
                OUT2=0;
                KEY1_F=1;
        }
        else if(KEY1==1 && KEY2==1 && KEY1_F==1 && KEY2_F==0)
        {
                for(i=0;i<50;i++)     //根據響應需求進行調節
                {
                        if(KEY2==0)
                        {
                                OUT2=1;
                                KEY2_F=1;
                                KEY1_F=0;
                                break;
                        }
                        delay_ms(10);      //根據響應需求進行調節
                }
                KEY1_F=0;
                OUT1=0;
        }
        else if(KEY2==0)
        {
                OUT1=1;
                OUT2=1;
                KEY2_F=1;
        }
        else if(KEY1==1 && KEY2==1 && KEY1_F==0 && KEY2_F==1)
        {
                OUT1=1;
                OUT2=0;
        }
        else if(KEY1==0 && KEY2==1 && KEY1_F==0 && KEY2_F==1)
        {
                OUT1=1;
                OUT2=0;
                KEY1_F=1;
        }
        else if(KEY1==1 && KEY2==1 && KEY1_F==1 && KEY2_F==1)
        {
                OUT1=0;
                OUT2=0;
                KEY1_F=0;
                KEY2_F=0;
        }
}
作者: 凌凈清河    時間: 2019-2-15 07:46
yfpc2006 發表于 2019-2-15 03:27
沒有用中斷,用查詢的方法,能實現,但偶爾還是有些不穩定,看一下還需要優化什么?

u8 KEY1,KEY2,KE ...

中斷的方法已經是最優解,你的查詢法程序可能存在問題。
按照一個重按并松開的流程,KEY1、2電平變化為:
(KEY1、KEY2)11-01-11-10-11-01-11
根本不會出現同時為0的情況,所以KEY1==0&KEY2==0這條不可能滿足。
況且查詢法消耗的等待延時達到幾百毫秒的話,太長了,建議改為中斷,不然無可“優化”。
作者: 鉆牛尖滴劉尖尖    時間: 2019-2-15 07:59
要優化!不管你是長按還是點按,都要有延時消抖,區別是延時時間不同而己
德飛萊150例有這個案例,壇子里有人發過,下下來看看,能解決你按鍵不穩定之癥!
作者: wulin    時間: 2019-2-15 12:45
yfpc2006 發表于 2019-2-15 03:27
沒有用中斷,用查詢的方法,能實現,但偶爾還是有些不穩定,看一下還需要優化什么?

u8 KEY1,KEY2,KE ...



#include <reg52.h>
#define key_S 5000 //預設延時計數值,根據響應需求進行調節
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;        //延時計數變量               

        if((KEY1==0)&&(KEY2==1))//輕按
        {
                if(++count_1>=key_S)//計數延時
                {
                        count_1=key_S;//防止溢出
                        OUT1=1;
                        OUT2=0;
                        count_2=0;
                }
        }
        else if((KEY1==1)&&(KEY2==0))//重按
        {
                if(++count_2>=key_S)//計數延時
                {
                        count_2=key_S;//防止溢出
                        OUT1=1;
                        OUT2=1;
                        count_1=0;
                }
        }   
        else //松手不按
        {
                OUT1=0;
                OUT2=0;
                count_1=0;
                count_2=0;
        }
}

void main()
{
        OUT1=0;
        OUT2=0;
        while(1)
        {
                Key_Scan();        //按鍵掃描
        }
}


作者: yfpc2006    時間: 2019-2-15 13:20
凌凈清河 發表于 2019-2-15 07:46
中斷的方法已經是最優解,你的查詢法程序可能存在問題。
按照一個重按并松開的流程,KEY1、2電平變化為 ...

我也想用中斷的方式,可惜芯片分配的引腳不支持外部電平變化中斷。
所以只能用查詢的方式。
作者: 凌凈清河    時間: 2019-2-15 15:59
yfpc2006 發表于 2019-2-15 13:20
我也想用中斷的方式,可惜芯片分配的引腳不支持外部電平變化中斷。
所以只能用查詢的方式。

原來是這樣,那祝你好運。
作者: 站著說話不腰疼    時間: 2019-2-15 16:36
yfpc2006 發表于 2019-2-15 13:20
我也想用中斷的方式,可惜芯片分配的引腳不支持外部電平變化中斷。
所以只能用查詢的方式。

用定時中斷作延時,在里面設標識位就行,就不存在引腳分配問題
作者: shuisheng60    時間: 2019-2-15 18:16
yfpc2006 發表于 2019-2-15 13:20
我也想用中斷的方式,可惜芯片分配的引腳不支持外部電平變化中斷。
所以只能用查詢的方式。

要學會用定時器中斷,ADC中斷這些技能做的開關,這樣才是解決你多開關的麻煩
作者: dzbj    時間: 2019-2-15 20:03
你這不是跟VW汽車上的電窗開關一樣么 我寫過整個電窗控制系統 就是3樓說的等待時間即可 不過得用中斷 不能用死循環 不然其它事都干不了

不管你按不按鍵key2 都會經過key1 所以 key1按下并確定后 做一個標記 直接檢測key1釋放或者key2按下即可
作者: 1231877    時間: 2019-2-15 22:59
znz43a 發表于 2019-2-14 10:45
OUT1=(NOT KEY1) OR (NOT KEY2)
OUT2=NOT KEY2

當一種開關組合被確認后,0.2秒內不再承認其它其它組合就可以了
作者: yfpc2006    時間: 2019-2-16 19:48
dzbj 發表于 2019-2-15 20:03
你這不是跟VW汽車上的電窗開關一樣么 我寫過整個電窗控制系統 就是3樓說的等待時間即可 不過得用中斷 不能 ...

我也覺得這個開關是小意思啦,可是實際做起來,不知道是不是自己的能力問題,覺得越做越復雜了。

作者: yfpc2006    時間: 2019-2-16 20:07
wulin 發表于 2019-2-15 12:45
#include
#define key_S 5000 //預設延時計數值,根據響應需求進行調節
sbit KEY1=P2^0;

大哥哥就是厲害,小女子佩服的很!我都懷疑我是不是做這塊的料?

想到這里,我突然想到很久以前一個考試題,和這個開關很像也是一個單刀雙擲開關,一共三個檔位:
第一檔(KEY1==1 && KEY2==1):關機;
第二檔(KEY1==0 && KEY2==1):開風扇;
第三檔(KEY1==1 && KEY2==0):開風扇+音樂;
第四檔(KEY1==0 && KEY2==1):就是退回后的原第二檔,開風扇+音樂+燈光;
第五檔(KEY1==1 && KEY2==1):就是退回后的原第一檔,關機。
我覺得都是不能做到的事情,看到大哥哥的仿真程序和效果,簡直佩服死了!
如果大哥哥把這道題做出來,我會感動死的!
作者: Trump1438    時間: 2019-2-16 21:49
凌凈清河 發表于 2019-2-15 15:59
原來是這樣,那祝你好運。

妹子,妹子,樓主是妹子,別認錯了
作者: yfpc2006    時間: 2019-2-16 22:04
dzbj 發表于 2019-2-15 20:03
你這不是跟VW汽車上的電窗開關一樣么 我寫過整個電窗控制系統 就是3樓說的等待時間即可 不過得用中斷 不能 ...

單刀雙擲(帶關斷)開關,能寫出這幾個開關狀態來?

第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):原第2檔:FLAG=3;
第4檔(K1==1 && K2==1):原第1檔:FLAG=4;

換擋過程(K1==1 && K2==1)。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1