Tiny4412裸机程序,按键检测(轮询方式)
由于前幾天出差,博客沒有更新,今天看了看Tiny4412的原理圖,把按鍵掃描程序寫了一下,用的是輪詢方式,后面會有中斷方式的實現,閑話少說,進入正題,程序由前一個實驗Tiny4412之C語言實現流水燈更改而來:
一、控制原理說明
先看一下原理圖:
按鍵原理圖
首先把按鍵對應的GPIO設置為輸入模式,修改GPX3CON寄存器(板子不同,可能對應的GPIO管腳不同),通過上圖可知當沒有按下按鍵時,對應的GPIO狀態為高電平,當有按鍵被按下時,對應的GPIO變為低,我們在程序一直檢測這幾個GPIO狀態即可;
二、程序說明
其中Start.s文件同上一個實驗完全相同;鏈接腳本key.lds的內容和led.lds完全相同,只把名字改了改;Makefile的內容也大部分一樣,也只是改了改里邊文件的名字,key.c的文件需要重新編寫,代碼如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | /* * 程序說明 * 一上電,4個LED全亮,當某個按鍵被按下,則對應的LED熄滅(可同時按下多個鍵) * 對應關系:KEY1-LED1,KEY2-LED2,KEY3-LED3,KEY4-LED4 */ //按鍵對應的GPIO #define GPX3CON (*(volatile unsigned int *)0x11000C60) #define GPX3DAT (*(volatile unsigned int *)0x11000C64) //LED對應的GPIO #define GPM4CON (*(volatile unsigned int *)0x110002E0) #define GPM4DAT (*(volatile unsigned int *)0x110002E4) void delay(volatile int time) { for(; time > 0; time-- ) ; } int main(void) { unsigned long tmp = 0; unsigned char keyValue = 0; /* * GPX3_2-GPX3_5 設置為輸入功能,用于檢測按鍵引腳的狀態 */ tmp = GPX3CON; tmp &= ~(0xffff << 8); GPX3CON = tmp; /* * GPM4_0-GPM4_3 設置為輸出功能,用于控制LED的亮滅 */ tmp = GPM4CON; tmp &= ~0xffff; tmp |= 0x1111; GPM4CON = tmp; while(1) { //讀按鍵引腳狀態 keyValue = GPX3DAT; keyValue = (keyValue & (0xf << 2)) >> 2; if(keyValue != 0xf) //說明有按鍵被按下,再詳細判斷是哪個按鍵被按下 { delay(1000); //防抖 keyValue = GPX3DAT; keyValue = (keyValue & (0xf << 2)) >> 2; GPM4DAT = ~keyValue; //設置LED亮、滅 } else { GPM4DAT = 0x00; } } return 0; } |
其中注釋也比較詳細,控制原理上邊也說得很清楚了,這里就不多說了,有問題可以留言。
三、程序編譯及燒寫
1.編譯
通過FTP或者其他工具將Start.s、Makefile、key.lds 、key.c四個文件上傳到服務器上去,輸入make命令進行編譯將得到key.bin文件。
2.燒寫
將SD卡插入電腦,并讓VmWare里的Ubuntu識別出來,然后執行如下命令:
| 1 | sudo ./sd_fusing.sh /dev/sdb ../3_key_scan/key.bin |
如下圖所示:
將程序燒到SD卡
四、上電實驗
程序運行圖一
程序運行圖二
上圖所示,圖一是沒有按鍵被按下,四個LED全都被點亮,圖二是有兩個鍵被我同時按下
?
總結
以上是生活随笔為你收集整理的Tiny4412裸机程序,按键检测(轮询方式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 裸机篇 -- S5PV210的中断体系
- 下一篇: 一起学mini2440裸机开发(十)--