主题 : 按键控制 LED 问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 59981
精华: 0
发帖: 34
金钱: 175 两
威望: 35 点
贡献值: 0 点
综合积分: 68 分
注册时间: 2011-12-02
最后登录: 2012-05-09
楼主  发表于: 2012-03-29 15:22

 按键控制 LED 问题

   按键按下无反应帮忙看下,代码如下:
tiny6410板子
#define GPKCON      (*(volatile unsigned long *)0x7F008800)
#define GPKDAT      (*(volatile unsigned long *)0x7F008808)

#define GPNCON      (*(volatile unsigned long *)0x7F008830)
#define GPNDAT      (*(volatile unsigned long *)0x7F008834)

/*
* LED1,LED2,LED4对应GPK4、GPK5、GPK6、GPK7
*/
#define    GPk4_out    (1<<(4*4))
#define    GPk5_out    (1<<(5*4))
#define    GPk6_out    (1<<(6*4))
#define    GPk7_out    (1<<(7*4))

#define    GPk4_msk    (3<<(4*4))
#define    GPk5_msk    (3<<(5*4))
#define    GPk6_msk    (3<<(6*4))
#define    GPk7_msk    (3<<(7*4))

/*
* K1,K2,K3,K4对应GPG0,GPG3,GPG5,GPG6
*/
#define GPG0_in     (0<<(0*2))
#define GPG1_in     (0<<(1*2))
#define GPG2_in     (0<<(2*2))
#define GPG3_in     (0<<(3*2))

#define GPG0_msk    (3<<(0*2))
#define GPG1_msk    (3<<(1*2))
#define GPG2_msk    (3<<(2*2))
#define GPG3_msk    (3<<(3*2))

int main()
{
        unsigned long dwDat;
        // LED1,LED2,LED3,LED4对应的4根引脚设为输出
        GPKCON &= ~(GPk4_msk|GPk5_msk| GPk6_msk| GPk7_msk);
        GPKCON |= GPk4_out | GPk5_out | GPk6_out | GPk7_out;
        
        // K1,K2,K3,K4对应的4根引脚设为输入
        GPNCON &= ~(GPG0_msk | GPG1_msk | GPG2_msk | GPG3_msk);
        GPNCON |= GPG0_in | GPG1_in | GPG2_in | GPG3_in;

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

    return 0;
}