主题 : FriendlyARM点灯实验 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 34018
精华: 0
发帖: 5
金钱: 25 两
威望: 5 点
贡献值: 0 点
综合积分: 10 分
注册时间: 2010-12-09
最后登录: 2012-07-25
楼主  发表于: 2012-07-24 11:28

 FriendlyARM点灯实验

友善之臂的ARM9板子做实验发现:
/* key_led.c */

#define GPBCON      (*(volatile unsigned long *)0x56000010)
#define GPBDAT      (*(volatile unsigned long *)0x56000014)

#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))


/*
* KEY1~4, GPG0/GPG3/GPG5/GPG6
*/
#define GPG0_in     (0 << (0 * 2))
#define GPG3_in     (0 << (3 * 2))
#define GPG5_in     (0 << (5 * 2))
#define GPG6_in     (0 << (6 * 2))

int main()
{
        unsigned long dwDat;

        GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out;

        GPGCON = GPG0_in & GPG3_in & GPG5_in & GPG6_in;
        while(1)
        {
            dwDat = GPGDAT;            

        /* 对应位同1做与运算,低电平LED亮 */
            if (dwDat & (1<<0))
                GPBDAT |= (1 << 5);       // LED1 turn off
            else
                GPBDAT &= ~(1 << 5);      // LED1 turn on

            if (dwDat & (1<<3))
                GPBDAT |= ( 1 << 6);      // LED2 turn off
            else
                GPBDAT &= ~(1 << 6);      // LED2 turn on

            if (dwDat & (1<<5))
                GPBDAT |= (1 << 7);       // LED3 turn off
            else
                GPBDAT &= ~(1 << 7);      // LED3 turn on

            if (dwDat & (1 << 6))
                GPBDAT |= (1 << 8);        // LED4 turn off
            else
                GPBDAT &= ~(1 << 8);      // LED4 turn on
        }

    return 0;
}

这段代码可以很方便准确地实现,按键1、2、3、4对应LED灯1、2、3、4。上述代码详实,直白,我将其中main函数的while循环内容改为如

下:
            GPBDAT =  ( ((GPGDAT & 0x01 ) << 5)
                      | ((GPGDAT & 0x08 ) << 6)
                      | ((GPGDAT & 0x32 ) << 7)
                      | ((GPGDAT & 0x64 ) << 8));

这段代码显得简洁,但是达不到预期效果,只有按键1对应LED灯1有反应,其余皆为,而且上电后LED2、3是常亮。

不知为何?


级别: 新手上路
UID: 34018
精华: 0
发帖: 5
金钱: 25 两
威望: 5 点
贡献值: 0 点
综合积分: 10 分
注册时间: 2010-12-09
最后登录: 2012-07-25
1楼  发表于: 2012-07-25 14:48
GPBDAT = ( ((GPGDAT & 0x01 ) << 5)
  | ((GPGDAT & 0x08 ) << 6)
  | ((GPGDAT & 0x32 ) << 7)
  | ((GPGDAT & 0x64 ) << 8));

应该为:
GPBDAT = ( ((GPGDAT & 1 ) << 5)
  | ((GPGDAT & 8 ) << 6)
  | ((GPGDAT & 32 ) << 7)
  | ((GPGDAT & 64 ) << 8));

实验成功,我总是犯一些低级错误。
级别: 新手上路
UID: 132059
精华: 0
发帖: 32
金钱: 160 两
威望: 32 点
贡献值: 0 点
综合积分: 64 分
注册时间: 2017-04-16
最后登录: 2019-06-21
2楼  发表于: 2017-04-19 00:56
请问你改了哪里呢?难道0x01和1不一样?