关于逻辑键盘点亮LED实验

angrad 2011-05-25 04:07:51
保证会结贴!帐号之前别人用来发过两个问题,我刚结贴了!

int main(void)
{
int i=0, a[4] = {0,3,5,6};
unsigned long t;
Init();
while(1)
{
t = GPGDAT;
for(i=0; i<4; i++)
{
if(t & (1<<a[i]))
{
Off(i+1);
}
else
{
On(i+1);
}
}
}
return 0;
}


我很是奇怪,在用键盘点亮LED灯的实验中。我直接写1<<a[i],烧到板内4个LED都亮,按KEY没用。
当我把FOR循环拆开,写成4个if else语句,并且把a[i]响应的变成0,3,5,6。这样才能正常地一次按KEY1点亮LED1,按key2点亮LED2。
不知道是我有点迷糊,还是其它原因,或许大家能帮助我一下。
...全文
113 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
angrad 2011-05-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tracyjk 的回复:]

看看你按下的时候GPGDAT的值
[/Quote]

用AXD调试是正常的。但是直接烧进去不OK。
tracyjk 2011-05-27
  • 打赏
  • 举报
回复
看看你按下的时候GPGDAT的值
angrad 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhaokai3000 的回复:]

这样呢?
C/C++ code

int main(void)
{
int i=0, a[4] = {0,3,5,6};
Init();
while(1)
{
for(i=0; i<4; i++)
{
if(GPGDAT & (1<<a[i]))
{
……
[/Quote]

一样的情况,还是不行。
我用了-Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding几个选项
angrad 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhaokai3000 的回复:]

在for循环中printf一下a[i]和i,看看是不是没变
定义改成:
volatile int i=0;
int a[4] = {0,3,5,6};
试试?
[/Quote]

这下四个灯都不亮,按KEY也没用。
zhaokai3000 2011-05-26
  • 打赏
  • 举报
回复
这样呢?

int main(void)
{
int i=0, a[4] = {0,3,5,6};
Init();
while(1)
{
for(i=0; i<4; i++)
{
if(GPGDAT & (1<<a[i]))
{
Off(i+1);
}
else
{
On(i+1);
}
}
}
return 0;
}

zhaokai3000 2011-05-26
  • 打赏
  • 举报
回复
程序看起来好像没啥问题,不知道是不是编译器给优化出问题了。
zhaokai3000 2011-05-26
  • 打赏
  • 举报
回复
在for循环中printf一下a[i]和i,看看是不是没变
定义改成:
volatile int i=0;
int a[4] = {0,3,5,6};
试试?
angrad 2011-05-25
  • 打赏
  • 举报
回复
是的!
zhaokai3000 2011-05-25
  • 打赏
  • 举报
回复
从程序看,是直接根据GPIO的GPG0、GPG3、GPG5、GPG6口状态设置LED开关状态的吧?

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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