单片机及C51的sbit变量,如何实现外部文件引用,extern声明不行
本帖最后由 bbssilverkey 于 2013-5-22 13:01 编辑文件3个:
a.c- 用sbit声明老了一个变量 key
a.h
_main.c - #include "a.h"主函数调用 key这个变量,编译{:lol:} 显示未定义
问题:我不把sbit丢a.h不行么?当然丢a.h肯定能过编译.
请教解决方法{:lol:}
我也遇到过这问题 所以我干脆不用sbit~~~
C51的sbit很多限制,并且不能像char之类的关键字一样自动分配地址,麻烦死了 这个我刚好会。、
a.c
unsigned charbdataaaaa;
sbita_0 =aaaa^0;
在b.h中这样声明就可以了
extern bita_0; Alimy 发表于 2013-5-22 15:59 static/image/common/back.gif
这个我刚好会。、
a.c
我记得我是这样
在a.h上声明了extern bita_0;结果报错……
明天再试试看 Alimy 发表于 2013-5-22 15:59 static/image/common/back.gif
这个我刚好会。、
a.c
兄弟,你那个我刚拿keil4敲进去,不行的,编译器会报 redefinition,难道只能写入 .h文件么? Alimy 发表于 2013-5-22 15:59 static/image/common/back.gif
这个我刚好会。、
a.c
还是不行呢,这两种方法都是错误的。
在HAL_UART.C中,定义了
uint8_t bdata SendFlag = FALSE;
sbit bSendFlag = SendFlag^0;
在HAL_UART.H中声明了
extern uint8_t bdata SendFlag ;
extern sbit bSendFlag;
结果在每个调用HAL_UART.H的C文件下都有一个中文意思大概是:在sbit附近有错误。
HAL_UART.H改成这样的话:
extern uint8_t bdata SendFlag ;
extern sbit bSendFlag = SendFlag^0;
还会增加一个错误:SendFlag不是有效的基地址
C51果然是挫 jswd0810 发表于 2013-5-23 13:43 static/image/common/back.gif
应该没有问题吧,我的定义
uchar bdata other_in;//此处other_in必须为bdata类型,否则编译出错
sbit mybit ...
我是说在多文件的工程中如何使用sbit。
比如A模块的源文件中定义了:
uchar bdata other_in;
sbit mybit0=other_in^0;
sbit mybit1=other_in^1;
sbit mybit2=other_in^2;
sbit mybit3=other_in^3;
sbit mybit4=other_in^4;
sbit mybit5=other_in^5;
sbit mybit6=other_in^6;
sbit mybit7=other_in^7;
那么我在B模块的源文件中如何使用mybit0~7呢,
现在就算是在A模块的头文件中增加声明:extern uchar bdata other_in;
或者在B模块的源文件中声明:extern uchar bdata other_in;
然后再在B模块的源文件中声明:
sbit mybit0=other_in^0;
sbit mybit1=other_in^1;
sbit mybit2=other_in^2;
sbit mybit3=other_in^3;
sbit mybit4=other_in^4;
sbit mybit5=other_in^5;
sbit mybit6=other_in^6;
sbit mybit7=other_in^7;
都会在B.c下报错:other_in是错误的基地址 你没仔细看三楼
在HAL_UART.C中,定义了
uint8_t bdata SendFlag = FALSE;
sbit bSendFlag = SendFlag^0;
在HAL_UART.H中声明了
extern uint8_t bdata SendFlag ;
extern bit bSendFlag; 这里不能是sbit 了 要是bit 就okkeil 是有些问题 但这些问题不会弱
pang7 发表于 2013-5-23 19:16 static/image/common/back.gif
你没仔细看三楼
在HAL_UART.C中,定义了
uint8_t bdata SendFlag = FALSE;
哦,的确如你所说的!声明改成bit就OK了
以后还有机会用51的话,可以试下sbit~~ chencc8 发表于 2013-5-22 17:09 static/image/common/back.gif
我记得我是这样
在a.h上声明了extern bita_0;结果报错……
明天再试试看
不会啊。。。我一直就是这样用的。不会报错。。。报错的话就在b.h中用预编译命令。。
#ifdef _FILENAME_H_
#define _FILENAME_H_
//写其他要写在b.h中的
extern bit a_0;
//写其他要写在b.h中的
#endif // end of FILENAME_H_ sbit sfr,在51里都不算变量,而是一种符号。所以可以定义在头文件里,在要用到的C文件里包含就行,不需要什么extern Alimy 发表于 2013-5-27 10:42 static/image/common/back.gif
不会啊。。。我一直就是这样用的。不会报错。。。报错的话就在b.h中用预编译命令。。
#ifdef _FILENAME_H ...
恩,我以前是直接从培训的51汇编跳到了工作环境中AVR的C。没有系统学习C51。
不清楚原来sbit定义的位变量,在声明的时候要用bit声明 jswd0810 发表于 2013-5-23 13:43 static/image/common/back.gif
应该没有问题吧,我的定义
uchar bdata other_in;//此处other_in必须为bdata类型,否则编译出错
sbit mybit ...
结贴了,H 用extern bit就可以了,完美解答,谢谢 学习一下.... 可以呀一样 学习,打包带走 我这样声明后,怎么出现了很多警告啊
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
全部都是这种警告 感谢三楼,PICC中也是这样呢。 keil,12楼正解 king123 发表于 2013-12-21 11:20
我这样声明后,怎么出现了很多警告啊
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
全部都是这 ...
我的也是一样哦。
而且程序也不正常。 你该用bit,而不是sbit。 昨天才调试好的
如果在c文件定义了sbit,在h文件声明bit,其它c文件调用它Keil会警告,并且程序运行不正常,后来是在需要调用的每个C文件都定义一下sbit就可以了。 申请变量应该用bit,
sbit是GPIO的端口定义 24楼正解,申请定义位变量应该用bit, sbit是定义GPIO的端口。
页:
[1]