单片机及C51的sbit变量,如何实现外部文件引用,extern声明不行

2020-01-19 19:37发布

本帖最后由 bbssilverkey 于 2013-5-22 13:01 编辑

文件3个:
a.c  - 用sbit声明老了一个变量 key
a.h
_main.c - #include "a.h"  主函数调用 key这个变量,编译 显示未定义

问题:我不把sbit丢a.h不行么?当然丢a.h肯定能过编译.
请教解决方法
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
24条回答
chencc8
1楼-- · 2020-01-20 22:05
jswd0810 发表于 2013-5-23 13:43
应该没有问题吧,我的定义
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是错误的基地址
pang7
2楼-- · 2020-01-21 04:01
你没仔细看三楼
在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 就ok  keil 是有些问题 但这些问题不会弱
chencc8
3楼-- · 2020-01-21 07:42
 精彩回答 2  元偷偷看……
Alimy
4楼-- · 2020-01-21 08:46
chencc8 发表于 2013-5-22 17:09
我记得我是这样
在a.h上声明了extern bit  a_0;结果报错……
明天再试试看

不会啊。。。我一直就是这样用的。不会报错。。。报错的话就在b.h中用预编译命令。。
#ifdef _FILENAME_H_
#define _FILENAME_H_

//写其他要写在b.h中的
extern bit a_0;
//写其他要写在b.h中的

#endif   // end of FILENAME_H_
qllaoda1
5楼-- · 2020-01-21 12:25
sbit sfr,在51里都不算变量,而是一种符号。所以可以定义在头文件里,在要用到的C文件里包含就行,不需要什么extern
chencc8
6楼-- · 2020-01-21 16:35
Alimy 发表于 2013-5-27 10:42
不会啊。。。我一直就是这样用的。不会报错。。。报错的话就在b.h中用预编译命令。。
#ifdef _FILENAME_H ...

恩,我以前是直接从培训的51汇编跳到了工作环境中AVR的C。没有系统学习C51。
不清楚原来sbit定义的位变量,在声明的时候要用bit声明

一周热门 更多>