完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
之前一直用汇编编写51的程序,感觉比较复杂的运算还是蛮麻烦的,于是就开始学习C51编程,看到书里的实例中对一些不能进行位寻址的特殊寄存器的置位,往往都采用了或逻辑运算来实现(|=),尤其在程序开始时就需要初始化定义的特殊寄存器,为什么不直接赋值而需要用或逻辑运算?简单举个例子,程序中只需要使用T0,8位重装模式,照汇编里的习惯直接TMOD赋值(TMOD=0x02),但是书里面却使用了 TMOD|=0x02。实在不明白为啥。还望各位大侠指点小的一二,在此表示非常感谢
|
|
相关推荐
4个回答
|
|
本帖最后由 qiu452555846 于 2021-8-6 17:09 编辑
在嵌入式C程序中,经常使用“|”,“&”,“^”等运算符,对变量或寄存器的某一个或某几个位进行置1、清0和取反操作。 置1: P0 |= 0b1000 0000; //将P0的bit7置1,同时不影响P0的其它位 P0 |= 0b1100 0000; //将P0的bit7和bit6置1,同时不影响P0的其它位 清0: P0 &= 0b0111 1111; //将P0的bit7清0,同时不影响P0的其它位 P0 &= 0b0011 1111; //将P0的bit7和bit6清0,同时不影响P0的其它位 取反: P0 ^= 0b1000 0000; //将P0的bit7取反,同时不影响P0的其它位 P0 ^= 0b1100 0000; //将P0的bit7和bit6取反,同时不影响P0的其它位 以上代码,只在支持二进制的编译器下才能工作。而keil不支持二进制,所以可改为以下写法: 置1: P0 |= 0x80; //将P0的bit7置1,同时不影响P0的其它位 P0 |= 0xC0; //将P0的bit7和bit6置1,同时不影响P0的其它位 清0: P0 &= ~0x80; //将P0的bit7清0,同时不影响P0的其它位 P0 &= ~0xC0; //将P0的bit7和bit6清0,同时不影响P0的其它位 取反: P0 ^= 0x80; //将P0的bit7取反,同时不影响P0的其它位 P0 ^= 0xC0; //将P0的bit7和bit6取反,同时不影响P0的其它位 更直观的写法是: #define BIT(X) (1<<(X)) 这样, BIT(0)会被展开为1 << 0,即0b0000 0001 << 0,即0b0000 0001,即0x01 BIT(1)会被展开为1 << 1,即0b0000 0001 << 1,即0b0000 0010,即0x02 BIT(0)会被展开为1 << 2,即0b0000 0001 << 2,即0b0000 0100,即0x04 …… BIT(1)会被展开为1 << 7,即0b0000 0001 << 7,即0b1000 0000,即0x80 于是, BIT(7)|BIT(6)会被展开为0b1000 000 | 0b0100 0000,即0x80 | 0x40,即0xC0 于是, 置1: P0 |= BIT(7); //将P0的bit7置1,同时不影响P0的其它位 P0 |= BIT(7)|BIT(6); //将P0的bit7和bit6置1,同时不影响P0的其它位 清0: P0 &= ~BIT(7); //将P0的bit7清0,同时不影响P0的其它位 P0 &= ~(BIT(7)|BIT(6)); //将P0的bit7和bit6清0,同时不影响P0的其它位 取反: P0 ^= BIT(7); //将P0的bit7取反,同时不影响P0的其它位 P0 ^= BIT(7)|BIT(6); //将P0的bit7和bit6取反,同时不影响P0的其它位
最佳答案
|
|
|
|
看看有没有大神来解答一下
|
|
|
|
每个寄存器都有好多不同的位,他们有着不同的功能,你给2之后其他位你都赋0了相当于,如果之前他有其他位你用了,相当于你给人家改了,所以用或运算,这样其他位都不会受影响
|
|
3 条评论
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
7 浏览 0 评论
26 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
13 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
644 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1000 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11771 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 18:17 , Processed in 0.814006 second(s), Total 102, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号