完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
主要是位操作的一些技巧,在文章最后,还补充了几点其他的,比如ifdef的使用
位操作 1.把变量的某位清零。 //定义一个变量 a = 1001 1111 unsigned char a = 0x9f; a &= ~(1<<2); //括号中的 1 左移两位,(1<<2)得二进制数:0000 0100 //按位取反,~(1<<2)得 1111 1011 //所得的数与 a 作”位与&”运算,a = (1001 1111)&(1111 1011) //经过运算后,a 的值 a=1001 1011 2.把变量的某几个连续位清零 //若把 a 中的二进制位分成 2 个一组 //即 bit0、bit1 为第 0 组,bit2、bit3 为第 1 组, // bit4、bit5 为第 2 组,bit6、bit7 为第 3 组 //要对第 1 组的 bit2、bit3 清零 a &= ~(3<<2*1) //括号中的 3 左移两位,(3<<2*1)得二进制数:0000 1100 b //按位取反,~(3<<2*1)得 1111 0011 b //假如 a 中原来的值为二进制数: a = 1001 1111 b //所得的数与 a 作”位与&”运算,a = (1001 1111 )&(1111 0011 ), //经过运算后,a 的值 a=1001 0011 b // a 的第 1 组的 bit2、bit3 被清零,而其它位不变。 //上述(~(3<<2*1))中的(1)即为组编号;如清零第 3 组 bit6、bit7 此处应为 3 //括号中的(2)为每组的位数,每组有 2 个二进制位;若分成 4 个一组,此处即为 4 //括号中的(3)是组内所有位都为 1 时的值;若分成 4 个一组,此处即为二进制数“1111 ”,即十进制f //例如对第 2 组 bit4、bit5 清零 a &= ~(3<<2*2); 3.对变量的某几位进行赋值。 /*********************法1********************************/ //a = 1000 0011 //此时对清零后的第 2 组 bit4、bit5 设置成二进制数“01 ” a |= (1<<2*2); //a = 1001 0011 b,成功设置了第 2 组的值,其它组不变 /*********************法2********************************/ GPIOA->ODR &=0XFF0F; //将第 4-7 位清 0 GPIOA->ODR |=0X0040; //设置相应位的值,不改变其他位的值 4.对变量的某位取反 //a = 1001 0011 //把 bit6 取反,其它位不变 a ^=(1<<6); //异或 1<<6 = 0100 0000 //a = 1101 0011 5.设置某一位的值为 0,同时其他位都为 1 /********简单的作法是直接给寄存器设置一个值*********/ GPIOA->ODR =0xFFF7; //这样的作法设置第 3 位为 0 GPIOA->ODR= (uint16_t)~(1<<3); //设置 ODR 寄存器的第 3 位为 0,其他位为 1 其他 1.ifdef条件编译 #ifdef 标识符 程序段1 #else 程序段2 #endif if——else是不执行if后的程序,就执行else后的程序,而这个是编译,不编译程序段1就编译程序段2。 #ifdef APR void test_APR(void) { printf("APR is defined."); } #else void test_APR(void)//两个函数是同名的 { printf("APR is not defined."); } #endif 可以看到两个函数是同名的,但是只会二选一编译,所以不会报错,只要加上#define APR就会执行第一段 2.__weak弱函数(两个下划线) 加上__weak 的函数,我们自己的文件中重新定义一个同名函数,编译的时候,我们自己定义的函数,但如果我们没有重新定义这个函数,就会执行带__weak 的函数,编译不会报错。 weak函数与重写的函数不能在同一文件。 |
|
|
|
只有小组成员才能发言,加入小组>>
3320 浏览 9 评论
3000 浏览 16 评论
3496 浏览 1 评论
9069 浏览 16 评论
4089 浏览 18 评论
1190浏览 3评论
612浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
602浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2339浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1899浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 07:03 , Processed in 1.716436 second(s), Total 83, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号