帮忙看个“两只LED交替闪烁”的代码。

5 views
Skip to first unread message

王硕

unread,
Apr 15, 2009, 10:16:18 AM4/15/09
to 周立功C语言俱乐部
代码如下:

//两只LED交替闪烁
#include "systemInit.h"

//定义LED
#define LED_PERIPH SYSCTL_PERIPH_GPIOG
#define LED_PORT GPIO_PORTG_BASE //GPIOG的基址(0x40026000)
#define LED_PINS GPIO_PIN_2|GPIO_PIN_3

//主函数(程序入口)
int main(void)
{
unsigned char ucVal;

jtagWait(); //防止JTAG失效,重要!
clockInit(); //时钟初始化:晶振,6HZ

SysCtlPeriEnable(LED_PERIPH );
GPIOPinTypeOut(LED_PORT,LED_PINS);
ucVal=(0<<2)|(1<<3);

for(;;)
{
GPIOPinWrite(LED_PORT,LED_PINS,ucVal);
ucVal^=(0<<2)|(1<<3); //反转LED亮灭状态
SysCtlDelay(150*(TheSysClock/3000)); //延时约150ms
}
}

是资料上的一个例子,我写到ARM1138板子里后,出现的问题如下:
LED2 红色的灯一直亮着
LED3 再闪

不能够达到资料上所描述的:两只LED在不断交替闪烁。

我看的不太明白的几处代码:
ucVal=(0<<2)|(1<<3);

ucVal^=(0<<2)|(1<<3); //反转LED亮灭状态


还望高手指教!谢谢拉!

王硕

unread,
Apr 15, 2009, 11:12:50 AM4/15/09
to 周立功C语言俱乐部
我试了下,发现资料中这一句对LED亮灭的初始状态定义有些问题
ucVal=(0<<2)|(1<<3);
应该改为:
ucVal=(~(1<<2))|(1<<3);
关于这个我凑合能想明白了,但是具体是怎么回事,我还是不太明白。望高手解答!谢谢啦!

王硕

unread,
Apr 15, 2009, 11:14:01 AM4/15/09
to 周立功C语言俱乐部
还需要把

ucVal^=(0<<2)|(1<<3); //反转LED亮灭状态
改为
ucVal^=(1<<2)|(1<<3); //反转LED亮灭状态


On 4月15日, 下午10时16分, 王硕 <wangshuo2...@gmail.com> wrote:

宋飞

unread,
Apr 15, 2009, 9:11:13 PM4/15/09
to zl...@googlegroups.com
2009/4/15 王硕 <wangsh...@gmail.com>:

我觉得这个貌似是 ~=表示去反赋值的意思吧

这句话就是表示 我生成了一个数 他的第2位是0和第三位是1

用2进制写

0<<2表示 XXXXXX0X

1<<3表示 XXXXX1XX

这两个按位或 最后得到的是 XXXXX10X

这样就会把相应的两位写入寄存器 也就可以操纵GPIO 相应管教的高低电平了

在电路连接上 好像采取的灌电流方式 可以提高GPIO 的驱动能力 所以置零是灯亮


>
>
> 还望高手指教!谢谢拉!

--
欢迎访问我的网站:http://songfei.org

王硕

unread,
Apr 16, 2009, 8:10:23 AM4/16/09
to 周立功C语言俱乐部
OK 这下好了
那两行代码是这样的:
ucVal=0<<2|1<<3; //设置LED亮灭的初始状态 运算后得到XXXXX10X,表示第二个LED亮。(记得因为1138板子上的
二极管是共阳极的缘故,所以接低电位,即"0"的时候亮)
ucVal^=1<<2|1<<3; //1<<2|1<<3运算后得到XXXXX11X,取反赋值得到XXXXX00X(对不?),逻辑上表示
LED2和LED3都亮。

用那个地址(是不是应该这样称呼?)也可以写成(运算成功):
ucVal=(~0X0D)|0X0B; //设置LED亮灭的初始状态 (~0X0D)|0X0B运算后得到0X0A(二进制表示
00001010? 貌似这样的话LED1也是亮的?)
ucVal^=0X0D|0X0B; //运算后得到0XFF 二进制表示11111111,即全部熄灭。但是这个代码实现的功能是反转LED亮灭状
态 。??

