Keil C 中全局变量的使用

转自:http://blog.csdn.net/kulung/article/details/5994876

Keil C 中全局变量的使用

在KEIL C中,有多个源文件使用到全局变量时,可以在一个源文件中定义全局变量,在另外的源文件中用extern 声明该变量,说明该变量定义在别的文件中,将其作用域扩展到此文件。

例如:有以下两个源文件test1.c,test2.c

//test1.c

char aaa;                                //定义aaa

func1()

{

char bbb;

aaa = bbb;

}

……

 

//test2.c

extern char aaa;          //把aaa的作用域扩展到此

func2()

{

char ccc;

aaa =ccc;

}

……

如果还有其他文件要用到aaa,用法同test2.c,使用extern char aaa;语句将aaa的作用域扩展到此,然后就可以使用它。

这里要特别注意的是:在使用extern时,不要忘了变量的类型,也就是上面例子变量aaa的修饰符char,不然结果就不是你想要的结果了,aaa的值将不可预料。

本来我想尝试把全局变量定义到头文件里面的,可是屡试不爽,编译器老是报重定义的错,还举上面的例子,具体如下:

//test1.h

#ifndef __TEST1_H__

#define __TEST1_H__

char aaa;                                         //test1.c的头文件中定义aaa

func1();

 

#endif

 

//test1.c

#include “test1.h”

func1()                                                       //在func1中给aaa赋值

{

char bbb;

aaa = bbb; 

}

//

//test2.h

#ifndef __TEST2_H__

#define __TEST2_H__

extern char aaa;                                       //test2.c的头文件中声明aaa为外部变量

func2();

 

#endif

 

//test2.c

#include “test1.h”                                               //包括test1.h

#include “test2.h”

func2()

{

char ccc;

aaa =ccc;

}

 

 

可是编译器总是报aaa重定义的错,经过改正,编译通过,修改如下:

//test1.h

#ifndef __TEST1_H__

#define __TEST1_H__

extern char aaa;                                      //test1.c的头文件中声明外部变量aaa

func1();

 

#endif

 

//test1.c

#include “test1.h”

char aaa;                                                     //test1.c中定义aaa

func1()                                                       //在func1中给aaa赋值

{

char bbb;

aaa = bbb; 

}

//

//test2.h

#ifndef __TEST2_H__

#define __TEST2_H__

func2();

 

#endif

 

//test2.c

#include “test1.h”                                               //包括test1.h

#include “test2.h”

func2()

{

char ccc;

aaa =ccc;

}

