在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何進行按鍵檢測和按鍵FIFO的實現

GReq_mcu168 ? 來源:果果小師弟 ? 作者:智果芯 ? 2021-11-03 09:13 ? 次閱讀

摘要:今年實驗室來了三個學妹,其中一個學妹以前是物聯網專業的,進了實驗室老師二話沒說:先把STM32單片機過一遍,有啥問題就找小師弟。還好單片機小師弟會玩一點點,玩的也不好,所以一起學習吧!

一、如何進行按鍵檢測

檢測按鍵有中斷方式和GPIO查詢方式兩種。推薦大家用GPIO查詢方式。

1.從裸機的角度分析

  • 中斷方式:中斷方式可以快速地檢測到按鍵按下,并執行相應的按鍵程序,但實際情況是由于按鍵的機械抖動特性,在程序進入中斷后必須進行濾波處理才能判定是否有效的按鍵事件。如果每個按鍵都是獨立的接一個 IO 引腳,需要我們給每個 IO 都設置一個中斷,程序中過多的中斷會影響系統的穩定性。中斷方式跨平臺移植困難。

  • 查詢方式:查詢方式有一個最大的缺點就是需要程序定期的去執行查詢,耗費一定的系統資源。實際上耗費不了多大的系統資源,因為這種查詢方式也只是查詢按鍵是否按下,按鍵事件的執行還是在主程序里面實現。

2.從OS的角度分析

  • 中斷方式:在 OS 中要盡可能少用中斷方式,因為在RTOS中過多的使用中斷會影響系統的穩定性和可預見性。只有比較重要的事件處理需要用中斷的方式。
  • 查詢方式:對于用戶按鍵推薦使用這種查詢方式來實現,現在的OS基本都帶有CPU利用率的功能,這個按鍵FIFO占用的還是很小的,基本都在1%以下。

二、最簡單的按鍵檢測程序

先給他說了一種經典的按鍵檢測代碼,相信大多數人使用按鍵函數都見過它,很簡單就不過多介紹了!

#defineKEY0_PRES1//KEY0
#defineKEY1_PRES2//KEY1
#defineWKUP_PRES3//WK_UP

