主题 : 帮我看看这个问题。mini2440板 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 9820
精华: 0
发帖: 70
金钱: 550 两
威望: 224 点
综合积分: 140 分
注册时间: 2009-10-14
最后登录: 2018-02-08
楼主  发表于: 2009-11-07 23:06

 帮我看看这个问题。mini2440板

管理提醒: 本帖被 qq2440 从 mini2440资料下载中心 移动到本区(2009-11-08)
define GPBCON      (*(volatile unsigned long *)0x56000010)
#define GPBDAT      (*(volatile unsigned long *)0x56000014)

#define GPFCON      (*(volatile unsigned long *)0x56000050)
#define GPFDAT      (*(volatile unsigned long *)0x56000054)

#define GPGCON      (*(volatile unsigned long *)0x56000060)
#define GPGDAT      (*(volatile unsigned long *)0x56000064)

/*
* LED1-4对应GPB5、GPB6、GPB7、GPB8
*/
#define GPB5_out        (1<<(5*2))
#define GPB6_out        (1<<(6*2))
#define GPB7_out        (1<<(7*2))
#define GPB8_out        (1<<(8*2))

/*
* K1-K4对应GPG0、GPG3、GGF5、GPG6
*/
#define GPG0_in    ~(3<<(0*2))
#define GPG3_in     ~(3<<(3*2))
#define GPG5_in     ~(3<<(5*2))
#define GPG6_in     ~(3<<(6*2))

int main()
{
        unsigned long dwDat;
        // LED1-LED4对应的4根引脚设为输出
        GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out ;

        // K1-K2对应的2根引脚设为输入
        GPGCON = GPG0_in & GPG3_in & GPG5_in & GPG6_in ;
        
        // K3-K4对应的2根引脚设为输入
      //  GPFCON = GPF2_in & GPF0_in ;

        while(1){
            //若Kn为0(表示按下),则令LEDn为0(表示点亮)
            dwDat = GPGDAT;             // 读取GPG管脚电平状态
        
            if (dwDat & (1<<0))        // K1没有按下
                GPBDAT |= (1<<5);       // LED1熄灭
            else    
                GPBDAT &= ~(1<<5);      // LED1点亮
                
            if (dwDat & (1<<3))         // K2没有按下
                GPBDAT |= (1<<6);       // LED2熄灭
            else    
                GPBDAT &= ~(1<<6);      // LED2点亮
    
           // dwDat = GPFDAT;             // 读取GPF管脚电平状态
            
            if (dwDat & (1<<5))         // K3没有按下
                GPBDAT |= (1<<7);       // LED3熄灭
            else    
                GPBDAT &= ~(1<<7);      // LED3点亮
    
            if (dwDat & (1<<6))         // K4没有按下
                GPBDAT |= (1<<8);       // LED4熄灭
            else    
                GPBDAT &= ~(1<<8);      // LED4点亮
    }

    return 0;
}

本意是要按哪个按键就亮对应ELD。可是按键没有反应,有一个LED3常亮。程序烧写在SDRAM内存运行。
级别: 新手上路
UID: 6676
精华: 0
发帖: 8
金钱: 70 两
威望: 37 点
综合积分: 16 分
注册时间: 2009-06-11
最后登录: 2010-11-16
1楼  发表于: 2009-11-08 21:21
* K1-K4对应GPG0、GPG3、GPG5、GPG6

// K1-K4对应的4根引脚设为输入
        GPGCON = GPG0_in & GPG3_in & GPG5_in & GPG6_in ;
级别: 新手上路
UID: 7306
精华: 0
发帖: 6
金钱: 55 两
威望: 26 点
综合积分: 12 分
注册时间: 2009-07-09
最后登录: 2010-07-21
2楼  发表于: 2009-11-08 22:20
  GPGCON &= GPG0_in & GPG3_in & GPG5_in & GPG6_in ;
级别: 新手上路
UID: 7306
精华: 0
发帖: 6
金钱: 55 两
威望: 26 点
综合积分: 12 分
注册时间: 2009-07-09
最后登录: 2010-07-21
3楼  发表于: 2009-11-08 22:22
while(1){
         //若Kn为0(表示按下),则令LEDn为0(表示点亮)
         GPBDAT = ((GPGDAT & 0x01) << 5)      // GPG0->GPB5,左移5位
                     | ((GPGDAT & 0x08) << 3) // GPG3->GPB6, 左移3位
                     | ((GPGDAT & 0x60) << 2);// GPG5->GPB7,GPG6->GPB8, 左移2位  
     }