久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4374|回復: 20
打印 上一主題 下一主題
收起左側

雙開關的問題,就是搞不清邏輯了~

  [復制鏈接]
跳轉到指定樓層
樓主
某汽車玻璃升降器:
一個單刀雙擲開關,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;

搞不清怎么寫邏輯了~

請高手大俠們賜教!

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:433992 發表于 2019-2-14 10:31 來自手機 | 只看該作者
0 1:1 *  --- ---1 0:1 1--- ---1 1:0 0
回復

使用道具 舉報

板凳
ID:378182 發表于 2019-2-14 10:45 | 只看該作者
OUT1=(NOT KEY1) OR (NOT KEY2)
OUT2=NOT KEY2
回復

使用道具 舉報

地板
ID:123289 發表于 2019-2-14 11:58 | 只看該作者
當一種開關組合被確認后,0.2秒內不再承認其它其它組合就可以了。
回復

使用道具 舉報

5#
ID:138119 發表于 2019-2-14 16:07 | 只看該作者
yzwzfyz 發表于 2019-2-14 11:58
當一種開關組合被確認后,0.2秒內不再承認其它其它組合就可以了。

并沒有那么簡單,
回復

使用道具 舉報

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

這樣,我們還需要對松開按鍵進行處理,因為按照描述,切換過程不算松開,所以松開的過程僅僅是輕按(KEY1==0,KEY2==1)到無按下(KEY1==1,KEY2==1)的過程,然而輕按無論到松開還是重按均需要經過雙高電平。
這個過程我沒有想到更好的辦法,只能使用定時器進行固定時長計時,定時時長稍大于模式切換時長,定時開始于輕按事件處理結束,定時結束后根據當前輸入決定是否清空輕按標志位。

評分

參與人數 2黑幣 +102 收起 理由
yfpc2006 + 12 很給力!
admin + 90 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

7#
ID:138119 發表于 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;
        }
}

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:362076 發表于 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這條不可能滿足。
況且查詢法消耗的等待延時達到幾百毫秒的話,太長了,建議改為中斷,不然無可“優化”。
回復

使用道具 舉報

9#
ID:474232 發表于 2019-2-15 07:59 | 只看該作者
要優化!不管你是長按還是點按,都要有延時消抖,區別是延時時間不同而己
德飛萊150例有這個案例,壇子里有人發過,下下來看看,能解決你按鍵不穩定之癥!

評分

參與人數 2黑幣 +20 收起 理由
static + 5 贊一個!
sheng7533967 + 15 很給力!

查看全部評分

回復

使用道具 舉報

10#
ID:213173 發表于 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();        //按鍵掃描
        }
}

評分

參與人數 1黑幣 +12 收起 理由
yfpc2006 + 12 很給力!

查看全部評分

回復

使用道具 舉報

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

我也想用中斷的方式,可惜芯片分配的引腳不支持外部電平變化中斷。
所以只能用查詢的方式。
回復

使用道具 舉報

12#
ID:362076 發表于 2019-2-15 15:59 | 只看該作者
yfpc2006 發表于 2019-2-15 13:20
我也想用中斷的方式,可惜芯片分配的引腳不支持外部電平變化中斷。
所以只能用查詢的方式。

原來是這樣,那祝你好運
回復

使用道具 舉報

13#
ID:474670 發表于 2019-2-15 16:36 | 只看該作者
yfpc2006 發表于 2019-2-15 13:20
我也想用中斷的方式,可惜芯片分配的引腳不支持外部電平變化中斷。
所以只能用查詢的方式。

用定時中斷作延時,在里面設標識位就行,就不存在引腳分配問題
回復

使用道具 舉報

14#
ID:472242 發表于 2019-2-15 18:16 | 只看該作者
yfpc2006 發表于 2019-2-15 13:20
我也想用中斷的方式,可惜芯片分配的引腳不支持外部電平變化中斷。
所以只能用查詢的方式。

要學會用定時器中斷,ADC中斷這些技能做的開關,這樣才是解決你多開關的麻煩
回復

使用道具 舉報

15#
ID:47286 發表于 2019-2-15 20:03 | 只看該作者
你這不是跟VW汽車上的電窗開關一樣么 我寫過整個電窗控制系統 就是3樓說的等待時間即可 不過得用中斷 不能用死循環 不然其它事都干不了

不管你按不按鍵key2 都會經過key1 所以 key1按下并確定后 做一個標記 直接檢測key1釋放或者key2按下即可
回復

使用道具 舉報

16#
ID:476799 發表于 2019-2-15 22:59 | 只看該作者
znz43a 發表于 2019-2-14 10:45
OUT1=(NOT KEY1) OR (NOT KEY2)
OUT2=NOT KEY2

當一種開關組合被確認后,0.2秒內不再承認其它其它組合就可以了
回復

使用道具 舉報

17#
ID:138119 發表于 2019-2-16 19:48 | 只看該作者
dzbj 發表于 2019-2-15 20:03
你這不是跟VW汽車上的電窗開關一樣么 我寫過整個電窗控制系統 就是3樓說的等待時間即可 不過得用中斷 不能 ...

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

使用道具 舉報

18#
ID:138119 發表于 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):就是退回后的原第一檔,關機。
我覺得都是不能做到的事情,看到大哥哥的仿真程序和效果,簡直佩服死了!
如果大哥哥把這道題做出來,我會感動死的!
回復

使用道具 舉報

19#
ID:472325 發表于 2019-2-16 21:49 | 只看該作者
凌凈清河 發表于 2019-2-15 15:59
原來是這樣,那祝你好運。

妹子,妹子,樓主是妹子,別認錯了

評分

參與人數 1黑幣 +16 收起 理由
找人PK + 16

查看全部評分

回復

使用道具 舉報

20#
ID:138119 發表于 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)。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久成人网 | 凹凸日日摸日日碰夜夜 | 久久久久久久久久久91 | 国产美女特级嫩嫩嫩bbb片 | 亚洲一区二区三区在线免费 | 日韩乱码在线 | 亚洲网站在线观看 | av综合站| 欧美综合久久久 | 亚州精品天堂中文字幕 | 日韩欧美在线播放 | 午夜国产一区 | 午夜视频一区二区 | 91精品久久久久久久久中文字幕 | 成人精品一区二区三区中文字幕 | 色综合桃花网 | 99热播精品| 国产精品日韩欧美一区二区三区 | 亚洲精品国产电影 | 亚洲一二三区在线观看 | 亚洲国产成人精品久久 | 日本精品视频在线 | 日韩欧美在线播放 | 亚洲日韩中文字幕一区 | 久草热播 | av一区在线观看 | 久久免费视频2 | 欧美国产精品一区二区 | 久久香蕉精品视频 | 久久中文字幕av | 欧美日韩高清一区 | 欧美日批 | 日本不卡高清视频 | 成人影视网| 麻豆久久久久久久久久 | 91久久| 国产欧美精品一区二区 | 色就是色欧美 | 久久99久久99久久 | 337p日韩| 人干人人|