S3C2440A有九组IO口,共130个。每组IO口数目不同,其中A组口只有输出功能。截图如下:
关于对IO口的操作,就主要设计到3个寄存器。GPXCON(配置),GPXUP(上拉使能),GPXDAT(数据)。其中GPXCON配置IO寄存器中每两位控制1个IO口。00表示输入,01表示输出,10表示第三功能,11保留。
对数据寄存器GPXDAT的操作则是相应位写1高电平,写0低电平。上拉是能寄存器GPXUP则是相应位为1时禁止相应端口的上拉电阻,为0使能。
下面的代码实现了实现按下某个按键时,相应LED亮,松开按键时LED灭。练习了IO口德输入与输出。
下面是我的原理图跟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