wukunpeng858 发表于 2010-8-4 10:24:42

C语言2进制如何声明?(解决)

如:
main.c
void main(void)
{
    OSCICN = _OSCICN_INIT;
}
main.h
#define _OSCICN_INIT 0x83;
如果想方便添加注释:
#define   _OSCICN_INIT    0b10000011; //内部晶振控制
//                            ||    ||____IFCN0
//                            ||    |_____IFCN1
//                            ||__________IFRDY
//                            |___________IOSCEN
编译无法通过,如何声明2进制???

wukunpeng858 发表于 2010-8-4 10:28:24

明白了自己定义2进制代替
如:
#define B00000000 0x00;
我试过几个
#define 0b00000000 0x00;
#define 0b00000000 0x00
都不行!

看来不行,编译报错:
*** ERROR C100 IN LINE 1 OF BINARY.H: unprintable character 0xA1 skipped
*** ERROR C100 IN LINE 1 OF BINARY.H: unprintable character 0xA1 skipped
*** ERROR C100 IN LINE 1 OF BINARY.H: unprintable character 0xA1 skipped
*** ERROR C100 IN LINE 1 OF BINARY.H: unprintable character 0xA1 skipped
*** ERROR C141 IN LINE 1 OF BINARY.H: syntax error near '#'
*** ERROR C129 IN LINE 1 OF BINARY.H: missing ';' before 'B00000000'

aozima 发表于 2010-8-4 10:32:10

OSCICN = IFCN0 | IFCN1 | IOSCEN ;最好

OSCICN = (1<<IFCN0) | (1<<IFCN1) | (1<<IOSCEN) ;也行

wukunpeng858 发表于 2010-8-4 10:39:14

aozima 多谢!
不过不是这个意思,我知道这样写可以!
我的意思是把变量都写清,以后尽量不看PDF!

我靠,<c8051F330.h>居然没有定义位标志!
(1<<IFCN0) | (1<<IFCN1) | (0<<IFRDY) | (1<<IOSCEN)
根本不认,疯了!

#define   _OSCICN_INIT    0x83;
//          OSCICN          0b10000011      内部晶振控制
//                            ||    ||____IFCN0
//                            ||    |_____IFCN1
//                            ||__________IFRDY
//                            |___________IOSCEN
勉强能用,看着很恶心!

again 发表于 2010-8-4 10:53:16

结构体呀

again 发表于 2010-8-4 11:00:33

__sfr __no_init volatile union
{
unsigned char ADC_CONTR; /* A/D 转换控制寄存器 */
struct /* A/D 转换控制寄存器 */
{
    unsigned char ADC_CHS0 : 1;
    unsigned char ADC_CHS1 : 1;
    unsigned char ADC_CHS2 : 1;
    unsigned char ADC_START : 1;
    unsigned char ADC_FLAG : 1;
    unsigned char ADC_SPEED0 : 1;
    unsigned char ADC_SPEED1 : 1;
    unsigned char ADC_POWER : 1;
} ADC_CONTR_bit;
} @ 0xBC;

enum {
ADC_CHS0 = 0x01,
ADC_CHS1 = 0x02,
ADC_CHS2 = 0x04,
ADC_START = 0x08,
ADC_FLAG = 0x10,
ADC_SPEED0 = 0x20,
ADC_SPEED1 = 0x40,
ADC_POWER = 0x80,
};

应用:
ADC_CONTR = ADC_CHS0 + ADC_START + ADC_POWER;

jsjjccc 发表于 2010-8-4 11:01:10

#define _BIN(a,b,c,d,e,f,g,h) ((a<<7)+(b<<6)+(c<<5)+(d<<4)+(e<<3)+(f<<2)+(g<<1)+(h<<0))
#define _bin _BIN // _bin,_BIN均可

again 发表于 2010-8-4 11:03:53

用IAR的都知道!嘿嘿

yu_studio 发表于 2010-8-4 12:16:08

#define B00000000 0x00
#define B00000001 0x01
#define B00000010 0x02
#define B00000011 0x03
.
.
.
#define B11111111 0xff

这样不行吗?我在KEIL编译通过,我看1楼写的多了个分号。

banyai 发表于 2010-8-4 12:22:56

可以定义一个宏:
#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)        //write binary charactor set,exsample : Bin(11111111) = 0xff

ilovezeno 发表于 2010-8-4 13:42:01

lz,你C怎么学的?define后面跟 ; 的?

ilovezeno 发表于 2010-8-4 13:43:59

#define这类,不要同一行里加上注释之类多余的东西,要写您就换一行.....不然有时候会出奇怪问题的.....

wukunpeng858 发表于 2010-8-4 14:24:27

