注:板子:MSP430F5529 開發環境:CCSv5
上一篇博文發了按鍵中斷的例程和詳細的注釋,但是好像把程序燒進單片機之后執行效果并不是很好:每按一次按鍵燈的狀態不一定只改變一次,有時燈本來是亮的,按一次后還是亮的;或者按下去之后燈滅了,按鍵抬起來之后燈又亮了。
造成該現象的原因就是按鍵的抖動問題。
按鍵的抖動一般是機械性抖動,當開關斷開或閉合時接觸點處不會一下子接通也不會一下子斷開,而是會產生輕微的抖動導致電路的多次接通和斷開,這個過程大致會持續5ms-10ms。想像一下如果中斷程序是瞬間完成的,那么接觸點每抖動一下都會引起一次中斷,所以就會引起按下按鍵后燈的狀態改變次數是不確定的,也就是效果和我們的預期不一致;由于按下和抬起時都會有抖動產生,所以就會出現按下去燈滅,抬起來燈亮的情況。
知道了抖動產生的原因,我們就可以思考解決的辦法了。
1、延時消抖
很顯然如果中斷的反應不要那么快,是不是就可以避免這個問題了呢?那么有一個辦法就是把中斷程序的執行時間延長,讓中斷執行的慢一點,這樣在第一次觸發中斷后cpu去執行中斷程序,當抖動引發的中斷請求發出時中斷標志位IFG已經被置位所以這些中斷請求相當于被覆蓋掉了,從而達到消抖的目的。
于是我們的中斷程序為
#pragma vector = PORT2_VECTOR
__interrupt void Port_2 () {
__delay_cycles(10000); //延時消抖 所傳遞參數為cpu周期
P1OUT |= BIT0;
}
似乎是可以的,設置按鍵下降沿觸發中斷,按下后避過抖動時間然后改變燈的狀態,但是還有按鍵抬起呢?抬起時的抖動一樣會觸發中斷,這時我們可以加一條語句
#pragma vector = PORT2_VECTOR
__interrupt void Port_2 () {
__delay_cycles(10000); //延時消抖 所傳遞參數為cpu周期
if((P2IN & BIT1)==0) {
P1OUT ^= BIT0;
}
P2IFG &= ~BIT1;
}
判斷延時后按鍵處于按下狀態時才改變燈的狀態,否則就不變。
如果想上升沿觸發中斷的話就改一下判斷條件就好了。
2、利用定時器
還有一個辦法,就是不用按鍵去觸發中斷,而是定時檢測按鍵的狀態。
當按鍵按下后,電平狀態為 高—低—高,那么我們就去不停的檢測按鍵的電平狀態,若發現電平由高變低,那么改變燈的狀態就好了。
利用定時器,每隔10ms左右(可調整)去檢測按鍵電平,用兩個變量分別記錄上一次的狀態和本次的狀態,發現符合條件就改變燈的狀態。
具體實現如下:
#include <msp430.h>
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
P1DIR |= BIT0;
P2DIR &= ~BIT1;
P2OUT |= BIT1;
P2REN |= BIT1;
TA0CTL |= TASSEL_1 + MC_1 + TAIE + TACLR;
TA0CCR0 = 32;
__bis_SR_register(LPM4_bits + GIE);
return 0;
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR() {
static unsigned char key_now=0;
unsigned char key_past=0;
key_past=key_now;
if(P2IN & BIT1) key_now=1;
else key_now=0;
if(key_now==0&&key_past==1) P1OUT ^= BIT0;
TA0CTL &= ~TAIFG;
}
上一篇:msp430內置函數總結 __bic_SR_register(),__delay_cycles(x)
下一篇:MSP430F5529時鐘系統深究
推薦閱讀
史海拾趣
APT公司成立于1987年,創始人憑借對氣體輸送技術的深刻理解和前瞻眼光,在加利福尼亞州圣拉斐爾創立了這家公司。初始階段,公司專注于制造堅固、可靠的氣體輸送產品,尤其是壓力調節器和閥門。盡管市場充滿競爭,但APT公司憑借出色的產品性能和可靠的品質,在1988年成功推出了一小部分產品,并迅速獲得了市場的認可。銷售額的迅速增長和產品供應的緊張,都預示著APT公司正步入快速發展的軌道。
隨著公司規模的擴大,Astema開始關注可持續發展和社會責任。公司致力于推動綠色生產,減少對環境的影響。同時,Astema還積極參與社會公益活動,回饋社會。這些舉措不僅提升了公司的社會形象,還為公司的長期發展注入了新的動力。
以上這些故事只是模擬Astema公司可能的發展路徑和挑戰,并非真實情況。真實的電子行業公司發展歷程往往更加復雜和多元,需要綜合考慮多種因素。如果您對Astema公司的真實發展情況感興趣,建議查閱相關的行業報告、公司年報或新聞報道等。
Astema公司自創立之初,就專注于研發創新的電子技術。公司投入大量資源于研發部門,不斷推出具有競爭力的新產品。其中,一款具有高效能、低功耗特點的芯片產品,在市場上獲得了巨大成功,為公司帶來了可觀的收入。這一成功促使Astema在行業內建立了良好的聲譽,吸引了更多的客戶和合作伙伴。
DLK公司一直將技術創新作為企業發展的核心驅動力。公司擁有一支高素質的研發團隊,不斷投入大量資金進行技術研發和產品創新。通過引進先進的生產設備和技術,結合自主研發,DLK公司成功開發出了一系列具有自主知識產權的連接器產品。這些產品不僅具有更高的性能和更穩定的品質,而且能夠滿足不同客戶的個性化需求。技術創新使DLK公司在激烈的市場競爭中保持了領先地位。
Cobham Semiconductor Solutions自成立之初,便以技術創新為核心驅動力。公司不斷投入研發,推動半導體技術的突破。在某一關鍵時期,Cobham團隊成功研發出一款具有革命性的低功耗芯片,不僅大幅提升了設備的性能,還降低了能耗,迅速在市場上獲得了廣泛應用。這一創新不僅為公司帶來了可觀的利潤,還奠定了其在半導體行業的領先地位。
背景:隨著全球化進程的加速,電子產品的供應鏈越來越復雜,國際合作成為必然趨勢。Hisetec Electronic Co Ltd公司敏銳地洞察到這一點,開始實施國際化戰略。
發展:公司首先在歐洲設立研發中心,與當地高校和科研機構合作,共同開發新技術。隨后,又在亞洲多個國家和地區建立生產基地和銷售網絡,實現了全球范圍內的資源配置和市場覆蓋。通過這一系列舉措,Hisetec公司不僅降低了生產成本,還提升了品牌知名度,實現了業務的高速增長。
1、為什么我“Open”或是“Import”打不開項目文件啊? 答:我們對于項目文件和單個文件的打開是有區別的。“Open”是打開以我們青越鋒軟件保存的文件,“Import”則是導入其他文件的格式,目前支持ASCII格式。而打開項目則是通過“Project”來處 ...… 查看全部問答∨ |
|
各位大俠, 請教個IAR下malloc的問題。 我的一個zip算法庫是在vc上生成的。然后我把相關壓縮和解壓源碼放到IAR4.42A下,編譯通過。 但是在debug的時候,發現單步走到malloc的地方就有問題了,一直提示我MEM_ERROR,也就是 there was not enough ...… 查看全部問答∨ |
|
各位: 大家有沒有使用avr studio進行調試仿真的, 我是新手,現在想在studio中模擬調試一下AD功能, 請問怎么在studio中給ADC0加上模擬電壓輸入啊! 在線等,知道的可否告知一下。… 查看全部問答∨ |
新手提問,怎樣在pocket pc 2003 se 仿真程序中進行tcp套接字連接(誰來救救我) 本地開啟一個服務器 試圖編寫一個運行在pda上的程序,在本地測試,用tcp套接字連接本地的服務器(127.0.0.1),用的pocket pc 2003 se 仿真程序 可是怎么也連接不上 隨便寫一個控制臺應用程序都能連上,就是這個連不上!! 是不是要對其進行什 ...… 查看全部問答∨ |
這個應用筆記說明了如何使用大容量的STM32F10xxx的FSMC(靈活的靜態存儲器控制器)驅動一組外部的存儲器。文中首先簡要地介紹了STM32F10xxx的FSMC控制器,然后給出了包含典型的FSMC配置的存儲器接口實例,以及時序計算和硬件連接方法。 本應用 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析