單片機
返回首頁

s3c2440學習之路-005 輪訓模式讀取key(按鍵)

2021-09-09 來源:eefocus

硬件平臺:jz2440

軟件平臺:Ubuntu16.04 arm-linux-gcc-3.4.5

源碼位置: https://github.com/lian494362816/C/tree/master/2440/006_key


1.原理分析

按鍵是常用的電子元器件,去讀按鍵的方法主要有2種

1)輪訓方式,就是需要不斷的去讀取按鍵的數值

2)中斷方式,通過外部中斷來實現,只有當按鍵 按下/松開 時才會觸發,不需要不斷的去讀取按鍵的值

中斷的方式配置比較復雜,本篇博客就先講通過輪訓的方式讀取按鍵的值。


硬件原理很簡單,從電源正極到地中間串聯1個電阻和1個按鍵開關,然后2440的某個pin腳在連接上去,通過去讀pin腳的電平來獲取按鍵的數值。

當按鍵未按下時,讀取到的就是高電平,2440獲取到的就是1

當按鍵按下時,讀取到的就是地電平,2440獲取到的就是0

在這里插入圖片描述

jz2440的原理圖可能看上去有不同,因為分成了2個部分,1個是電阻上拉部分,1個是按鍵接地部分,不過最后組合起來就是上面那張圖片的效果。這里有4按鍵,不過這次只用其中的3個。

EINT0–GPF0

EINT2–GPF2

EINT11–GPG3


jz2440按鍵原理圖

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

2.主要流程

2440的GPIO pin腳有不同的功能,不過一般GPIO pin腳有3種模式,輸入模式、輸出模式、特殊功能模式。


輸出模式和輸出模式好理解,特殊功能模式則是這個pin腳的特殊功能,每個pin腳都不一樣。


如當做外部中斷、當做LCD控制引腳等等。如要需要讀取按鍵的數值,當然就需要配置成輸入模式了。 這里只配置3個按鍵,因為開發板上剛好有3個led燈,可以通過led的亮滅來顯示按鍵的狀態


1)將GPF0,GPF2, GPG3 設置成輸入模式, 通過GPFCON和GPGCON來控制

2)讀取GPF0, GPF2,GPG3的數值。GPF0,GPF2的數值通過讀取GPFDAT的第0,第2位來確定。GPG3 的數值通過去讀GPGDAT的第3位來確定

3)通過死循環,不斷的讀取GPFDAT和GPGDAT的數值來判斷按鍵狀態

4)若按鍵按下,則led亮,若按鍵未按下,則led滅

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

3. 源碼

key.c


/*

Input =b00

EINT0   GPF0 [1:0]

EINT2   GPF2 [5:4]

EINT11 GPG3 [7:6]

*/

int key_init(void)

{

    GPFCON &= ~(0x3 << 0);

    GPFCON &= ~(0x3 << 4);

    GPGCON &= ~(0x3 << 6);

      

    return 0;

}


按鍵的初始化代碼很簡單,將3個GPIO配置成輸出模式即可


key.c


int main(void)

{

    int i = 0;

    int key_gpf_value = 0;

    int key_gpg_value = 0;


    led_init();

    key_init();


    while(1)

    {

        key_gpf_value = GPFDAT;

        key_gpg_value = GPGDAT;


        /* 1 key release */

        if (key_gpf_value & (1 << 0))

        {

            led_off(6);

        }

        else /* 0 key press */

        {

            led_on(6);

        }


        if (key_gpf_value & (1 << 2))

        {

            led_off(5);

        }

        else

        {

            led_on(5);

        }


        if(key_gpg_value & (1 <<3))

        {

            led_off(4);

        }

        else

        {

            led_on(4);

        }

    }



    return 0;

}


主函數先初始化按鍵和led, 然后通過while(1)不斷的去讀取GPFDAT,GPGDAT來獲取按鍵的狀態。 led_on, led_off 傳入4,5,6 分別對應3個不同的led, 這里不做展開介紹。


這個程序只是簡單的介紹如何通過輪訓的方式來讀取按鍵的值,程序主要存在2個問題:

1)實際使用中,可不能使用while(1)不停的讀取按鍵的數值,這樣做很浪費CPU。(不過以前寫單片機程序就是這樣做的)

2)按鍵存在消斗的問題,實際的電平波形是會出現來回抖動的,如下圖的虛線就是判斷電平高地的標準線。因為電平抖動,一次按鍵 按下/松開 的過程中會出現多次 按下/松開 的結果。因為程序是靠led來顯示結果,如果是 按下/松開 通過串口打印結果的話,一次 按下/松開 串口可能會噴出多次不同的結果。 處理的方式就是延遲一會之后再次去讀取,如果數值還是一樣的話,那就是正確的結果了,否則就是抖動。

在這里插入圖片描述

進入單片機查看更多內容>>
相關視頻
  • TI 新一代 C2000? 微控制器:全方位助力伺服及馬達驅動應用

  • MSP430電容觸摸技術 - 防水Demo演示

  • 直播回放: Microchip Timberwolf? 音頻處理器在線研討會

  • 新唐 8051單片機教程

  • 基于靈動MM32W0系列MCU的指夾血氧儀控制及OTA升級應用方案分享

  • 基于靈動MM32SPIN系列MCU的無感FOC便攜冰箱應用方案分享

    相關電子頭條文章
萝卜大香蕉