‘壹’ 使用KEIL4 编模块化编程的时候 为什么在C文件中定义的数组编译能通过 把数组放到头文件H里面就不行了呢
这些错误都是有重复的公共定义。
“我把它放到ds1302.h里面怎么就不行了呢”
原来的删掉了吗?不会在头文件和程序文件中同时都有吧?
另外楼主,你那个mian.c文件的命名真的很别扭……
‘贰’ 如何写在keil中写单片机的模块化的程序
首先要会编写满足使用要求的程序,在此基础上,把一些功能独立的子程序单独编成一个源文件,这些源文件里的子程序一旦试验成功,以后就不需修改,也不需复制粘贴,只管整体添加即,源文件可能工巧匠比较长,为便于查找,可编一个头文件将这些子程序声明一下,然后在主程序包含这个头文件即可,如液晶屏1602的驱动函数,写命令 写数据 初始化函数 甚至再编写一些常用的字符串显示函数,整型数据显示函数,都有可以单独作为一个源文件 还有EEPROM操作的相关函数,跟其它部分联系较少,也可以单独编成源文件, 子程序比较少的源文件可以直接引用,为便于查找,子程序多的模块都有要有头文件和该源文件对应,以下是我封装的STC单片机内部的EEPROM操作的头文件和源文件,跟其它部分就没什么联系,因此作为一个独立模块 头文件eeprom.h如下:
ifndef __EEPROM_H__
#define __EEPROM_H__
#define uchar unsigned char
#define uint unsigned int
//擦除片内EEPROM的一个扇区 这些函数在此只是声明一下,实体在源文件中
void eepromEraseSector (uint address);
void eepromWrite(uint address, uchar write_data);
//读取STC单片机内部EEPROM的一个字节
uchar eepromRead(uint address);
#endif
源文件eeprom.c 如下,里面的几个子函数都是STC单片机说明文档里有的,不需要任何修改,只管调用,所以平时我们只看头文件就行了
#include<STC12C54.H>
#define uchar unsigned char
#define uint unsigned int
//擦除片内EEPROM的一个扇区
void eepromEraseSector (uint address)
{
uchar ii;
ISP_ADDRL=address;
ISP_ADDRH=address>>8;
ISP_CONTR=0x01;
ISP_CONTR=ISP_CONTR|0x82; // 0x80 if SYSCLK<40MHz, 0x81 if SYSCLK<20MHz, 0x82 if SYSCLK<10MHz, 0x83 if SYSCLK<5MHz
ISP_CMD=0x03;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
for(ii=0;ii<3;ii++);
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
}
//对STC片内EEPROM的指定地址写入数据(即,字节编程)
void eepromWrite(uint address, uchar write_data)
{
uchar ii;
ISP_DATA=write_data;
ISP_ADDRL=address;
ISP_ADDRH=address>>8;
ISP_CONTR=0x01;
ISP_CONTR=ISP_CONTR|0x82; // 0x80 if SYSCLK<40MHz, 0x81 if SYSCLK<20MHz, 0x82 if SYSCLK<10MHz, 0x83 if SYSCLK<5MHz
ISP_CMD=0x02;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
for(ii=0;ii<3;ii++);
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
}
//读取STC单片机内部EEPROM的一个字节
uchar eepromRead(uint address)
{
uchar ii,z;
ISP_ADDRL=address;
ISP_ADDRH=address>>8;
//ISP_CONTR=0x01;
ISP_CONTR=ISP_CONTR|0x82; // 0x80 if SYS
ISP_CMD=0x01;//读命令切记哦
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
for(ii=0;ii<3;ii++);
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
z=ISP_DATA;
return(z);
}
‘叁’ keil C编程,模块化有警告,求解答
keyscan这个函数有声明、无实体。
你需要把keyscan.c文件添加到项目中,同时在keyscan.h头文件中的函数声明前面应当加上extern,这样外部模块才能正确调用。
‘肆’ C语言keil模块化 编程 需要注意哪些
模块化编程是指将一个庞大的程序划分为若干个功能独立的模块,对各个模块进行独立开发,然后再将这些模块统一合并为一个完整的程序。这是C语言面向过程的编程方法,可以缩短开发周期,提高程序的可读性和可维护性。
在单片机程序里,程序比较小或者功能比较简单的时候,我们不需要采用模块化编程,但是,当程序功能复杂、涉及的资源较多的时候,模块化编程就能体现它的优越性了。如前面我们写过的HT1380驱动程序、独立按键扫描程序和12864程序,每一个程序都是只用一个源文件编写就能完成,但是,当您制作一个12864液晶日历的时候,需要用到HT1380驱动程序、独立按键扫描程序和12864显示程序,如果把这三个程序全部集中在一个源文件里,将导致主体程序臃肿且杂乱,这样做并非不可取,只是降低了程序可读性、可维护性和代码的重用率。如果把这三个程序当做三个独立的模块放到你的主体工程进行模块化编程,效果就不一样了。
实际上,模块化编程就是模块合并的过程,就是建立每个模块的头文件和源文件并将其加入到主体程序的过程。主体程序调用模块的函数是通过包含模块的头文件来实现,模块的头文件和源文件是模块密不可分的两个部分,缺一不可。所以,模块化编程必须提供每个模块的头文件和源文件。下面我们以一个简单的例子(主体程序实现指示灯闪烁,延时模块实现延时功能)来演示模块化编程。
有些程序员为了省事,只建立模块的源文件,不建立头文件,在主体工程里直接将源文件包含进来,建议大家不要采取这样的做法,这是一种不符合C语言标准的做法,是一种冒险方法。只包含一个源文件可能没事,同时包含多个源文件的时候问题就会出现。
‘伍’ 关于51单片机C语言KEIL模块化编程
主程序中只能添加头文件,
楼主可以把C文件做成头文件格式,这样可以直接调用,不用再添加C文件了
‘陆’ keil关于模块化编程中的位定义
你说的不完整,不太明白你的意思。不过你放在自建的头文件里定义成全部变量,在两个模块中都包含进头文件,行吗?
又看了一遍你的问题,有点明白了。你的问题就是要把SCLK=P1^2的定义放在头文件里,还是放在.C文件里。你的问题与模块化编程没有一点关系,所以叫人看糊涂了。放在哪里都成。头文件里、C文件里都可以。
‘柒’ keil c 模块化编程中 位定义的问题
你这是在main.c中定义的 LCD_RS 在LCD_DISPLAY.c 这个文件中找不到LCD_RS的定义
你可以把它定义在LCD_DISPLAY.c这个文件中 然后在LCD_DISPLAY.c中包含LCD_DISPLAY.H
还有就在在main.c不用包含LCD_DISPLAY.c的 把LCD_DISPLAY.c添加到项目中就可以了
‘捌’ msp430的IAR能不能和keil c 一样,模块化编程
用IAR写MSP软件我没试过,但用IAR写ARM代码我做过,与KEIL C是一样的。在我想来,只要是C代码,都能一一对应的。
另外,注意在工程中增加C文件。
‘玖’ 以前写了一个比较长的程序,用KEIL编译是可行通过的,现学习C语言模块化编程,从将其模块化,但碰到
对于比较小的程序,一般只有一个c文件和一个头文件,全局变量我们通常会直接定义在c文件中,在程序之前加int i定义。如果要在头文件中定义有以下两种方法:用extern来声明:extern int i;这一句只是对变量i进行声明,在c文件的程序之前必须加上int i进行定义。extern int i=0;这一句声明和定义都做了。
对于大一点的程序,有很多c文件和头文件,这个时候全局变量就必须在头文件中声明(不需要初始化),然后在一个c文件中定义(该初始化的要初始化)。如果在头文件中定义,则编译的时候会出现重复定义的错误。如果只有头文件中声明就会出现没有定义有警告。
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
SYMBOL: K
MODULE: 222.obj (222)
出现上述错误则是因为变量k重复定义,把你的头文件中的变量定义前加extern(只是变量声明不用初始化),再在某一个你要调用该变量的c文件的程序之前再定义(注意第一个调用的c文件要负责附带初始化该变量,其他调用的c文件就不需要初始化过程啦)
‘拾’ 使用keil进行模块化编程时,对I/O口的定义写在c文件里面还是h头文件里面比较好啊
sbit这样的端口定义建议放在.h头文件中。
对于多个源文件的项目而言,这是必然的选择。