u8KEY_Scan(u8mode)
{
staticu8key_up=1;//按鍵按松開標志
if(mode)key_up=1;//支持連按
if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
{
delay_ms(10);//去抖動
key_up=0;
if(KEY0==0)returnKEY0_PRES;
elseif(KEY1==0)returnKEY1_PRES;
elseif(WK_UP==1)returnWKUP_PRES;
}elseif(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
return0;//無按鍵按下
}

intmain(void)
{
u8t=0;
delay_init();//延時函數初始化
LED_Init();//初始化與LED連接的硬件接口
KEY_Init();//初始化與按鍵連接的硬件接口
LED=0;//點亮LED
while(1)
{
t=KEY_Scan(0);//得到鍵值
switch(t)
{
caseKEY0_PRES://如果KEY0按下
LED=!LED;
break;
default:
delay_ms(10);
}
}
}

如果你在工作中使用這種代碼,有可能會被同事笑話。當然我這里并不是說這種代碼不好,不管黑貓白貓,能抓住老鼠就是好貓。只要能滿足項目需求實現對應的功能就是好代碼。但是如果你使用下面這種個人感覺可能會更好。

其實也并沒有什么神秘感,就是使用了FIFO機制。參考的就是安富萊的按鍵例程,不過源代碼相對比較復雜,對于初學者并不友好,所以小小的修改了一下,僅供參考!

在前面分享了使用系統滴答定時器實現了多個軟件定時器,在按鍵FIFO中也需要使用這個定時器。在系統的開始我們會啟動一個10ms的軟件定時器。在這個10ms的軟件定時器中不斷的進行按鍵掃描,與其他的任務互不影響。

三、為什么要了解FIFO

要回答什么是FIFO,先要回答為什么要使用FIFO。只有搞清楚使用FIFO的好處,你才會有意無意的使用FIFO。學習FIFO機制和狀態機機制一樣,都是在裸機編程中非常重要的編程思想。編程思想很重要。初級coder總是在關注代碼具體是怎么寫,高級coder關注的是程序的框架邏輯,而不是某個細節。只要你框架邏輯通了,則一通百通。

四、什么是FIFO

FIFO是先入先出的意思,即誰先進入隊列,誰先出去。比如我們需要串口打印數據,當使用緩存將該數據保存的時候,在輸出數據時必然是先進入的數據先出去,那么該如何實現這種機制呢?首先就是建立一個緩存空間,這里假設為10個字節空間進行說明。

從這張圖就知道如果要使用FIFO,就要定義一個結構體,而這個結構體至少應該有三個成員。數組buf、讀指針read、寫指針write

typedefstruct
{
uint8_tBuf[10];/*緩沖區*/
uint8_tRead;/*緩沖區讀指針*/
uint8_tWrite;/*緩沖區寫指針*/
}KEY_FIFO_T;

緩存一開始沒有數據,并且用一個變量write指示下一個寫入緩存的索引地址,這里下一個存放的位置就是0,用另一個變量read 指示下一個讀出緩存的索引地址,并且下一個讀出數據的索引地址也是0。目前隊列中是沒有數據的,也就是不能讀出數據,隊列為空的判斷條件在這里就是兩個索引值相同。

現在開始存放數據:

在這里可以看到隊列中加入了9個數據,并且每加入一個數據后隊尾索引加 1,隊頭不變,這就是數據加入隊列的過程。但是緩存空間只有10個,如何判斷隊列已滿呢?如果只是先一次性加數據到隊列中,然后再讀出數據,那這里的判斷條件顯然是隊尾索引為9。

好了這就是FIFO的基本原理,下面來看一下按鍵FIFO是怎么操作的

我們這里以5個字節的FIFO空間進行說明。Write變量表示寫位置,Read 變量表示讀位置。初始狀態時,Read = Write = 0。

我們依次按下按鍵 K1,K2,那么FIFO中的數據變為:

如果 Write!= Read,則我們認為有新的按鍵事件。我們通過函數KEY_FIFO_Get()讀取一個按鍵值進行處理后,Read 變量變為 1。Write 變量不變。

繼續通過函數KEY_FIFO_Get()讀取 3 個按鍵值進行處理后,Read 變量變為 4。此時Read = Write= 4。兩個變量已經相等,表示已經沒有新的按鍵事件需要處理。

有一點要特別的注意,如果 FIFO 空間寫滿了,Write 會被重新賦值為 0,也就是重新從第一個字節空間填數據進去,如果這個地址空間的數據還沒有被及時讀取出來,那么會被后來的數據覆蓋掉,這點要引起大家的注意。我們的驅動程序開辟了 10 個字節的 FIFO 緩沖區,對于一般的應用足夠了。

五、按鍵FIFO的優點

  1. 可靠地記錄每一個按鍵事件,避免遺漏按鍵事件。特別是需要實現按鍵的按下、長按、自動連發、彈起等事件時。
  2. 讀取按鍵的函數可以設計為非阻塞的,不需要等待按鍵抖動濾波處理完畢。
  3. 按鍵 FIFO 程序在嘀嗒定時器中定期的執行檢測,不需要在主程序中一直做檢測,這樣可以有效地降低系統資源消耗。

六、按鍵 FIFO 的實現

1.定義結構體

在我們的key.h文件中定義一個結構體類型為KEY_FIFO_T的結構體。就是前面說的那個結構體。這只是類型聲明,并沒有分配變量空間。

typedefstruct
{
uint8_tBuf[10];/*緩沖區*/
uint8_tRead;/*緩沖區讀指針*/
uint8_tWrite;/*緩沖區寫指針*/
}KEY_FIFO_T;

接著在key.c 中定義 s_tKey 結構變量, 此時編譯器會分配一組變量空間。

staticKEY_FIFO_Ts_tKey;/*按鍵FIFO變量,結構體*/

好了按鍵FIFO的結構體數據類型就定義完了,很簡單吧!

2.將鍵值寫入FIFO

既然結構體都定義好了,接著就是往這個FIFO的數組中寫入數據,也就是按鍵的鍵值,用來模擬按鍵的動作了。

/*
**********************************************************
*函數名:KEY_FIFO_Put
*功能說明:將1個鍵值壓入按鍵FIFO緩沖區。可用于模擬一個按鍵。
*形參:_KeyCode:按鍵代碼
*返回值:無
**********************************************************
*/
voidKEY_FIFO_Put(uint8_t_KeyCode)
{
s_tKey.Buf[s_tKey.Write]=_KeyCode;

if(++s_tKey.Write>=KEY_FIFO_SIZE)
{
s_tKey.Write=0;
}
}

函數的主要功能就是將按鍵代碼_KeyCode寫入到FIFO中,而這個FIFO就是我們定義結構體的這個數組成員,每寫一次,就是每調用一次KEY_FIFO_Put()函數,寫指針write就++一次,也就是向后移動一個空間,如果FIFO空間寫滿了,也就是s_tKey.Write >= KEY_FIFO_SIZE,Write會被重新賦值為 0。

3.從FIFO讀出鍵值

有寫入鍵值當然就有讀出鍵值。

/*
***********************************************************
*函數名:KEY_FIFO_Get
*功能說明:從按鍵FIFO緩沖區讀取一個鍵值。
*形參:無
*返回值:按鍵代碼
************************************************************
*/
uint8_tKEY_FIFO_Get(void)
{
uint8_tret;

if(s_tKey.Read==s_tKey.Write)
{
returnKEY_NONE;
}
else
{
ret=s_tKey.Buf[s_tKey.Read];

if(++s_tKey.Read>=KEY_FIFO_SIZE)
{
s_tKey.Read=0;
}
returnret;
}
}

如果寫指針和讀出的指針相等,那么返回值就為0,表示按鍵緩沖區為空,所有的按鍵時間已經處理完畢。如果不相等就說明FIFO的緩沖區不為空,將Buf中的數讀出給ret變量。同樣,如果FIFO空間讀完了,沒有緩存了,也就是s_tKey.Read >= KEY_FIFO_SIZE,Read也會被重新賦值為 0。按鍵的鍵值定義在key.h 文件,下面是具體內容:

typedefenum
{
KEY_NONE=0,/*0表示按鍵事件*/

KEY_1_DOWN,/*1鍵按下*/
KEY_1_UP,/*1鍵彈起*/
KEY_1_LONG,/*1鍵長按*/

KEY_2_DOWN,/*2鍵按下*/
KEY_2_UP,/*2鍵彈起*/
KEY_2_LONG,/*2鍵長按*/

KEY_3_DOWN,/*3鍵按下*/
KEY_3_UP,/*3鍵彈起*/
KEY_3_LONG,/*3鍵長按*/
}KEY_ENUM;

必須按次序定義每個鍵的按下、彈起和長按事件,即每個按鍵對象占用 3 個數值。推薦使用枚舉enum, 不用#define的原因是便于新增鍵值,方便調整順序。使用{ } 將一組相關的定義封裝起來便于理解。編譯器也可幫我們避免鍵值重復。

4.按鍵檢測程序

上面說了如何將按鍵的鍵值存入和讀出FIFO,但是既然是按鍵操作,就肯定涉及到按鍵消抖處理,還有按鍵的狀態是按下還是彈起,是長按還是短按。所以為了以示區分,我們用還需要給每一個按鍵設置很多參數,就需要再定義一個結構體KEY_T,讓每個按鍵對應1個全局的結構體變量。

typedefstruct
{
/*下面是一個函數指針,指向判斷按鍵手否按下的函數*/
uint8_t(*IsKeyDownFunc)(void);/*按鍵按下的判斷函數,1表示按下*/

uint8_tCount;/*濾波器計數器*/
uint16_tLongCount;/*長按計數器*/
uint16_tLongTime;/*按鍵按下持續時間,0表示不檢測長按*/
uint8_tState;/*按鍵當前狀態(按下還是彈起)*/
uint8_tRepeatSpeed;/*連續按鍵周期*/
uint8_tRepeatCount;/*連續按鍵計數器*/
}KEY_T;

在key.c 中定義s_tBtn結構體數組變量。

staticKEY_Ts_tBtn[3]={0};

每個按鍵對象都分配一個結構體變量,這些結構體變量以數組的形式存在將便于我們簡化程序代碼行數。因為我的硬件有3個按鍵,所以這里的數組元素為3。使用函數指針IsKeyDownFunc可以將每個按鍵的檢測以及組合鍵的檢測代碼進行統一管理。

因為函數指針必須先賦值,才能被作為函數執行。因此在定時掃描按鍵之前,必須先執行一段初始化函數來設置每個按鍵的函數指針和參數。這個函數是void KEY_Init(void)

voidKEY_Init(void)
{
KEY_FIFO_Init();/*初始化按鍵變量*/
KEY_GPIO_Config();/*初始化按鍵硬件*/
}

下面是KEY_FIFO_Init函數的定義:

staticvoidKEY_FIFO_Init(void)
{
uint8_ti;

/*對按鍵FIFO讀寫指針清零*/
s_tKey.Read=0;
s_tKey.Write=0;

/*給每個按鍵結構體成員變量賦一組缺省值*/
for(i=0;i100;/*長按時間0表示不檢測長按鍵事件*/
s_tBtn[i].Count=5/2;/*計數器設置為濾波時間的一半*/
s_tBtn[i].State=0;/*按鍵缺省狀態,0為未按下*/
s_tBtn[i].RepeatSpeed=0;/*按鍵連發的速度,0表示不支持連發*/
s_tBtn[i].RepeatCount=0;/*連發計數器*/
}
/*判斷按鍵按下的函數*/
s_tBtn[0].IsKeyDownFunc=IsKey1Down;
s_tBtn[1].IsKeyDownFunc=IsKey2Down;
s_tBtn[2].IsKeyDownFunc=IsKey3Down;
}

我們知道按鍵會有機械抖動,你以為按鍵按下就是低電平,其實在按下的一瞬間會存在機械抖動,如果不做延時處理,可能會出錯,一般如果按鍵檢測到按下后再延時50ms檢測一次,如果還是檢測低電平,才能說明按鍵真正的被按下了。反之按鍵彈起時也是一樣的。所以我們程序設置按鍵濾波時間50ms, 因為代碼每10ms掃描一次按鍵,所以按鍵的單位我們可以理解為10ms,濾波的次數就為5次。這樣只有連續檢測到50ms狀態不變才認為有效,包括彈起和按下兩種事件,即使按鍵電路不做硬件濾波(沒有電容濾波),該濾波機制也可以保證可靠地檢測到按鍵事件。

判斷按鍵是否按下,用一個HAL_GPIO_ReadPin就可以搞定。

staticuint8_tIsKey1Down(void)
{
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==GPIO_PIN_RESET)
return1;
else
return0;
}
staticuint8_tIsKey2Down(void)
{
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==GPIO_PIN_RESET)
return1;
else
return0;
}

