一步步点亮LED4_用位运算实现复杂点亮要求

本文介绍了如何通过位运算在嵌入式系统中控制LED灯的亮灭,以实现特定的点亮模式。首先回顾了之前的代码优化技巧,然后提出了如何只点亮中间1颗LED的问题。分析表明,可以通过修改GPJ0DAT寄存器的特定位来实现。文章讨论了直接赋值的缺点,并提出了使用位运算(如位与、位或、位移)作为解决方案,以提高代码的可读性和可维护性。最后,扩展讨论了如何熄灭中间LED并点亮两侧LED的方法。
摘要由CSDN通过智能技术生成

上节回顾:代码写的更漂亮一些
1、用宏定义寄存器名字。
2、用b .来实现死循环
3、用.global把_start链接属性改为外部,消除警告
编译时警告信息:arm-linux-ld warning: cannot find entry symbol _start: defaulting to 00000000没有找到 _start: 因为_start的作用域是文件内。外面的文件看不见编译链接时就报错。解决办法是在_start前加(.global)把链接属性改为外部可见。
1、问题提出:如何只点亮中间1颗(两边是熄灭的)LED
分析:程序其实就是写了GPJ0CON和GPJ0DAT这2个寄存器而已,功能更改也要从这两个下手。
GPJ0CON寄存器不需要修改,GPJ0DAT中设置相应的输出值即可。
2、直接解法(不使用位运算)和它的弊端
GPJ0DAT= 0x28(十六进制)、(二进制0b00101000 ) 因为GPJ0DAT只有8个bit位。我们现在要设置的是要把中间的也就是第4位写入0两边的3和5写入1其余位不关心。
总结:(1)这样写可以完成任务
(2)这样写有缺陷。缺陷就是需要人为的去计算这个特定的设置值:而且看代码的也不容易看懂。
解决方案:在写代码时用位运算去让编译器帮我们计算这个特定值。(这里用位运算只影响编译时间,不会影响运行 时间,所以直解写法也提高不了程序运行速度)
3、常用位运算:与、或、非、移位
位与(&) 位或(|) 位非(取反~) 移位 (左移 << 右移 >>)
GPJ0DAT寄存器8bit图

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值