ARM9点灯实验

cang_rong 2012-07-24 11:13:46
友善之臂的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是常亮。

不知为何?


...全文
189 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cang_rong 2012-07-25
  • 打赏
  • 举报
回复
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));

实验成功,我总是犯一些低级错误。
cang_rong 2012-07-25
  • 打赏
  • 举报
回复
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));

实验成功,我总是犯一些低级错误。
lengxujun5000 2012-07-24
  • 打赏
  • 举报
回复
这样真的能看到效果吗?
中间没有任何延时操作,可能的结果是,如果某个灯一开始是亮的,很可能一直长亮,因为变化太快,根本看不到变化.
Tchely.Pan 2012-07-24
  • 打赏
  • 举报
回复
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));

1楼正解
犇犇犇程序猿 2012-07-24
  • 打赏
  • 举报
回复
1<<3= 8 , 1<<5 =32 ,1<<6 =64. 你加个16进制,不错能行么?

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