ARM裸机实现led循环闪烁

最近把我的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,明白了吧.


 

你可能感兴趣的:(linux内核及驱动开发)