staticuint8_tIsKey3Down(void)
{
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==GPIO_PIN_RESET)
return1;
else
return0;
}

下面是KEY_GPIO_Config函數的定義,這個函數就是配置具體的按鍵GPIO的,就不需要過多的解釋了。

staticvoidKEY_GPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;

/*第1步:打開GPIO時鐘*/
__HAL_RCC_GPIOE_CLK_ENABLE();

/*第2步:配置所有的按鍵GPIO為浮動輸入模式(實際上CPU復位后就是輸入狀態)*/
GPIO_InitStructure.Mode=GPIO_MODE_INPUT;/*設置輸入*/
GPIO_InitStructure.Pull=GPIO_NOPULL;/*上下拉電阻不使能*/
GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;/*GPIO速度等級*/

GPIO_InitStructure.Pin=GPIO_PIN_4;
HAL_GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.Pin=GPIO_PIN_3;
HAL_GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.Pin=GPIO_PIN_2;
HAL_GPIO_Init(GPIOB,&GPIO_InitStructure);
}

5.按鍵掃描

按鍵掃描函數KEY_Scan()每隔 10ms 被執行一次。RunPer10ms函數在 systick中斷服務程序中執行。

voidRunPer10ms(void)
{
KEY_Scan();
}

voidKEY_Scan(void)
{
uint8_ti;
for(i=0;i/*

每隔10ms所有的按鍵GPIO均會被掃描檢測一次。KEY_Detect函數實現如下:

staticvoidKEY_Detect(uint8_ti)
{
KEY_T*pBtn;

pBtn=&s_tBtn[i];
if(pBtn->IsKeyDownFunc())
{//這個里面執行的是按鍵按下的處理
if(pBtn->Count//按鍵濾波前給Count設置一個初值
pBtn->Count=KEY_FILTER_TIME;
}
elseif(pBtn->Count2*KEY_FILTER_TIME)
{//實現KEY_FILTER_TIME時間長度的延遲
pBtn->Count++;
}
else
{
if(pBtn->State==0)
{
pBtn->State=1;

/*發送按鈕按下的消息*/
KEY_FIFO_Put((uint8_t)(3*i+1));
}

if(pBtn->LongTime>0)
{
if(pBtn->LongCountLongTime)
{
/*發送按鈕持續按下的消息*/
if(++pBtn->LongCount==pBtn->LongTime)
{
/*鍵值放入按鍵FIFO*/
KEY_FIFO_Put((uint8_t)(3*i+3));
}
}
else
{
if(pBtn->RepeatSpeed>0)
{
if(++pBtn->RepeatCount>=pBtn->RepeatSpeed)
{
pBtn->RepeatCount=0;
/*長按鍵后,每隔10ms發送1個按鍵*/
KEY_FIFO_Put((uint8_t)(3*i+1));
}
}
}
}
}
}
else
{//這個里面執行的是按鍵松手的處理或者按鍵沒有按下的處理
if(pBtn->Count>KEY_FILTER_TIME)
{
pBtn->Count=KEY_FILTER_TIME;
}
elseif(pBtn->Count!=0)
{
pBtn->Count--;
}
else
{
if(pBtn->State==1)
{
pBtn->State=0;

/*發送按鈕彈起的消息*/
KEY_FIFO_Put((uint8_t)(3*i+2));
}
}
pBtn->LongCount=0;
pBtn->RepeatCount=0;
}
}

