搜索
bottom↓
回复: 21

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

[复制链接]

出0入0汤圆

发表于 2010-8-4 10:24:42 | 显示全部楼层 |阅读模式
如:
main.c
void main(void)
{
    OSCICN = _OSCICN_INIT;
}
main.h
#define _OSCICN_INIT 0x83;
如果想方便添加注释:
#define     _OSCICN_INIT    0b10000011; //内部晶振控制
//                            ||    ||____  IFCN0
//                            ||    |_____  IFCN1
//                            ||__________  IFRDY
//                            |___________  IOSCEN
编译无法通过,如何声明2进制???

出0入0汤圆

 楼主| 发表于 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'

出0入0汤圆

发表于 2010-8-4 10:32:10 | 显示全部楼层
OSCICN = IFCN0 | IFCN1 | IOSCEN ;最好

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

出0入0汤圆

 楼主| 发表于 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
勉强能用,看着很恶心!

出0入0汤圆

发表于 2010-8-4 10:53:16 | 显示全部楼层
结构体呀

出0入0汤圆

发表于 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;

出0入0汤圆

发表于 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均可

出0入0汤圆

发表于 2010-8-4 11:03:53 | 显示全部楼层
用IAR的都知道!嘿嘿

出0入0汤圆

发表于 2010-8-4 12:16:08 | 显示全部楼层
#define B00000000 0x00
#define B00000001 0x01
#define B00000010 0x02
#define B00000011 0x03
.
.
.
#define B11111111 0xff

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

出0入4汤圆

发表于 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

出0入0汤圆

发表于 2010-8-4 13:42:01 | 显示全部楼层
lz,你C怎么学的?define后面跟 ; 的?

出0入0汤圆

发表于 2010-8-4 13:43:59 | 显示全部楼层
#define这类,不要同一行里加上注释之类多余的东西,要写您就换一行.....不然有时候会出奇怪问题的.....

出0入0汤圆

 楼主| 发表于 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,有空试吧!

出0入0汤圆

 楼主| 发表于 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的时候一直这么用的,有空我去确认一下!多谢回复

出0入0汤圆

 楼主| 发表于 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”
不知为什么?
无论如何感谢大家的帮助!多谢!

出0入0汤圆

发表于 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 这个不是一个有效的变量定义,变量是不可以以数字开头的

出0入0汤圆

 楼主| 发表于 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[1:0]  分频:
//                                                         00 8分频
//                                                         01 4分频
//                                                         10 2分频
//                                                         11 不分频
//                           ||__________  IFRDY   内部是否准备好,只读
//                                                         0 未运行在编程频率
//                                                         1 按编程频率运行
//                           |___________  IOSCEN  使能:0 禁用;1使能
。。。
。。。
。。。

出0入0汤圆

 楼主| 发表于 2010-8-4 14:56:48 | 显示全部楼层
回复【15楼】jordonwu  
-----------------------------------------------------------------------
0b00000000 这个不是一个有效的变量定义,变量是不可以以数字开头的
-----------------------------------------------------------------------
可以用宏的方式替换吗???

出0入0汤圆

发表于 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吧......

出0入0汤圆

发表于 2010-8-4 15:52:41 | 显示全部楼层
4楼的朋友说得很在理

出0入0汤圆

 楼主| 发表于 2010-8-4 16:41:17 | 显示全部楼层
查了一下,的确是宏代换,不应该加‘;’的!
多谢,多谢!

出0入0汤圆

 楼主| 发表于 2010-8-4 17:51:17 | 显示全部楼层
看了一天的单片机资料才找到配置软件,哭!
费那劲儿干嘛啊!
给个新华龙的下载地址(中文的):
http://www.xhl.com.cn/download.asp?bigdownid=7&bigdownname=%B5%F7%CA%D4%C6%F7
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 18:00

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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