也就是说,只要在使用的源文件中定义全局变量,在对应头文件中声明该全局变量为外部变量,即该变量允许外部使用,在其他要使用该变量的源文件中包括该头文件即可。

  • 17
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
---------------------------------- Keil C51语言使用技巧及实战_周立功书籍 ---------------------------------- PDF文件,带书签功能,阅读非常方便,不是精品我不发. -----------目录------------------- 介绍 第一章 硬件 1 概述 2存储区结构 2.1 CODE 区 2.2 DATA 区 2.3 特殊功能寄存器 2.4 IDATA区 2.5 XDATA区 3 位操作和布尔逻辑 4 寻址方式 5 处理器状态 6 电源控制 6 断系统 6.1 断优先级寄存器 6.2 断使能寄存器 6.3 断延迟 6.4 外部断信号 7 内置定时/计数器 7.1 定时器工作方式 0 和方式 1 7.2 定时器工作方式 2 7.3 定时器工作方式 3 7.4 定时器 2 8 内置 UART 8.1 UART模式0 8.2 UART模式1 8.3 UART模式2 9 其它功能 9.1 I2C 9.2 A/D转换 9.3 看门狗 10 设计 11 实现 第二章 用 C 对 8051 编程 1 为什么要用高级语言 2 C 语言的一些要点 2.1 结构 2.2 联合 2.3 指针 2.4 类型定义 3 Keil C和ANSI C 3.1 数据类型 3.2 特殊功能寄存器 4 存储类型 4.1 DATA 区 4.2 BDATA区 4.3 IDATA段 4.4 PDATA和XDATA段 5 指针 6 断服务 6.1 指定断服务程序使用的寄存器组 7 再入函数 8 使用 Keil C 时应做的和应该避免的 8.1 采用短变量 8.2 使用无符号类型 8.3 避免使用浮点指针 8.4 使用位变量 8.5 用局部变量代替全局变量 8.6 为变量分配内部存储区 8.7 使用特定指针 8.8 使用调令 8.8 使用宏替代函数 9 存储器模式 10 混合存储模式 11 运行库 12 动态存储分配 13 结论 第三章 使用软件补充硬件 1 介绍 2 使用小存储模式 3 使用液晶驱动 3.1 LCD驱动接口 4 显示数据 4.1 定制 printf 函数 5 使用定时计数器来计时 6 使用系统时标做用户接口 7 改进时钟软件 8 优化内部 RAM 的使用 9 完整的程序 10 使用看门狗定时器 12 保存系统数据 13 结论 第四章 在 8051 上使用汇编和 C 1 介绍 2 增加段和局部变量 3 设置变量地址 4 结合C和汇编 5 内联汇编代码 6 提高编译器的汇编能力 7 仿真多级断 8 时序问题 9 结论 第五章 系统调试 1 介绍 2 通过系统设计来帮助调试 3 使用调试端口 4 使用Monitor-51 5 利用I/0端口进行调试 6 使用ICE 7 结论 第六章 断系统 1 介绍 2 断驱动系统和查寻系统 3 断的电平和边沿触发 3.1 电平触发断 3.2 边沿触发方式 4 共用断 6 扩充外部断数 7 断服务程序 8 结论 第7章 串行口 1 介绍 2 慢速串行口和PC的接口 3 高速串行I/O 4 结论 第八章 8051的网络设计 1 复合串行端口 2 队列实行 3 使用内置定时器作TDMA控制 3 保持节点器件同步 4 CSMA网络 5 结论 第九章 控制编译和连接 1 把C代码转变成Keil C代码 2 把汇编代码转换成Keil汇编代码 3 使用using关键字 4 控制连接覆盖过程 5 使用64K或更多RAM 6 使用64K以上的代码空间 7 结论 第十章 8051的模糊控制 1 介绍 2 什么是模糊逻辑 3 模糊系统的结构 4 模糊控制使用的场合 5 进行模糊控制 6 模糊功能的实现 7 方案调整 8结论 总结 ----------------------------------
#include #include //自定义头文件,KeyScan用于键盘扫描。 #include //用于I2C总线。 #define uchar unsigned char #define uint unsigned int unsigned char b[7]={50,58,9,1,15,6,15},clock1[2]={0,12},clock2[2]={0,0}; //b[7]的元素含义:秒,分,时,星期,日,月,年 clock的元素含义:分,时。 code unsigned char tab[11]={0x03,0xf3,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x00}; //数码管0-9的编码列表,0x00点亮全部管。 code unsigned char tab2[2]={0x6d,0xff}; //ox6d: 表示三横图标。 unsigned char time[7]; //时间设置函数的参数。 void delay(unsigned int cnt); //延时函数声明。 unsigned char getkey1(); //unsigned char getkey2(); //读键盘函数声明。 void tim(void); //断函数声明。 void KeyDelay(unsigned int KeyJsTime); //键盘扫描延时函数声明。 void display(uchar bit7,uchar bit6,uchar bit5,uchar bit4, uchar bit3,uchar bit2,uchar bit1,uchar bit0); //数码管显示函数。 void ReadTime(unsigned char TIME[7]); //DS1307读时间函数。 void SetTime(unsigned char TIME[7]); //设置时间初值函数。 void SwitchRTC(unsigned char SWITCH); //时间修改的使能函数:SWITCH=1禁止修改时间,SWITCH=0可以修改时间。 uchar dis_num_h; //显示记录数据的组别十位 uchar dis_num_l; //显示记录数据的组别个位 uchar dis_min_h; //要显示的分的十位; uchar dis_min_l; //要显示的分的个位; uchar dis_sec_h; //要显示的秒的十位; uchar dis_sec_l; //要显示的秒的个位; uchar dis_dsec; //要显示的0.1秒; uchar min=0x00; //防止意外,赋初值。分······· uchar sec=0x00; //秒 uchar dsec=0x00; //十分之一秒。 uchar en,i,clocken1=0,clocken2=0; main() { unsigned char quzhi,xianshi,symbol=0x55,set,set1=0x55,ce; unsigned char c[30]; unsigned char num,num1,j,k,stop=1; //注意stop必须先赋初值1。 PLLCON&=0xf8; //设置频率为12.582912MHz TMOD=0x01; //选定定时器及其工作模式。 TH0=0xce; //赋初值:52736,则总共的计数次数为:65536-52736=12800,即12.8毫秒。 TL0=0x00; IE=0x82; //断控制,10000010,EA=1开总断,ET0=1:定时器0断允许。0x82:1000 0010 I2CCON=0xE8; //开启I2C总线通信,具体含义参阅ADuC848英文版说明资料。 SetTime(b); //设定初始时间。 SwitchRTC(1); //调用时间保持函数。 while(1) //设置死循环,实现循环执行。 { ReadTime(time); //调用读时间函数,读取当前的时间,并保留在time数组。 if(((clock1[0]==time[1])&&(clock1

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值