Chinaunix首页 | 论坛 | 博客
  • 博客访问: 378760
  • 博文数量: 56
  • 博客积分: 1449
  • 博客等级: 中尉
  • 技术积分: 822
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-08 10:24
文章分类

全部博文(56)

文章存档

2014年(7)

2012年(13)

2011年(10)

2010年(26)

分类:

2010-11-27 00:56:48

通过查看开发板的核心电路原理图,加上查阅SUMSANG 2440的datasheed得知四个按键K1,K2,K3,K4对应GPF中的GPF1,GPF4,GPF2,GPF0。将这四个引脚配置为输入模式, 这样通过GPFDAT寄存器中的相应为来得知哪个键被按下,当某个键被按下时,相应连接引脚接地,为低电平,在GPFDAT中相应的为表现为逻辑0。否则 为1。


设置C语言环境的汇编文件和循环点亮LED灯的实验中的一样,Makefile也不需要修改,当然,如果改变源文件的名称还是需要去修改Makefile的。贴出main.c文件如下:

#define GPBCON    (*(volatile unsigned long *)0x56000010)
#define GPBDAT    (*(volatile unsigned long *)0x56000014)
#define LED4_SET_OUTPUT ((1<<10) | (1<<12) | (1<<14) | (1<<16))
#define LED1_ON    (~(1<<5))
#define LED2_ON (~(1<<6))
#define LED3_ON (~(1<<7))
#define LED4_ON (~(1<<8))

#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
#define KEY4_SET_INPUT (~((3<<0) | (3<<2) | (3<<4) | (3<<8)))

#define KEY_1    (1 << 1)
#define KEY_2    (1 << 4)
#define KEY_3    (1 << 2)
#define KEY_4    (1 << 0)

#define __IS_KEY_PRESSED(dat, keyno) \
     (!(dat & KEY_##keyno))

int main(void)
{
    volatile unsigned long dat;
    GPBCON |= LED4_SET_OUTPUT;
    GPFCON |= KEY4_SET_INPUT;
    while(1) {
        dat = GPFDAT;
        #define IS_KEY_PRESSED(n) __IS_KEY_PRESSED(dat, n)
        if(IS_KEY_PRESSED(1))
            GPBDAT = LED1_ON;
        else if(IS_KEY_PRESSED(2))
            GPBDAT = LED2_ON;
        else if(IS_KEY_PRESSED(3))
            GPBDAT = LED3_ON;
         else if(IS_KEY_PRESSED(4))
            GPBDAT = LED4_ON;
    }
    return 0;
}
阅读(2755) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~