0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言操作寄存器的常见手法

GReq_mcu168 来源:硬件攻城狮 作者:硬件攻城狮 2022-03-12 09:06 次阅读

使用C语言寄存器赋值时,常常需要用到C语言的位操作方法。把寄存器某位清零假设a代表寄存器,且其中本来已有值。如果要把其中某一位清零且其它位不变,代码如下。

//定义一个变量 a = 1001 1111 b (二进制数)unsigned char a = 0x9f;//对 bit2 清零a &= ~(1<<2);//括号中的 1 左移两位,(1<<2) 得二进制数:0000 0100 b//按位取反,~(1<<2) 得 1111 1011 b//假如 a 中原来的值为二进制数:a = 1001 1111 b//所得的数与 a 作”位与&”运算,a = (1001 1111 b)&(1111 1011 b),//经过运算后,a 的值 a=1001 1011 b// a 的 bit2 位被被零,而其它位不变。把寄存器某几个连续位清零    由于寄存器中有时会有连续几个寄存器位用于控制某个功能,现假设我们需要把寄存器的某几个连续位清零,且其它位不变,代码如下。

//若把 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 b)&(1111 0011 b),//经过运算后,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 b”//例如对第 2 组 bit4、bit5 清零a &= ~(3<<2*2);对寄存器某几位赋值    寄存器位经过清零操作后就可以方便地对某几位写入所需要的数值了,具体代码如下。

//a = 1000 0011 b//此时对清零后的第2组bit4、bit5设置成二进制数“01b”a|=(1<<2*2);//a = 1001 0011 b,成功设置了第 2 组的值,其它组不变寄存器某位取反    要对寄存器的某个位进行取反操作,即 1 变 0 ,0 变 1,这可以直接用如下操作。

//a = 1001 0011 b//把 bit6 取反,其它位不变 a ^=(1<<6);//a = 1101 0011 b

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117722
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128709

原文标题:C语言操作寄存器的常见手法

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32入门系列-使用C语言封装寄存器

    基地址就是 GPIOC 地址,其他寄存器地址只需要在 GPIOC 基地址上加上相应的偏移量即可。· 我们得到了寄存器具体的地址,那么就可以使用 C 语言指针来
    发表于 11-24 10:33

    C语言访问MCU寄存器的方法

    C语言访问MCU寄存器问题由来://下面这行代码的意思是直接操作0X020C4068这个寄存器/
    发表于 11-01 08:03

    C语言是如何访问MCU寄存器

    C语言访问MCU寄存器的三种方式MCU中的特殊功能寄存器SFR,实际上就是SRAM地址已经确定的SRAM单元,在C
    发表于 11-03 08:42

    库函数和寄存器操作的区别

    。库函数和寄存器操作的区别可能和 C 语言与汇编语言的区别差不多吧,都是跟效率有关,但有时候效率并不是唯一指标。我们都知道
    发表于 11-29 06:32

    C语言操作寄存器中的应用

    C语言操作寄存器中的应用本文参考另一篇博客写成附链接,个人感觉内容过多不便于吸收,就写了这篇博客。整体思想:设置一个位就是设置该位为1,清除就是设置该位为0
    发表于 01-24 06:04

    如何利用C语言的位域操作去实现对寄存器每一位的控制

    在单片机的编程中,会使用到一些IC里面的寄存器,而有些寄存器并不是每一位都是有效的,例如:这里的1-3位则是保留的,不可以***作的。所以在对一些寄存器进行操作时,可以利用
    发表于 02-25 06:41

    C语言寄存器操作相关资料分享

    C语言寄存器操作
    发表于 02-25 07:58

    寄存器传输语言详解

    数字系统中最常用到的微操作可分为四类: 1、寄存器传送微操作 它可把二元信息从一个寄存器传送到另一个寄存器,在
    发表于 08-16 09:32 5773次阅读
    <b class='flag-5'>寄存器</b>传输<b class='flag-5'>语言</b>详解

    C语言访问MCU寄存器

    C语言访问MCU寄存器问题由来://下面这行代码的意思是直接操作0X020C4068这个寄存器//具体寄存器的作用是通过手册得到的#defi
    发表于 10-25 13:21 3次下载
    C<b class='flag-5'>语言</b>访问MCU<b class='flag-5'>寄存器</b>

    C语言操作在(单片机)寄存器中的应用

    C语言操作寄存器中的应用本文参考另一篇博客写成附链接,个人感觉内容过多不便于吸收,就写了这篇博客。整体思想:设置一个位就是设置该位为1,清除就是设置该位为0寄存器
    发表于 11-29 10:06 8次下载
    C<b class='flag-5'>语言</b>位<b class='flag-5'>操作</b>在(单片机)<b class='flag-5'>寄存器</b>中的应用

    C语言寄存器操作

    C语言寄存器操作
    发表于 01-13 12:56 6次下载
    C<b class='flag-5'>语言</b>:<b class='flag-5'>寄存器</b><b class='flag-5'>操作</b>

    STM32的寄存器操作

    STM32的寄存器操作在使用STM32单片机编程时一般都用ST给的库函数编程,库函数编程的底层就是对单片机寄存器操作,库函数就是一系列寄存器
    发表于 01-13 15:43 18次下载
    STM32的<b class='flag-5'>寄存器</b><b class='flag-5'>操作</b>

    C语言操作寄存器操作代码

    由于寄存器中有时会有连续几个寄存器位用于控制某个功能,现假设我们需要把寄存器的某几个连续位清零,且其它位不变,代码如下。
    发表于 12-30 14:19 2101次阅读

    RAL寄存器模型操作图鉴

    寄存器模型操作,指的是通过寄存器模型对RTL中寄存器进行读写访问,或者同步寄存器模型与RTL中寄存器
    的头像 发表于 05-17 09:01 558次阅读
    RAL<b class='flag-5'>寄存器</b>模型<b class='flag-5'>操作</b>图鉴

    RAL寄存器模型操作指南

    寄存器模型操作,指的是通过寄存器模型对RTL中寄存器进行读写访问,或者同步寄存器模型与RTL中寄存器
    的头像 发表于 07-12 09:37 702次阅读
    RAL<b class='flag-5'>寄存器</b>模型<b class='flag-5'>操作</b>指南