单片机操作寄存器应用,8、16、32数按位翻转

news/2025/2/23 3:29:09/

概述

        在单片机实际应用中,操作各种芯片,都是在操作寄存器。有些芯片比较特殊,如:低位在前高位在后,有时通过逻辑分析仪抓到波形又是反向。在编写程序时,每次需要都要换算,觉得非常麻烦,在此借鉴别人的算法进行修改,同时做个笔录,为了以后使用到方便查阅,希望能给广大技术同仁们遇到此问题得到帮助。加油 ^_^ 

 IDE平台: CLion 编写示例
 

#include <stdio.h>
#include <stdint.h>
#include <mm_malloc.h>//uint32_t数按位翻转
uint32_t Reverse32Bit(uint32_t x)
{x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));return ((x >> 16) | (x << 16));
}
//uint16_t数按位翻转
uint16_t Reverse16Bit(uint16_t x) {
#if 0uint8_t i = 0;uint16_t data = 0;for (i=0;i<16;i++){if (x & 0x0001){data |= 0x0001;}x >>= 1;data <<= 1;}data >>= 1;return data;
#elsex = (((x & 0xaaaa) >> 1) | ((x & 0x5555) << 1));x = (((x & 0xcccc) >> 2) | ((x & 0x3333) << 2));x = (((x & 0xf0f0) >> 4) | ((x & 0x0f0f) << 4));x = (((x & 0xff00) >> 8) | ((x & 0x00ff) << 8));return x;
#endif
}uint8_t Reverse8Bit(uint8_t x) {
#if 1uint8_t i = 0;uint8_t data = 0;for (i=0;i<8;i++){if (x & 0x01){data |= 0x01;}x >>= 1;data <<= 1;}data >>= 1;return data;
#elsex = (((x & 0xaaaa) >> 1) | ((x & 0x5555) << 1));x = (((x & 0xcccc) >> 2) | ((x & 0x3333) << 2));return x;
#endif
}uint16_t High_low_bit_Change(uint16_t data)
{uint16_t dataL8, dataH8, resData;dataL8 = (data & 0x00ff) << 8;dataH8 = (data & 0xff00) >> 8;resData = dataL8 | dataH8;return resData;
}int main() {/* 高低位翻转算法 */uint8_t data8 = 0x02, res_data8;uint16_t data16 = 0x0002, res_data16;uint32_t data32 = 0x00000002, res_data32;uint8_t  s8[8], res_s8[8], s16[8], res_s16[16], s32[32], res_s32[32];res_data8 = Reverse8Bit(data8);res_data16 = Reverse16Bit(data16);res_data32 = Reverse32Bit(data32);itoa(data8, s8, 2);itoa(res_data8, res_s8, 2);printf("binary conversion 0x%x: %s, 0x%x: %s\n", data8, s8, res_data8, res_s8);printf("0x02, 0x%x\n", res_data8);printf("0x0002, 0x%x\n", res_data16);printf("0x00000002, 0x%x\n", res_data32);/************************************************************/uint16_t data = 0x180c, res;res = High_low_bit_Change(data);printf(" 0x%x\n", data);printf(" 0x%x\n", res);}


运算结果如下:


总结,有了此算法,以后就方便很多了,如有发现不对的地方请指出,谢谢 ^_^ !

 


http://www.ppmy.cn/news/176045.html

相关文章

c54x汇编语言程序设计,第4章_C54x的汇编语言程序设计.ppt

第4章TMS320C54x汇编语言程序设计,4.1概述4.1.1汇编语言源程序格式汇编语言程序以.asm为扩展名&#xff0c;可以用任意的编辑器编写源文件。一条语句占源程序的一行&#xff0c;长度可以是源文件编辑器格式允许的长度&#xff0c;但汇编器每行最多读200个字符。因此&#xff0c…

微机----------------存储器

目录 位扩展定义 字扩展定义1、线选法定义优点缺点 2、部分译码法定义 3、全译码法定义优点缺点 ⭐⭐⭐字位扩展定义问题 位扩展 定义 当存储芯片的存储字的数量 满足需要&#xff0c;而存储字长&#xff08;存储单元的位数&#xff09;不满足需要时&#xff0c;就需要增加存…

Windows保护模式(四)中断门陷阱门

中断门 Windows 系统没有使用调用门&#xff0c;但使用了中断门。 中断描述符表&#xff08;IDT&#xff09; 描述 IDT即中断描述符表&#xff0c;同GDT一样&#xff0c;IDT也是由一系列描述符组成的&#xff0c;每个描述符占8个字节 但要注意的是&#xff0c;IDT表中的第一…

Windows保护模式(五)任务段任务门

任务段 TSS&#xff08;Task-state segment&#xff09; 描述 TSS是一块内存 大小&#xff1a;104字节 TSS存储了一堆寄存器的值 TSS结构图 Previous Task Link&#xff1a;存放上一任务的 TSS 的段选择子&#xff0c; 以便在返回时确定切换任务前原来的 TSS 。SS0-SS2&…

HDS推出全闪存A系列阵列方案

HFS意味着HDS方面正大步走上与Pure以及EMC XtremIO正面对抗的发展道路。 HDS公司推出全闪存阵列层面的A级队伍 日立数据系统公司正着手利用市场营销攻势对XtremIO以及Pure Storage发起冲击&#xff0c;而其依凭的武器正是区别于现有VSP及HUS阵列的全新入门级全闪存阵列存储产品…

Oracle 正则式匹配识别Emoji表情符号

最近接到一个将字符串中Emoji表情符号的转为十六进制UTF8编码的任务。花了几天挖呀挖&#xff0c;总算捣鼓明白了&#xff0c;写了一个函数来完成任务&#xff0c;现记录下来&#xff0c;分享给大家。 Oracle数据表中&#xff0c;字符串含有Emoji表情符号&#xff0c;有些平台从…

数据可视化Day2:艺术画笔见乾坤

仅作为学习笔记 学习资料&#xff1a; https://datawhalechina.github.io/fantastic-matplotlib/ 1. matplotlib的三层api 用Artist对象在画布(canvas)上绘制(Render)图形 绘图区&#xff1a;matplotlib.backend_bases.FigureCanvas 渲染器&#xff08;画笔&#xff09;&…

OpenSBI ELF rela.dyn和.dynsym动态链接过程

在OpenSBI中重定位分成了两种&#xff0c;根据是否配置了FW_PIC宏来区分&#xff0c; 配置了FW_PIC,即本文描述的rela.dyn和.dynsym的动态链接。 未配置FW_PIC是加载地址和链接地址不相等情况下的代码拷贝重定位。 rela.dyn .rela.dyn节是什么节呢&#xff1f;该节保存的是重…