回复【8楼】yu_studio
#define b00000000 0x00
#define b00000001 0x01
#define b00000010 0x02
#define b00000011 0x03
.
.
.
#define b11111111 0xff
这样不行吗?我在keil编译通过,我看1楼写的多了个分号。

-----------------------------------------------------------------------

我用的是Silicon Laboratories IDE,搜索百度有用KEIL实现的,不过我用的软件恐怕不支持。
没用过KEIL编译C8051,有空试吧!

wukunpeng858 发表于 2010-8-4 14:28:31

回复【10楼】ilovezeno鸣
lz,你c怎么学的?define后面跟 ; 的?
-----------------------------------------------------------------------
C8051F330.h
sfr P0            = 0x80; /* PORT 0 LATCH */
sfr SP            = 0x81; /* STACK POINTER */
sfr DPL         = 0x82; /* DATA POINTER LOW */
sfr DPH         = 0x83; /* DATA POINTER HIGH */
。。。
Silicon Laboratories IDE自带的头文件,我没敢怀疑!
再说用PIC的时候一直这么用的,有空我去确认一下!多谢回复

wukunpeng858 发表于 2010-8-4 14:43:09

可以用了,我晕了!
很简单的问题:main.h中没有#include <binary.h>
我写在main.c中了。后面有没有‘;’好像无所谓的,编译都不会出错!

另外如果写成“#define 0b00000000 0x00”,编译会报“*** ERROR C301 IN LINE 1 OF binary.h: identifier expected”
不知为什么?
无论如何感谢大家的帮助!多谢!

jordonwu 发表于 2010-8-4 14:51:02

回复【14楼】wukunpeng858
可以用了,我晕了!
很简单的问题:main.h中没有#include <binary.h>
我写在main.c中了。后面有没有‘;’好像无所谓的,编译都不会出错!
另外如果写成“#define 0b00000000 0x00”,编译会报“*** error c301 in line 1 of binary.h: identifier expected”
不知为什么?
无论如何感谢大家的帮助!多谢!
-----------------------------------------------------------------------

0b00000000 这个不是一个有效的变量定义,变量是不可以以数字开头的

wukunpeng858 发表于 2010-8-4 14:55:06

编程风格,大家看看这样注释是否清晰???
回复【1楼】ilovezeno鸣
#define这类,不要同一行里加上注释之类多余的东西,要写您就换一行.....不然有时候会出奇怪问题的.....
还没遇到过,看来编程格式还要改改!多谢提醒!

#include <binary.h>
//系统时钟
#define   _OSCICL_INIT    0x000; //复位值出厂已校准为24.5 MHz.
                                  //如需更改频率,参考C8051F33x中文P90,C8051F33x P116
#define   _OSCICN_INIT    b10000011;      //内部高频晶振控制器
//                           ||    ||____IFCN0
//                           ||    |_____IFCN1
//                                             IFCN分频:
//                                                         00 8分频
//                                                         01 4分频
//                                                         10 2分频
//                                                         11 不分频
//                           ||__________IFRDY   内部是否准备好,只读
//                                                         0 未运行在编程频率
//                                                         1 按编程频率运行
//                           |___________IOSCEN使能:0 禁用;1使能
。。。
。。。
。。。

wukunpeng858 发表于 2010-8-4 14:56:48

回复【15楼】jordonwu
-----------------------------------------------------------------------
0b00000000 这个不是一个有效的变量定义,变量是不可以以数字开头的
-----------------------------------------------------------------------
可以用宏的方式替换吗???

ilovezeno 发表于 2010-8-4 15:52:39

回复【14楼】wukunpeng858
可以用了,我晕了!
很简单的问题:main.h中没有#include &lt;binary.h&gt;
我写在main.c中了。后面有没有‘;’好像无所谓的,编译都不会出错!
另外如果写成“#define 0b00000000 0x00”,编译会报“*** error c301 in line 1 of binary.h: identifier expected”
不知为什么?
无论如何感谢大家的帮助!多谢!
-----------------------------------------------------------------------

有没有"; "还是很有所谓的吧.....而且所谓大了.....建议好好复习下C吧......

zyanplus 发表于 2010-8-4 15:52:41

4楼的朋友说得很在理

wukunpeng858 发表于 2010-8-4 16:41:17

查了一下,的确是宏代换,不应该加‘;’的!
多谢,多谢!

wukunpeng858 发表于 2010-8-4 17:51:17

看了一天的单片机资料才找到配置软件,哭!
费那劲儿干嘛啊!
给个新华龙的下载地址(中文的):
http://www.xhl.com.cn/download.asp?bigdownid=7&bigdownname=%B5%F7%CA%D4%C6%F7
页: [1]
查看完整版本: C语言2进制如何声明?(解决)