ARM裸机实现led循环闪烁
2012-06-14 09:06
543 查看
最近把我的ARM板当成单片机用,想通过这来给自己硬件方面充电点,虽然这方面不难,但是问题还是挺多的(可能是我的硬件知识天生的差劲吧)。下面介绍下我在编写我的第一个led点亮程序时遇到的问题。
首先,介绍下我的led资源,总共4个led,分别对应GPB5,GPB6,GPB7,GPB8。下面是我点亮四个灯相关程序:
下面是显示程序:
如果你这样写,很多人会发现,这应该没错误啊,可是当你下载到ARM板上去的时候,你就会发现,led在第三个led的时候,就出问题了。why?
首先,介绍下我的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,明白了吧.
相关文章推荐
- Zenq系列FPGA双核ARM裸机异步程序实现
- 【嵌入式】——arm裸机开发 step by step 之 按键控制 LED 和 蜂鸣器
- ARM裸机程序开发之led流水灯程序
- 一知半解学CubeMX——TIM:定时中断实现LED闪烁
- 从ARM裸机看驱动之按键中断方式控制LED(二)
- STM32F030, 使用嘀嗒定时器Systick实现LED闪烁
- ARM裸机-3.GPIO和LED
- 如何在平台上实现LED灯的效果?如信号灯,来短信/来电时LED动画闪烁
- SAM4E单片机之旅——1、LED闪烁之空循环
- ARM 裸机程序学习 01 - 点亮LED
- 用uno实现简单的单led灯闪烁
- RK3066 实现LED闪烁的代码分析
- 用Keil-MDK开发TQ2440裸机程序入门教程——LED流水灯实现
- 用定时器实现led闪烁(间隔1s)
- 用Keil-MDK开发TQ2440裸机程序入门教程——LED流水灯实现
- PB口驱动的LED以每秒一次的频率循环闪烁
- mini2440(4) 我的第一个ARM汇编程序---LED灯裸机硬件控制程序
- arm裸机程序--LED程序设计
- Cubieboard2裸机开发之(二)板载LED交替闪烁
- STM32F030, 使用嘀嗒定时器Systick实现LED闪烁