标题:
关于C语言结构体的使用及调用
[打印本页]
作者:
wind2005
时间:
2022-2-6 11:22
标题:
关于C语言结构体的使用及调用
当前学习,书上关于结构的说明不是很详细。虽然解决了问题,共享出来,看看是不是有更好的解决办法。
在RTC.h里定义结构:
typedef struct
{
u16 year;
u8 month;
u8 day;
u8 hour;
u8 minute;
u8 second;
}timer_TypeDef;
extern timer_TypeDef xdata clock;
在RTC.C里加入此语句,
timer_TypeDef xdata clock;
因main文件里include RTC.h, 可直接调用。 我试过删除xdata,编译就出错。看起来只有这样的操作才用结构。
我曾经在main.c里,全局变量里用 传统的struct rtc{} clock; 来定义结构,一直没有成功。
大家有其它方式使用结构吗?
作者:
lkc8210
时间:
2022-2-6 23:18
按你的步骤打一遍代码
xxx.h:timer_TypeDef xdata clock;
xxx.c:timer_TypeDef xdata clock;
编译成功
xxx.h:timer_TypeDef clock;
xxx.c:timer_TypeDef clock;
编译成功
xxx.h:timer_TypeDef clock;
xxx.c:timer_TypeDef xdata clock;
编译失败
xxx.h:struct rtc{}; extern struct rtc clock;
xxx.c:struct rtc clock;
编译成功
作者:
Hephaestus
时间:
2022-2-7 14:52
如果必须加xdata才能通过编译的话,那么就跟什么结构体完全无关了,是你的RAM全用光了。
作者:
wind2005
时间:
2022-2-7 15:41
RTC.h里定义结构,RTC.c里使用此结构, 在main.c里还会调用此结构,编译成功的三个,可以这样吗?
多谢!
作者:
dtlhjnmg
时间:
2022-2-9 10:19
本帖最后由 dtlhjnmg 于 2022-2-9 10:29 编辑
1. xdata只是申明变量使用外部扩展存储器,和struct定义无关
2. 用到了extern,再修改源变量定义的同时,需要修改extern申明保持一致,且并不推介使用extern,可以通过函数封装获取。
3. 至于struct的定义,有多种类型,就你上面的typedef而言,可以如下用法:
typedef struct test_s {
......
}test_t;
1> 通过strcut定义: struct test_s test; (使用这种, 上面的typedef 和 test_t 可省略去掉)
2> 通过test_t定义: test_t test; (使用这种, 上面的test_s 可以省略去掉)
这属于c基本语法,看你上述的表达应该是想使用如下方法:
struct test_s{
......
} test;
这样也可以定义test结构体成员,但实际使用中基本不存在这种用法,都是上面示例的用法。
至于你说的编译不过,可以在定义前加入xdata尝试:例如: xdata test_t test; 或者xdata struct test_s test;另外C基础语法的学习测试,建议先在电脑端编译测试运行
说这么多,只为进来拿3分下载一个资源
,好心人就施舍我几分吧....
作者:
jizhongbiao
时间:
2022-2-9 11:58
ram用光了是正解
作者:
lkc8210
时间:
2022-2-9 15:19
上班摸鱼中,只能用Proteus 仿真一下
Proteus 的AT89没有xdata, 用idata代替一下,编译成功
2022-02-09_151350.png
(24.47 KB, 下载次数: 54)
下载附件
2022-2-9 15:16 上传
main.c
#include <STC89C5xRC.H>//Code:8k Ram:512 xdata:256 EEProm:5k Addr:0x2000
#include "struct_Test.h"
typedef unsigned char u8; //0 to 255
typedef unsigned int u16; //0 to 65535
typedef unsigned long u32; //0 to 4294967295
DateTime idata PLC_Clock = {2022, 2, 9, 15, 12, 0};
u8 TMR_Clock_ACC;
u8 TMR_Disp_ACC;
u8 Disp_Buff[8];
u8 code smgduan[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40}; //共阴数码管
//0*****1*****2*****3*****4*****5*****6*****7*****8*****9*****-**
void Timer0Init(void)
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初始值1ms@12.000MHz 12T
TH0 = 0xFC; //设置定时初始值1ms@12.000MHz 12T
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void timer0_int (void) interrupt 1
{
static u8 Sys10ms;
TL0 = 0x18; //设置定时初始值1ms@12.000MHz 12T
TH0 = 0xFC; //设置定时初始值1ms@12.000MHz 12T
if(TMR_Disp_ACC)TMR_Disp_ACC--;
if(++Sys10ms == 10)
{
Sys10ms = 0;
//Timer 10ms
if(TMR_Clock_ACC)TMR_Clock_ACC--;
}
}
void Sys_Init(void)
{
ET0 = 1; //Timer0 interrupt Enable
EA = 1; //All interrupt Enable
}
void main()
{
u8 Sta = 0;
Timer0Init();
Sys_Init();
while (1)
{
if(!TMR_Clock_ACC)
{ TMR_Clock_ACC = 100;
Clock_Calc();
Disp_Buff[0] = PLC_Clock.SEC % 10;
Disp_Buff[1] = PLC_Clock.SEC / 10;
Disp_Buff[3] = PLC_Clock.MIN % 10;
Disp_Buff[4] = PLC_Clock.MIN / 10;
Disp_Buff[6] = PLC_Clock.HR % 10;
Disp_Buff[7] = PLC_Clock.HR / 10;
}
if(!TMR_Disp_ACC)
{ static u8 i = 0;
TMR_Disp_ACC = 2;
P2 = 0xff;
if(i == 2 || i == 5)
P0 = 0x40;
else
P0 = smgduan[Disp_Buff[i]];
P2 = ~(0x01 << i);
i = ++i % 8;
}
}
}
复制代码
struct_Test.h
#ifndef _struct_Test_H_
#define _struct_Test_H_
typedef struct {
unsigned int YY;
unsigned char MM;
unsigned char DD;
unsigned char HR;
unsigned char MIN;
unsigned char SEC;
} DateTime;
extern DateTime idata PLC_Clock;
void Clock_Calc();
#endif
复制代码
struct_Test.c
#ifndef _struct_Test_H_
#include "struct_Test.h"
#endif
void Clock_Calc()
{
if(++PLC_Clock.SEC >= 60)
{
PLC_Clock.SEC = 0;
if(++PLC_Clock.MIN >= 60)
{
PLC_Clock.MIN = 0;
if(++PLC_Clock.HR >= 24)
{
PLC_Clock.HR = 0;
if(++PLC_Clock.DD >= 30)
{
PLC_Clock.DD = 0;
if(++PLC_Clock.MM >= 13)
{
PLC_Clock.MM = 1;
PLC_Clock.YY++;
}
}
}
}
}
}
复制代码
作者:
songjie_he
时间:
2022-2-9 15:23
xdata只是数据定义在了外部的ram区,这个ram可能不是真的外部ram,一般stc在内部集成了片外的ram区,所以xdata只是定义了变量的位置,和程序没有什么关系,报错大部分就是ram不够用了,根据你选择的芯片决定你的ram区大小,像89c51只有128字节,内存可经不起你这么折腾
作者:
frank_tw
时间:
2022-2-12 15:42
51 have 3 type memory
data : address 0x00~ 0x7F (internal memory)
idata: address 0x00~ 0xFF (internal memory)
xdata: address 0x0000~ 0xFFFF (external memory 外部)
作者:
Y_G_G
时间:
2022-2-13 01:48
这样写就不会出错了
extern struct
{
成员1;
成员2;
.......
}xdata GPS_Buffer0,GPS_Buffer1;
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1