On 4月16日, 上午9时11分, 宋飞 <songfei....@gmail.com> wrote:
> 2009/4/15 王硕 <wangshuo2...@gmail.com>:

Message has been deleted

王硕

unread,
Apr 16, 2009, 8:21:23 AM4/16/09
to 周立功C语言俱乐部
刚这句打错了:

ucVal^=0X0D|0X0B; //运算后得到0XFF 二进制表示11111111,即全部熄灭。但是这个代码实现的功能是反转LED亮灭

态 。??

应该是:
ucVal^=0X0D|0X0B; //运算后得到0X00 二进制表示00000000,即全部点亮。但是这个代码实现的功能是反转LED亮灭

态 。??

On 4月16日, 上午9时11分, 宋飞 <songfei....@gmail.com> wrote:
> 2009/4/15 王硕 <wangshuo2...@gmail.com>:
>
>
>
>
>

宋飞

unread,
Apr 17, 2009, 12:01:24 AM4/17/09
to zl...@googlegroups.com
2009/4/16 王硕 <wangsh...@gmail.com>:

> OK 这下好了
> 那两行代码是这样的:
> ucVal=0<<2|1<<3; //设置LED亮灭的初始状态 运算后得到XXXXX10X,表示第二个LED亮。(记得因为1138板子上的
> 二极管是共阳极的缘故,所以接低电位,即"0"的时候亮)
> ucVal^=1<<2|1<<3; //1<<2|1<<3运算后得到XXXXX11X,取反赋值得到XXXXX00X(对不?),逻辑上表示
> LED2和LED3都亮。

你这句不对 ^=不是取反赋值 是按位异或 也就是说

是用原来的数 去按位异或 000000110

如果原来的数的对应的那一位是0 那与0异或 结果是0 没有改变 与1异或 结果是1 结果原来数的那一位取反了

如果原来是1也是一样的

所以 这句话是在不改变别的位的情况下 把那两位取反了

>
> 用那个地址(是不是应该这样称呼?)也可以写成(运算成功):
> ucVal=(~0X0D)|0X0B; //设置LED亮灭的初始状态 (~0X0D)|0X0B运算后得到0X0A(二进制表示
> 00001010? 貌似这样的话LED1也是亮的?)
> ucVal^=0X0D|0X0B; //运算后得到0XFF 二进制表示11111111,即全部熄灭。但是这个代码实现的功能是反转LED亮灭状
> 态 。??
>
> On 4月16日, 上午9时11分, 宋飞 <songfei....@gmail.com> wrote:
>> 2009/4/15 王硕 <wangshuo2...@gmail.com>:
>>
>>
>>

你后面写的这些我就看不明白了~~~

--
欢迎访问我的网站:http://songfei.org

来凯

unread,
Apr 19, 2009, 11:24:47 AM4/19/09
to 周立功C语言俱乐部
1<<3的意思是把1想右移位运算,不够的用0补 即 1<<3 1000

On 4月16日, 上午9时11分, 宋飞 <songfei....@gmail.com> wrote:
> 2009/4/15 王硕 <wangshuo2...@gmail.com>:
>
>
>
>
>

> 欢迎访问我的网站:http://songfei.org- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Niu Tao

unread,
Apr 20, 2009, 12:06:32 AM4/20/09
to zl...@googlegroups.com
2009/4/19 来凯 <laikai...@sina.com>:

> 1<<3的意思是把1想右移位运算,不够的用0补  即 1<<3  1000
<< 是左移的意思,不是右移!!

--
------------------
running out of a problem is not a solution,sit and face it

来凯

unread,
Apr 21, 2009, 11:31:56 AM4/21/09
to 周立功C语言俱乐部

呵呵呵 当时着急,打错了,是左移~~ 不好意思
On 4月20日, 下午12时06分, Niu Tao <niutao0...@gmail.com> wrote:
> 2009/4/19 来凯 <laikaifrie...@sina.com>:> 1<<3的意思是把1想右移位运算,不够的用0补 即 1<<3 1000
> >> 欢迎访问我的网站:http://songfei.org-隐藏被引用文字 -

>
> >> - 显示引用的文字 -
>
> --
> ------------------
> running out of a problem is not a solution,sit and face it- 隐藏被引用文字 -
>
> - 显示引用的文字 -
Reply all
Reply to author
Forward
0 new messages