S3C2440A有九組IO口,共130個。每組IO口數目不一樣,其中A組口只有輸出功能。截圖以下:設計
關於對IO口的操做,就主要設計到3個寄存器。GPXCON(配置),GPXUP(上拉使能),GPXDAT(數據)。其中GPXCON配置IO寄存器中每兩位控制1個IO口。00表示輸入,01表示輸出,10表示第三功能,11保留。code
對數據寄存器GPXDAT的操做則是相應位寫1高電平,寫0低電平。上拉是能寄存器GPXUP則是相應位爲1時禁止相應端口的上拉電阻,爲0使能。it
下面的代碼實現了實現按下某個按鍵時,相應LED亮,鬆開按鍵時LED滅。練習了IO口德輸入與輸出。class
下面是個人原理圖跟LED控制和按鍵控制相關的IO口。原理
寫程序期間有個小插曲。錯把GPF6當作GPG6,直接讓我鬱悶了會兒,又是想固然作的怪。看看其它5個口都是G口。配置
下面是程序代碼:數據類型
#include <S3C2440.h> #include "cfg.h" #define KEY1 (1<<1) #define KEY2 (1<<9) #define KEY3 (1<<10) #define KEY4 (1<<11) #define LED1 (1<<5) #define LED2 (1<<6) #define LED3 (1<<7) #define LED4 (1<<8) #define READ_KEY(x) (GPGDAT & (x)) #define TURN_ON(x) (GPBDAT &= ~(x)) #define TURN_OFF_LEDS (GPBDAT |= LED1 | LED2 | LED3 | LED4) #define TURN_ON_LEDS (GPBDAT &= ~(LED1 | LED2 | LED3 | LED4)) void Key_led_init(void) { //LED Init GPBCON &= ~((3<<10) | (3<<12) | (3<<14) | (3<<16)); GPBCON |= (1<<10) | (1<<12) | (1<<14) | (1<<16); //LED_IO configure output TURN_OFF_LEDS; //KEY Init GPGCON &= 0x0; } void Key_scan(void) { if(READ_KEY(KEY1) == 0) TURN_ON(LED1); else if(READ_KEY(KEY2) == 0) TURN_ON(LED2); else if(READ_KEY(KEY3) == 0) TURN_ON(LED3); else if(READ_KEY(KEY4) == 0) TURN_ON(LED4); else TURN_OFF_LEDS; } int main(void) { Key_led_init(); while(1) { Key_scan(); } }
#ifndef _CFG_H #define _CFG_H typedef unsigned int u32; typedef unsigned short u16; typedef unsigned char u8; typedef signed int s32; typedef signed short s16; typedef signed char s8; #endif