在Keil C51中数不能直接以二进制形式赋值,虽然在8051的汇编中是可以的。二进制数虽然书写长,易出错,但是由于是一位位写的,所以程序设计者能够很明确的看到每一位的状态,看得比较直观。于是很多人怀念了8051的汇编,很想在C51中使用二进制。没猜错的话搜到本篇日志的人很可能就是来找这种解决办法的,下面两种办法都是不错的选择。
方法一:
建立一个头文件,将所有的二进制数宏定义列举出来,用的时候直接使用宏定义,头文件定义:binary(右键>>“目标另存为”>>下载)。
方法二:
做一个带参数宏定义,将输入的类二进制数变换为对应的16进制数,整个定义和使用实例请见下文,可以直接使用,如果想研究原理又看不懂带参宏定义的朋友们请参考谭浩强的《C程序设计》预处理命令一章内容(第三版在P204-P211)。
#define LongToBin(n)
(
((n >> 21) & 0x80) |
((n >> 18) & 0x40) |
((n >> 15) & 0x20) |
((n >> 12) & 0x10) |
((n >> 9) & 0x08) |
((n >> 6) & 0x04) |
((n >> 3) & 0x02) |
((n ) & 0x01)
)
#define Bin(n) LongToBin(0x##n##l)
void main(void)
{
unisigned char c;
c = Bin(10101001); //相当于c = 0xA9
}
上面预处理指令中使用了反斜杠,这里解释一下:每一条预处理语句总是以"#"字符开始,并且不能超过一行,一旦遇到换行符语句就被当做结束,唯一的一种能将预处理语句扩展到多行的办法就是在换行符之前加一个反斜杠('')。
关键字:Keil C51 二进制数
引用地址:
如何在Keil C51中直接使用二进制数
推荐阅读最新更新时间:2024-03-16 12:58
基于keil5新建STM32F10x寄存器版本工程
一、前言 前面文章分享了很多关于STM32F103系列知识点、物联网相关的小项目,工程都采用的是寄存器方式编写;很多小伙伴接触STM32开始都采用库函数编程,不清楚如何使用寄存器方式开发STM32;这篇文章就讲一下如何新建寄存器风格的STM32工程,并介绍需要用到哪些官方系统文件等。 比较具有代表性的几篇物联网教程: 1. 智慧农业项目(基于腾讯物联网服务器) 2. 遥控小车项目 3. 智能门锁项目(基于腾讯物联网服务器) 4. 物联网项目(基于阿里云物联网服务器) 5. 智能家居项目(基于中国移动OneNet物联网服务器) 二、环境介绍 开发环境: keil5.25 编程语言: C语言 操作系
[单片机]
C51: 将16进制 序列码,转换为16进制数组,逆序排列
//将16进制序列码,转换为16进制数组。 //逆序排列 #include reg51.h #include stdio.h #include ctype.h #define uchar unsigned char void main() { //ch 表示16进制 序列码 char ch = 0123456789ABCDEF ; //ch1 表示 16进制 字符数组 char ch1 ; char i; for(i=0;i 8;i++) { ch1 =toint(ch )*16+toint(ch ); } } /* 转换结果: ch1 =0xEF; ch1 =0xCD; ch1
[单片机]
C51---1 新建C51工程 + 2.1 并点亮LED灯 + 3.1 按键控制LED亮灭
1 新建工程 选择好目录路径后,选择 添加文件 2.1 并点亮LED灯 LED原理图 main函数代码 led1为P2_0 P2控制8位设置为1111 1110时第0位为0,LED二极管导通点亮。 #include REGX52.H void main() { P2=0xFE;//1111 1110 while(1); } 烧录后 点亮4颗led #include REGX52.H void main() { P2=0x55;//0101 0101 while(1); } 3.1 按键控制LED亮灭 原理图 main函数 按键1按下时,LED1亮
[单片机]
keil的错误提示error: C3900U: Unrecognized option '-O3'.
这是使用的keil版本(或者权限不够)不支持O3等级的优化。。。。设置一下优化等级即可。设置为level0,(不优化) 如果需要用到优化功能的话,需要相应的完整版。。仅仅破解64K限制的keil是不能用优化功能的。。破解成其他标准版或者开发版都可以
[单片机]
51单片机PS2键盘解码实验--C51源代码
#include #include KBCODE.H #define LCM_RS P2_0 #define LCM_RW P2_1 //定义LCD引脚 #define LCM_E P2_2 #define LCM_Data P0 #define Busy 0x80 //用于检测LCM状态字中的Busy标识 #define Key_Data P3_2 //定义Keyboard引脚 #define Key_CLK P3_3 void LCMInit(void); void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData); void D
[单片机]
C51流水灯的三种操作
C51流水灯的三种操作 1-工程目录 主函数 #include reg52.h #include led.h #include delay.h int main() { liushuianwei();//按位 delay_xms(1000); liushuixunhuan();//循环移位 delay_xms(1000); liushuiyiwei();//移位 delay_xms(1000); while(1); return 0; } led.h #ifndef __LED_H__ #define __LED_H__ #inclu
[单片机]
关于KeilC51的指针
keil中的指针分为两种,一种是普通指针,兼容标准C语言的指针;另一种是我翻译成内存特殊指针(memory-specific pointers,翻译的不好: ) 一、普通指针 普通指针的定义方式如下, char * ptr; 跟标准C的定义方式一样。这种指针占三个字节。第一个字节是标识存储类型,是指针指向的变量的数据类型。 第二个字节是指针存储地址的高位字节。第三个字节是指针存储地址的低位字节。 普通指针默认存储在内部存储器data,即片上RAM。如果想指定指针的存储位置,可以在 * 后加上存储类型,如下面几种定义方式: char * data ptr; //与char * ptr;等价,即默认的定义方
[单片机]
Keil C51中对双数据指针的直接利用
在8051体系中,数据指针DPTR作为一个特殊的16位寄存器,用于寻址64 KB的XDATA或CODE空间,通常它被当作一个16位指针,指向一个常数表。双数据指针可以改善同时有两个16位指针使用时的性能。作为一种增强特性,有许多8051派生型器件支持双数据指针。以宏晶科技STC89系列的产品为例,DPTR被增强为DPTR0和DPTR1两个,仍然使用原来的地址,用另外一个SFR AUXR1的0位DPS来切换。当DPS位为0时,所有对DPTR的操作使用DPTR0;当DPS位为1时,所有对DPTR的操作使用DPTR1。这样,通过一个简单的INC AUXR1指令,就可以来回切换两个数据指针。 1 Keil C51对双数据指针的支
[单片机]