ARM裸机实现led循环闪烁

来源:互联网 发布:阿里云域名优惠 编辑:程序博客网 时间:2024/05/21 06:18

最近把我的ARM板当成单片机用,想通过这来给自己硬件方面充电点,虽然这方面不难,但是问题还是挺多的(可能是我的硬件知识天生的差劲吧)。下面介绍下我在编写我的第一个led点亮程序时遇到的问题。

首先,介绍下我的led资源,总共4个led,分别对应GPB5,GPB6,GPB7,GPB8。下面是我点亮四个灯相关程序:

void Led_Display(int LedStatus){     /*        Active is low.(LED On)         87   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不亮elserGPBDAT=rGPBDAT&0x1c0; //rPDATC |1 1100 0000 点亮LED0if((LedStatus&0x02)==0x02)//Pb6状态设置rGPBDAT=rGPBDAT|0x040; //0 0100 0000 LED1不亮elserGPBDAT=rGPBDAT&0x1a0; //rPDATC & 1 1010 0000 LED1点亮if((LedStatus&0x04)==0x04)//Pb6状态设置rGPBDAT=rGPBDAT|0x080;  //0 1000 0000 LED2不亮elserGPBDAT=rGPBDAT&0x160;  //rPDATC & 1 0110 0000 LED2点亮if((LedStatus&0x08)==0x08)//PE5状态设置   rGPBDAT=rGPBDAT|0x100;//1 0000 0000 LED3不亮elserGPBDAT=rGPBDAT&0x0e0; ////rPDATC &0 1110 0000  LED3点亮    }

下面是显示程序:

void Led_Disp(void){Led_Display(0x08);//LED点亮/熄灭状态设置 LED2是灭的,其它的都是亮的dely(120);//延时若干个100usLed_Display(0x04);//LED点亮/熄灭状态设置  LED1是灭的,其它亮dely(120);//延时若干个100usLed_Display(0x02);//LED点亮/熄灭状态设置  LED0是灭的,其它亮dely(120);//延时若干个100usLed_Display(0x01);//LED点亮/熄灭状态设置  LED0是灭的,其它亮dely(120);//延时若干个100usLed_Display(0x02);//LED点亮/熄灭状态设置dely(120);//延时若干个100usLed_Display(0x04);//LED点亮/熄灭状态设置  LED0是灭的,其它亮dely(120);//延时若干个100usLed_Display(0x08);//LED点亮/熄灭状态设置dely(120);//延时若干个100us}这里很容易将" | " 跟" & "的关系搞乱,同时注意了,这是我出错前的代码:
void Led_Display(int LedStatus){     /*        Active is low.(LED On)         87   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不亮elserGPBDAT=rGPBDAT&0x1c0; //rPDATC |1 1100 0000 点亮LED0if((LedStatus&0x02)==0x02)//Pb6状态设置rGPBDAT=rGPBDAT|0x040; //0 0100 0000 LED1不亮elserGPBDAT=rGPBDAT&0x1a0; //rPDATC & 1 1010 0000 LED1点亮if((LedStatus&0x03)==0x03)//Pb6状态设置rGPBDAT=rGPBDAT|0x080;  //0 1000 0000 LED2不亮elserGPBDAT=rGPBDAT&0x160;  //rPDATC & 1 0110 0000 LED2点亮if((LedStatus&0x04)==0x04)//PE5状态设置   rGPBDAT=rGPBDAT|0x100;//1 0000 0000 LED3不亮elserGPBDAT=rGPBDAT&0x0e0; ////rPDATC &0 1110 0000  LED3点亮    }

如果你这样写,很多人会发现,这应该没错误啊,可是当你下载到ARM板上去的时候,你就会发现,led在第三个led的时候,就出问题了。why?

首先肯定LedStatus&0x03)==0x03这肯定出问题了,但是什么问题呢?我就将第三个led熄灭情况调试了下,原来如此0000 0011&0000 0001=0000 0001,明白了吧.


 

原创粉丝点击