這個函數還是比較難以理解的,主要是結構體的操作。所以好好學習結構體,不要見了結構體就跑。

分析:首先讀取相應按鍵的結構體地址賦值給結構體指針變量pBtn ,因為程序里面每個按鍵都有自己的結構體,只有通過這個方式才能對具體的按鍵進行操作。(在前面我們使用軟件定時器時也使用了這中操作,在滴答定時器的中斷服務函數中)。

staticKEY_Ts_tBtn[3];//程序里面每個按鍵都有自己的結構體,有三個按鍵
KEY_T*pBtn;//定義一個結構體指針變量pBtn
pBtn=&s_tBtn[i];//將按鍵的結構體地址賦值給結構體指針變量pBtn

然后接著就是給按鍵濾波前給Count設置一個初值,前面說按鍵初始化的時候已經設置了Count =5/2。然后判斷是否按下的標志位,如果按鍵按下了,這里就將其設置為 1,如果沒有按下這個變量的值就會一直是 0。這里可能不理解是就是按鍵按下發送的鍵值是3 * i + 1。按鍵彈起發送的鍵值是3 * i + 2,按鍵長按發送的鍵值是3 * i + 3。也就是說按鍵按下發送的鍵值是1和4和7。按鍵彈起發送的鍵值是2和5和8,按鍵長按發送的鍵值是3和6和9。看下面這個枚舉enum你就明白了。

