数码之家

 找回密码
 立即注册
搜索
查看: 1602|回复: 10

用于C语言的八位BIN直接输入。

[复制链接]
发表于 2019-6-11 14:54:12 | 显示全部楼层 |阅读模式
本帖最后由 _4061N_ 于 2019-6-12 14:03 编辑

更适用实际开发的方式请看5楼,最简方式请看回复不过多了一组括号有些凌乱)
有些时候(例如配置C51的寄存器),经常出现要把二进制转换成无符号十六进制的情况。我就经常是用计算器转换,觉得不仅麻烦而且不容易阅读。
这个时候,我吃饱了又没事干(划重点),干脆直接把这些二进制搞成了头文件(万能的#define)打算有时间了再把它拓展到16位。
这个的使用方式看后面的图,一眼就懂。
内容就直接写下来吧,当时我打了整整256行文字......将来可能还要写65536行(时隔很久,现在终于完成了,就是附件里那个整整65539行的头文件......说实话,用不到)创建一个头文件就可以直接用了。以下是可能会用到的8位宏定义(如果只是想要看起来简洁就需要用这个)


#ifndef BIN_DATA8_HEX    //BIN转换
#define BIN_DATA8_HEX   //注意:一般只能用于无符号情况下
#define _00000000_ 0x00//0
#define _00000001_ 0x01//1
#define _00000010_ 0x02//2
#define _00000011_ 0x03//3
#define _00000100_ 0x04//4
#define _00000101_ 0x05//5
#define _00000110_ 0x06//6
#define _00000111_ 0x07//7
#define _00001000_ 0x08//8
#define _00001001_ 0x09//9
#define _00001010_ 0x0A//10
#define _00001011_ 0x0B//11
#define _00001100_ 0x0C//12
#define _00001101_ 0x0D//13
#define _00001110_ 0x0E//14
#define _00001111_ 0x0F//15
#define _00010000_ 0x10//16
#define _00010001_ 0x11//17
#define _00010010_ 0x12//18
#define _00010011_ 0x13//19
#define _00010100_ 0x14//20
#define _00010101_ 0x15//21
#define _00010110_ 0x16//22
#define _00010111_ 0x17//23
#define _00011000_ 0x18//24
#define _00011001_ 0x19//25
#define _00011010_ 0x1A//26
#define _00011011_ 0x1B//27
#define _00011100_ 0x1C//28
#define _00011101_ 0x1D//29
#define _00011110_ 0x1E//30
#define _00011111_ 0x1F//31
#define _00100000_ 0x20//32
#define _00100001_ 0x21//33
#define _00100010_ 0x22//34
#define _00100011_ 0x23//35
#define _00100100_ 0x24//36
#define _00100101_ 0x25//37
#define _00100110_ 0x26//38
#define _00100111_ 0x27//39
#define _00101000_ 0x28//40
#define _00101001_ 0x29//41
#define _00101010_ 0x2A//42
#define _00101011_ 0x2B//43
#define _00101100_ 0x2C//44
#define _00101101_ 0x2D//45
#define _00101110_ 0x2E//46
#define _00101111_ 0x2F//47
#define _00110000_ 0x30//48
#define _00110001_ 0x31//49
#define _00110010_ 0x32//50
#define _00110011_ 0x33//51
#define _00110100_ 0x34//52
#define _00110101_ 0x35//53
#define _00110110_ 0x36//54
#define _00110111_ 0x37//55
#define _00111000_ 0x38//56
#define _00111001_ 0x39//57
#define _00111010_ 0x3A//58
#define _00111011_ 0x3B//59
#define _00111100_ 0x3C//60
#define _00111101_ 0x3D//61
#define _00111110_ 0x3E//62
#define _00111111_ 0x3F//63
#define _01000000_ 0x40//64
#define _01000001_ 0x41//65
#define _01000010_ 0x42//66
#define _01000011_ 0x43//67
#define _01000100_ 0x44//68
#define _01000101_ 0x45//69
#define _01000110_ 0x46//70
#define _01000111_ 0x47//71
#define _01001000_ 0x48//72
#define _01001001_ 0x49//73
#define _01001010_ 0x4A//74
#define _01001011_ 0x4B//75
#define _01001100_ 0x4C//76
#define _01001101_ 0x4D//77
#define _01001110_ 0x4E//78
#define _01001111_ 0x4F//79
#define _01010000_ 0x50//80
#define _01010001_ 0x51//81
#define _01010010_ 0x52//82
#define _01010011_ 0x53//83
#define _01010100_ 0x54//84
#define _01010101_ 0x55//85
#define _01010110_ 0x56//86
#define _01010111_ 0x57//87
#define _01011000_ 0x58//88
#define _01011001_ 0x59//89
#define _01011010_ 0x5A//90
#define _01011011_ 0x5B//91
#define _01011100_ 0x5C//92
#define _01011101_ 0x5D//93
#define _01011110_ 0x5E//94
#define _01011111_ 0x5F//95
#define _01100000_ 0x60//96
#define _01100001_ 0x61//97
#define _01100010_ 0x62//98
#define _01100011_ 0x63//99
#define _01100100_ 0x64//100
#define _01100101_ 0x65//101
#define _01100110_ 0x66//102
#define _01100111_ 0x67//103
#define _01101000_ 0x68//104
#define _01101001_ 0x69//105
#define _01101010_ 0x6A//106
#define _01101011_ 0x6B//107
#define _01101100_ 0x6C//108
#define _01101101_ 0x6D//109
#define _01101110_ 0x6E//110
#define _01101111_ 0x6F//111
#define _01110000_ 0x70//112
#define _01110001_ 0x71//113
#define _01110010_ 0x72//114
#define _01110011_ 0x73//115
#define _01110100_ 0x74//116
#define _01110101_ 0x75//117
#define _01110110_ 0x76//118
#define _01110111_ 0x77//119
#define _01111000_ 0x78//120
#define _01111001_ 0x79//121
#define _01111010_ 0x7A//122
#define _01111011_ 0x7B//123
#define _01111100_ 0x7C//124
#define _01111101_ 0x7D//125
#define _01111110_ 0x7E//126
#define _01111111_ 0x7F//127
#define _10000000_ 0x80//128
#define _10000001_ 0x81//129
#define _10000010_ 0x82//130
#define _10000011_ 0x83//131
#define _10000100_ 0x84//132
#define _10000101_ 0x85//133
#define _10000110_ 0x86//134
#define _10000111_ 0x87//135
#define _10001000_ 0x88//136
#define _10001001_ 0x89//137
#define _10001010_ 0x8A//138
#define _10001011_ 0x8B//139
#define _10001100_ 0x8C//140
#define _10001101_ 0x8D//141
#define _10001110_ 0x8E//142
#define _10001111_ 0x8F//143
#define _10010000_ 0x90//144
#define _10010001_ 0x91//145
#define _10010010_ 0x92//146
#define _10010011_ 0x93//147
#define _10010100_ 0x94//148
#define _10010101_ 0x95//149
#define _10010110_ 0x96//150
#define _10010111_ 0x97//151
#define _10011000_ 0x98//152
#define _10011001_ 0x99//153
#define _10011010_ 0x9A//154
#define _10011011_ 0x9B//155
#define _10011100_ 0x9C//156
#define _10011101_ 0x9D//157
#define _10011110_ 0x9E//158
#define _10011111_ 0x9F//159
#define _10100000_ 0xA0//160
#define _10100001_ 0xA1//161
#define _10100010_ 0xA2//162
#define _10100011_ 0xA3//163
#define _10100100_ 0xA4//164
#define _10100101_ 0xA5//165
#define _10100110_ 0xA6//166
#define _10100111_ 0xA7//167
#define _10101000_ 0xA8//168
#define _10101001_ 0xA9//169
#define _10101010_ 0xAA//170
#define _10101011_ 0xAB//171
#define _10101100_ 0xAC//172
#define _10101101_ 0xAD//173
#define _10101110_ 0xAE//174
#define _10101111_ 0xAF//175
#define _10110000_ 0xB0//176
#define _10110001_ 0xB1//177
#define _10110010_ 0xB2//178
#define _10110011_ 0xB3//179
#define _10110100_ 0xB4//180
#define _10110101_ 0xB5//181
#define _10110110_ 0xB6//182
#define _10110111_ 0xB7//183
#define _10111000_ 0xB8//184
#define _10111001_ 0xB9//185
#define _10111010_ 0xBA//186
#define _10111011_ 0xBB//187
#define _10111100_ 0xBC//188
#define _10111101_ 0xBD//189
#define _10111110_ 0xBE//190
#define _10111111_ 0xBF//191
#define _11000000_ 0xC0//192
#define _11000001_ 0xC1//193
#define _11000010_ 0xC2//194
#define _11000011_ 0xC3//195
#define _11000100_ 0xC4//196
#define _11000101_ 0xC5//197
#define _11000110_ 0xC6//198
#define _11000111_ 0xC7//199
#define _11001000_ 0xC8//200
#define _11001001_ 0xC9//201
#define _11001010_ 0xCA//202
#define _11001011_ 0xCB//203
#define _11001100_ 0xCC//204
#define _11001101_ 0xCD//205
#define _11001110_ 0xCE//206
#define _11001111_ 0xCF//207
#define _11010000_ 0xD0//208
#define _11010001_ 0xD1//209
#define _11010010_ 0xD2//210
#define _11010011_ 0xD3//211
#define _11010100_ 0xD4//212
#define _11010101_ 0xD5//213
#define _11010110_ 0xD6//214
#define _11010111_ 0xD7//215
#define _11011000_ 0xD8//216
#define _11011001_ 0xD9//217
#define _11011010_ 0xDA//218
#define _11011011_ 0xDB//219
#define _11011100_ 0xDC//220
#define _11011101_ 0xDD//221
#define _11011110_ 0xDE//222
#define _11011111_ 0xDF//223
#define _11100000_ 0xE0//224
#define _11100001_ 0xE1//225
#define _11100010_ 0xE2//226
#define _11100011_ 0xE3//227
#define _11100100_ 0xE4//228
#define _11100101_ 0xE5//229
#define _11100110_ 0xE6//230
#define _11100111_ 0xE7//231
#define _11101000_ 0xE8//232
#define _11101001_ 0xE9//233
#define _11101010_ 0xEA//234
#define _11101011_ 0xEB//235
#define _11101100_ 0xEC//236
#define _11101101_ 0xED//237
#define _11101110_ 0xEE//238
#define _11101111_ 0xEF//239
#define _11110000_ 0xF0//240
#define _11110001_ 0xF1//241
#define _11110010_ 0xF2//242
#define _11110011_ 0xF3//243
#define _11110100_ 0xF4//244
#define _11110101_ 0xF5//245
#define _11110110_ 0xF6//246
#define _11110111_ 0xF7//247
#define _11111000_ 0xF8//248
#define _11111001_ 0xF9//249
#define _11111010_ 0xFA//250
#define _11111011_ 0xFB//251
#define _11111100_ 0xFC//252
#define _11111101_ 0xFD//253
#define _11111110_ 0xFE//254
#define _11111111_ 0xFF//255
#endif







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +10 收起 理由
家睦 + 10

查看全部打赏

发表于 2019-6-11 15:18:19 | 显示全部楼层
简单粗暴,为了敲这么多行代码辛苦了!:smile:
回复 支持 反对

使用道具 举报

发表于 2019-6-11 15:22:20 来自手机浏览器 | 显示全部楼层
这个看起头痛。可以把每一位定一些有意义的符号呀。比如:#define Timer0_M0_0 0x00;#define Timer0_M0_1 0x01。这样在使用的时候就用位操作|来进行。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-11 15:54:02 | 显示全部楼层
fair2017 发表于 2019-6-11 15:22
这个看起头痛。可以把每一位定一些有意义的符号呀。比如:#define Timer0_M0_0 0x00;#define Timer0_M0_1  ...

起名字什么的最麻烦了。
我还是倾向于一生全靠浪......
回复 支持 反对

使用道具 举报

发表于 2019-6-12 01:36:00 | 显示全部楼层
哥们,你这样做太麻烦了,建议你把位运算封装为宏函数,前期准备阶段可能比较麻烦,但是之后能极大的提高你的编程效率,而且非常方便阅读,
以下代码是仿照STM32库函数写的。

我给你个示范:
定义一下三个宏进行位运算操作
#define SET_BIT(REG, BIT)     ((REG) |= (BIT))
#define CLEAR_BIT(REG, BIT)   ((REG) &= ~(BIT))
#define READ_BIT(REG, BIT)    ((REG) & (BIT))

//51单片机的总中断控制位EA在IE寄存器的第七位,定义以下宏
#define EA_BIT (1 << 7) //IE.7

//之后定义这两个宏进行开关总中断的操作
#define EA_ENABLE() SET_BIT(IE, EA_BIT)
#define EA_DISABLE() CLEAR_BIT(IE, EA_BIT)
之后你在需要开启总中断的地方就可以像使用函数一样直接使用EA_ENABLE();

当然,因为EA可以位寻址,所以开关总中断的操作与直接给EA赋值相同,这只是举个例子,同理你还可以写出以下代码:

以STC15系列单片机的串口1为例
// ==== 串口1 SCON寄存器的所有位定义 ====
#define RI_BIT (1 << 0) //SCON.0
#define TI_BIT (1 << 1) //SCON.1
#define RB8_BIT (1 << 2) //SCON.2
#define TB8_BIT (1 << 3) //SCON.3
#define REN_BIT (1 << 4) //SCON.4
#define SM2_BIT (1 << 5) //SCON.5
#define SM1_BIT (1 << 6) //SCON.6
#define SM0_FE_BIT (1 << 7) //SCON.7

//特殊寄存器定义
#define S1ST2_BIT (1 << 0) //AUXR.0
#define ES_BIT (1 << 4) //IE.4
#define PS_BIT (1 << 4) //IP.4

//串口1相关功能
#define UART1_USE_TIMER1() CLEAR_BIT(AUXR, S1ST2_BIT)
#define UART1_USE_TIMER2() SET_BIT(AUXR, S1ST2_BIT)
#define UART1_RX_ENABLE() SET_BIT(SCON, REN_BIT)
#define UART1_RX_DISABLE() CLEAR_BIT(SCON, REN_BIT)
#define UART1_INT_PRIORITY_HIGH() SET_BIT(IP, PS_BIT)
#define UART1_INT_PRIORITY_LOW() CLEAR_BIT(IP, PS_BIT)
#define UART1_INT_ENABLE() SET_BIT(IE, ES_BIT)
#define UART1_INT_DISABLE() CLEAR_BIT(IE, ES_BIT)

串口1的初始化代码你可以这样写,这个代码比你直接操作寄存器直观很多
uart1_init()
{
//这里还有其他的设置波特率之类的代码,略去不写,我只是简单举例,你可以在此基础上完善
UART1_RX_ENABLE();
UART1_INT_ENABLE();
UART1_INT_PRIORITY_HIGH();
EA_ENABLE();
}
回复 支持 2 反对 0

使用道具 举报

发表于 2019-6-12 11:00:07 | 显示全部楼层
ifm 发表于 2019-6-12 01:36
哥们,你这样做太麻烦了,建议你把位运算封装为宏函数,前期准备阶段可能比较麻烦,但是之后能极大的提高你 ...

大佬就是大佬,一出手就不一样。
不过你们可能没太明白楼主的意思。比如他想写几个bit是0,几个bit是1,一次性写入8bit,所以用了全二进制宏。(其实这个头文件也可以使用c语言自动生成,不用一个一个敲)

他用的是原始写法,没有习惯宏写法
我的方法是给每个位一个别名,这样直接用或操作连起来,比如易读(下面代码用于举例,无实际意义):
#define IE_EN   (1 << 4) //IE.4
#define IP_EN   (1 << 5) //IE.5

IE_REG = IE_EN   | IP_EN;

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-12 13:51:11 | 显示全部楼层
后来我找到了更好的二进制输入方式......
不过五楼的方法看起来貌似更适合搭建头文件。(我已经准备用他的方式了)


以下是二进制转换的最简方式(一行代码就够了):
#define B(n) (((n&10000000)/10000000*128)|((n&1000000)/1000000*64)|((n&100000)/100000*32)|((n&10000)/10000*16)|((n&1000)/1000*8)|((n&100)/100*4)|((n&10)/10*2)|((n)&0x01))

在实际应用中:置P1为0x0f :P1=B(00001111); // P1=0X0f
因为00001111是常量,所以编译器会自己把他转换为0x0f,不会增加代码空间和运算时间(两次编译代码长度和变量空间是完全一样的)
回复 支持 反对

使用道具 举报

发表于 2019-6-13 11:03:22 | 显示全部楼层
本帖最后由 la45088d1 于 2019-6-13 11:04 编辑

太麻烦了,虽然是没事干,但还是不建议你在这方面深挖。
二进制最大的问题是在于难以书写和难以查错。首先每一个字节你都要按8次键盘,写一个十六进制只要一半工作量,加大了出错的概率,同时编译器不支持二进制输入还要加宏定义也是麻烦事;其次,二进制8个,16个甚至更多的0,1挤在一起其实非常难以阅读,很可能给你的查错带来困难。
综上所述,十六进制是最佳的表达方式。
顺便说,要想写二进制学Verilog HDL吧,提供原生的各种进制支持,二进制直接写诸如8'b00000000之类的表示。
回复 支持 反对

使用道具 举报

发表于 2019-6-13 11:49:43 | 显示全部楼层
这个有什么意义?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-13 12:01:13 | 显示全部楼层
la45088d1 发表于 2019-6-13 11:03
太麻烦了,虽然是没事干,但还是不建议你在这方面深挖。
二进制最大的问题是在于难以书写和难以查错。首先 ...

行吧,现在开始学STM32了,就发现原来的八位定义用不到了。
回复 支持 反对

使用道具 举报

发表于 2019-6-14 20:42:38 | 显示全部楼层
学习学习,谢谢楼主和5楼层主
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-26 00:53 , Processed in 0.202801 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表