最近把我的ARM板当成单片机用,想通过这来给自己硬件方面充电点,虽然这方面不难,但是问题还是挺多的(可能是我的硬件知识天生的差劲吧)。下面介绍下我在编写我的第一个led点亮程序时遇到的问题。
首先,介绍下我的led资源,总共4个led,分别对应GPB5,GPB6,GPB7,GPB8。下面是我点亮四个灯相关程序:
void Led_Display(int LedStatus)
{
/*
Active is low.(LED On)
8 7 6 5
GPB8 GPB7 GPB6 GPB5
nLED_4 nLED_3 nLED_2 nLED_1
rGPFDAT = (rGPFDAT & 0xf) | !((data & 0xf)<<4);
*/
if((LedStatus&0x01)==0x01) //PB5状态设置
rGPBDAT=rGPBDAT|0x020; // 0 0010 0000 LED0不亮
else
rGPBDAT=rGPBDAT&0x1c0; //rPDATC |1 1100 0000 点亮LED0
if((LedStatus&0x02)==0x02) //Pb6状态设置
rGPBDAT=rGPBDAT|0x040; //0 0100 0000 LED1不亮
else
rGPBDAT=rGPBDAT&0x1a0; //rPDATC & 1 1010 0000 LED1点亮
if((LedStatus&0x04)==0x04) //Pb6状态设置
rGPBDAT=rGPBDAT|0x080; //0 1000 0000 LED2不亮
else
rGPBDAT=rGPBDAT&0x160; //rPDATC & 1 0110 0000 LED2点亮
if((LedStatus&0x08)==0x08) //PE5状态设置
rGPBDAT=rGPBDAT|0x100;//1 0000 0000 LED3不亮
else
rGPBDAT=rGPBDAT&0x0e0; ////rPDATC &0 1110 0000 LED3点亮
}
下面是显示程序:
void Led_Disp(void)
{
Led_Display(0x08); //LED点亮/熄灭状态设置 LED2是灭的,其它的都是亮的
dely(120); //延时若干个100us
Led_Display(0x04); //LED点亮/熄灭状态设置 LED1是灭的,其它亮
dely(120); //延时若干个100us
Led_Display(0x02); //LED点亮/熄灭状态设置 LED0是灭的,其它亮
dely(120); //延时若干个100us
Led_Display(0x01); //LED点亮/熄灭状态设置 LED0是灭的,其它亮
dely(120); //延时若干个100us
Led_Display(0x02); //LED点亮/熄灭状态设置
dely(120); //延时若干个100us
Led_Display(0x04); //LED点亮/熄灭状态设置 LED0是灭的,其它亮
dely(120); //延时若干个100us
Led_Display(0x08); //LED点亮/熄灭状态设置
dely(120); //延时若干个100us
}
这里很容易将" | " 跟" & "的关系搞乱,同时注意了,这是我出错前的代码:
void Led_Display(int LedStatus)
{
/*
Active is low.(LED On)
8 7 6 5
GPB8 GPB7 GPB6 GPB5
nLED_4 nLED_3 nLED_2 nLED_1
rGPFDAT = (rGPFDAT & 0xf) | !((data & 0xf)<<4);
*/
if((LedStatus&0x01)==0x01) //PB5状态设置
rGPBDAT=rGPBDAT|0x020; // 0 0010 0000 LED0不亮
else
rGPBDAT=rGPBDAT&0x1c0; //rPDATC |1 1100 0000 点亮LED0
if((LedStatus&0x02)==0x02) //Pb6状态设置
rGPBDAT=rGPBDAT|0x040; //0 0100 0000 LED1不亮
else
rGPBDAT=rGPBDAT&0x1a0; //rPDATC & 1 1010 0000 LED1点亮
if((LedStatus&0x03)==0x03) //Pb6状态设置
rGPBDAT=rGPBDAT|0x080; //0 1000 0000 LED2不亮
else
rGPBDAT=rGPBDAT&0x160; //rPDATC & 1 0110 0000 LED2点亮
if((LedStatus&0x04)==0x04) //PE5状态设置
rGPBDAT=rGPBDAT|0x100;//1 0000 0000 LED3不亮
else
rGPBDAT=rGPBDAT&0x0e0; ////rPDATC &0 1110 0000 LED3点亮
}
如果你这样写,很多人会发现,这应该没错误啊,可是当你下载到ARM板上去的时候,你就会发现,led在第三个led的时候,就出问题了。why?
首先肯定LedStatus&0x03)==0x03这肯定出问题了,但是什么问题呢?我就将第三个led熄灭情况调试了下,原来如此0000 0011&0000 0001=0000 0001,明白了吧.