1589|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

c语言模块化编程 [复制链接]

本帖最后由 fish001 于 2019-9-7 21:44 编辑

在刚接触单片机,刚编写代码的时候都只是有一个.h 和一个.c文件。把所有的函数都写在.c里面。这样遇到复杂的系统时,代码量就很大,一下子就是几百行。而且把所有函数写在一个.c里不利于移植,对于以后的开发有了很大的限制。为了解决这个缺点就必须学会模块化编程。将程序分解成一个一个模块。这样就有了多个.c 和多个.h。下面开始讲解什么是模块化编程,怎么去模块化。

借用网上的流水灯例子来说明,侵删。

在不模块化情况下:

 
#include <reg52.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
void Delay_Ms(uint xms)
{
    uint    i,j; for(i=0;i<xms;i++)
    {
        for(j=0;j<110;j++);
    }
}
void Display_Led()
{
    uchar    aa,j;
    aa = 0x7f;
    for(j=0;j<8;j++)
    {
        P1  = aa;
        aa = _cror_(aa,1); Delay_Ms(500);
    }
}
void main()
{
    while(1)
    {
        Display_Led();
    }
}
上面这个程序是全部写在了main.c这一个C文件里。完成了一个流水灯功能,程序非常简单,那么下面我们将程序模块化。模块化我们就建立一个   main.c    led.c    led.h    这三个文件,那么这三个文件里分别写什么东西呢,下面一个一个的写。led.h 里内容如下:

#ifndef LED_H             //理解为    if not define led.h
#define LED_H             //如果没有定义 led.h ,这里就定义一个 led.h
 
#include "reg52.h"        //由于  led,c 里面要用到 51单片机寄存器    P1,
                // 所以这里包含    51 单片机的头文件
#include "intrins.h"        // 循环移位用到
#define    uchar unsigned char
#define    uint unsigned int    // 这些宏定义都可以在头文件 .h 里定义
void Delay_Ms(uint    xms);
void Display_Led();        // 将led.c 里的函数在led.h 里面申明
 
#endif    // 定义结束
led.c 里内容如下,将流水灯的主要程序放在这个.c 里面。作为单独的流水灯模块,在以后的程序中如果要用到这个流水灯程序
就直接把 led.c 和 led.h 移植过去。

#include  "led.h"    // 这里包含 led.h 这个头文件
void Delay_Ms(uint xms)
{
    uint    i,j; for(i=0;i<xms;i++)
    {
        for(j=0;j<110;j++);
    }    
}
 
void    Display_Led()
{
    uchar    aa,j; aa = 0x7f; for(j=0;j<8;j++)
    {
        P1  = aa;
        aa = _cror_(aa,1);Delay_Ms(500);
    }
}
用来完成流水灯功能的模块程序已经写好了,现在就开始主函数的编写。主函数就只需要调用一个Display_Led()函数就行了,看现在是怎么写的:

#include "led.h"        //在  main.c 里现在包含的也是 led.h 而不是 reg52.h了
void main()
{
    while(1)
    {
        Display_Led();    // 这样直接调用就行。
    }
}
模块化编程的时候要想到你把一个 .c 和.h 文件给另一个人,那个人能够很轻松的运用你给的这个模块来实现效果,且不需要去改动很多东西,那就算成功了。

extern是什么:extern文件间的全局变量。因此,.c里面用到的变量名字,一般在对应的.h文件中用extern声明(只声明不定义)
 

点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表