typedefenum
{
KEY_NONE=0,/*0表示按鍵事件*/

KEY_1_DOWN,/*1鍵按下*/
KEY_1_UP,/*1鍵彈起*/
KEY_1_LONG,/*1鍵長按*/

KEY_2_DOWN,/*2鍵按下*/
KEY_2_UP,/*2鍵彈起*/
KEY_2_LONG,/*2鍵長按*/

KEY_3_DOWN,/*3鍵按下*/
KEY_3_UP,/*3鍵彈起*/
KEY_3_LONG,/*3鍵長按*/


}KEY_ENUM;

7.試驗演示

intmain(void)
{
uint8_tKeyCode;/*按鍵代碼*/
KEY_Init();
while(1)
{
/*按鍵濾波和檢測由后臺systick中斷服務程序實現,我們只需要調用KEY_FIFO_Get讀取鍵值即可。*/
KeyCode=KEY_FIFO_Get();/*讀取鍵值,無鍵按下時返回KEY_NONE=0*/
if(KeyCode!=KEY_NONE)
{
switch(KeyCode)
{
caseKEY_DOWN_K1:/*K1鍵按下*/
printf("K1鍵按下
");
break;
caseKEY_UP_K1:/*K1鍵彈起*/
printf("K1鍵彈起
");
break;
caseKEY_DOWN_K2:/*K2鍵按下*/
printf("K2鍵按下
");
break;
caseKEY_UP_K2:/*K2鍵彈起*/
printf("K2鍵彈起
");
break;
caseKEY_DOWN_K3:/*K3鍵按下*/
printf("K3鍵按下
");
break;
caseKEY_UP_K3:/*K3鍵彈起*/
printf("K3鍵彈起
");
break;
default:
/*其它的鍵值不處理*/
break;
}

}
}
}

不知道學妹看懂沒,沒看懂就多看幾遍。代碼例程已上傳至Gitee。

https://gitee.com/zhiguoxin/Wechat-Data.git

責任編輯:haq


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6040

    文章

    44602

    瀏覽量

    637029
  • STM32
    +關注

    關注

    2270

    文章

    10918

    瀏覽量

    356821
  • 函數
    +關注

    關注

    3

    文章

    4344

    瀏覽量

    62820

原文標題:這個學妹寫的按鍵檢測函數把我秀翻了!

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    開發第1個LVGL程序與實現按鍵操作

    開發第1個LVGL程序與實現按鍵操作
    的頭像 發表于 01-07 13:49 ?450次閱讀
    開發第1個LVGL程序與<b class='flag-5'>實現</b><b class='flag-5'>按鍵</b>操作

    基于狀態機和面向對象的思想設計按鍵檢測模塊

    物理按鍵,在很多嵌入式產品里面應用得非常廣泛,很多嵌入式軟件工程師在剛剛開始入門的時候,點完燈之后就開始學習按鍵輸入檢測按鍵輸入可以說是繼點燈之后,又一經典的嵌入式入門必學內容之一。
    的頭像 發表于 11-14 11:44 ?302次閱讀
    基于狀態機和面向對象的思想設計<b class='flag-5'>按鍵</b><b class='flag-5'>檢測</b>模塊

    基于FPGA實現按鍵消抖處理

    引言: 按鍵在電子產品中經常用到,由于按鍵的機械特性,按鍵在閉合或松開的瞬間伴隨著一連串的抖動,這樣的抖動將直接影響設計系統的穩定性。因此,必須對抖動進行處理。本文介紹如何在FPGA中
    的頭像 發表于 10-24 14:54 ?297次閱讀
    基于FPGA<b class='flag-5'>實現</b><b class='flag-5'>按鍵</b>消抖處理

    AD快捷按鍵

    電子發燒友網站提供《AD快捷按鍵.docx》資料免費下載
    發表于 10-24 10:45 ?2次下載

    Keithley吉時利2400源表按鍵無反應維修案例

    近期西安某院校送修一臺Keithley吉時利2400源表,報修故障是前面板屏幕顯示正常,但是所有按鍵均無反應,對儀器進行初步檢測,確定故障與客戶報修一致。 下面是 吉時利2400源表 維修情況
    的頭像 發表于 10-14 18:33 ?432次閱讀
    Keithley吉時利2400源表<b class='flag-5'>按鍵</b>無反應維修案例

    電容式觸摸按鍵按鍵擴展方法

    電子發燒友網站提供《電容式觸摸按鍵按鍵擴展方法.pdf》資料免費下載
    發表于 09-27 11:43 ?0次下載
    電容式觸摸<b class='flag-5'>按鍵</b>的<b class='flag-5'>按鍵</b>擴展方法

    為什么按鍵消抖那么重要

    和錯誤操作。因此,進行按鍵消抖處理顯得尤為重要。 按鍵抖動的產生是由于機械觸點的彈性特性所決定的。當按鍵被按下或釋放時,觸點并不會立即穩定地接通或斷開,而是會在閉合和斷開的瞬間產生一連
    的頭像 發表于 09-25 16:50 ?641次閱讀
    為什么<b class='flag-5'>按鍵</b>消抖那么重要

    基于MSP430實現電視的電容式觸摸按鍵

    電子發燒友網站提供《基于MSP430實現電視的電容式觸摸按鍵.pdf》資料免費下載
    發表于 08-28 11:56 ?0次下載
    基于MSP430<b class='flag-5'>實現</b>電視的電容式觸摸<b class='flag-5'>按鍵</b>

    如何在FPGA中實現按鍵消抖

    在FPGA(現場可編程門陣列)中實現按鍵消抖是一個重要的設計環節,特別是在處理用戶輸入時,由于物理按鍵的機械特性和電氣特性,按鍵在按下和釋放的瞬間會產生抖動現象,這種抖動可能導致系統錯
    的頭像 發表于 08-19 18:15 ?2141次閱讀

    何進行IP檢測

    排查網絡連接問題,并及時的防范潛在的網絡攻擊。 那么,如何進行 IP 地址檢測呢?接下來我將進行圖示哦~ 使用操作系統自帶的工具 ① Windows 系統中,按win+R,輸入“ipconfig”命令。 ② Mac 系統中,則可
    的頭像 發表于 07-26 14:09 ?608次閱讀
    如<b class='flag-5'>何進行</b>IP<b class='flag-5'>檢測</b>

    按鍵開關連接器立式貼片 輕觸按鍵3*6*2.5H

    按鍵開關連接器立式貼片 輕觸按鍵3*6*2.5H
    發表于 06-18 09:42 ?0次下載

    【AWTK使用經驗】如何響應物理按鍵

    ZTP800示教器設備上有許多按鍵,假設想在自己的AWTK程序中檢測并使用這些按鍵響應事件,則需要使用AWTK綁定物理按鍵的功能。本篇文章將借助一個
    的頭像 發表于 06-06 08:25 ?831次閱讀
    【AWTK使用經驗】如何響應物理<b class='flag-5'>按鍵</b>

    TTP233H-HA6 單按鍵觸摸檢測IC

    TTP233H-HA6是單按鍵觸摸檢測芯片,此觸摸檢測芯片內建穩壓電路,提供穩定的電壓給觸摸感應電路使用,穩定的觸摸檢測效果可以廣泛的滿足不同應用的需求,此觸摸
    的頭像 發表于 02-29 14:55 ?923次閱讀
    TTP233H-HA6 單<b class='flag-5'>按鍵</b>觸摸<b class='flag-5'>檢測</b>IC

    為什么要進行按鍵消抖?按鍵抖動的原理 按鍵消抖的方法

    按鍵消抖通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上穩定地接通,在斷開時也不會一下子斷開。
    的頭像 發表于 02-17 17:07 ?1.8w次閱讀
    為什么要<b class='flag-5'>進行</b><b class='flag-5'>按鍵</b>消抖?<b class='flag-5'>按鍵</b>抖動的原理 <b class='flag-5'>按鍵</b>消抖的方法

    觸摸按鍵的工作原理是什么

    按鍵的身影。那么,觸摸按鍵的原理是什么呢? 首先,我們來了解電容式觸摸按鍵的原理。電容式觸摸按鍵是一種基于電容感應的技術,它的工作原理是通過檢測
    的頭像 發表于 02-04 14:27 ?7286次閱讀
    主站蜘蛛池模板: 久草热线视频| 国产精品免费拍拍拍| 五月婷婷丁香在线观看| 亚洲 欧美 另类 综合 日韩| 香蕉爱爱网| 色丁香影院| 免费视频爰爱太爽了| www.夜夜操.com| 午夜不卡在线| 天天综合网天天做天天受| 人人干天天操| 5252欧美在线观看| 91中文字幕视频| 99热网站| 色婷婷99综合久久久精品| 欧美ww| 国产欧美日韩综合精品无毒| www黄色大片| 日本高清视频色| 1000部禁片黄的免费看| 日本aaaaa特黄毛片| 免费啪啪小视频| 亚洲a成人| 亚洲高清毛片| 欧美12一13高清视频| 成在线人视频免费视频| 视频午夜| 91大神在线观看视频| 亚洲天堂爱爱| 欧美拍拍| 5月丁香6月婷婷| 狠狠干天天射| 在线看免费视频| 欧美成年性色mmm| 天堂中文在线观看| 久草亚洲视频| 天天干天天拍天天射天天添天天爱| 天天舔天天射天天操| asian极品呦女爱爱| 久99频这里只精品23热 视频| 国语一区|