Dotcpp  >  编程教程  >  LED及入门  >  函数封装

函数封装

点击打开在线编译器,边学边练

1.简洁代码

单片机程序阅读一般都是先从主函数开始,上一讲的程序写法在主函数中显得不简洁,影响人阅读代码的效率。有时我们只需要知道一条语句代表什么意思即可,所以我们把延时部分封装为一个函数,在主函数里调用函数名表示此处语句延时1秒,这样可读性就强的多,也简洁地多,读者也可以先了解一下《手把手教你学51单片机》文档中的4.6节先。

#include <reg52.h> 
sbit LED2  = P0^0;
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;

void delay()//延时功能封装为一个函数
{
    unsigned int i,j;//定义两个用来完成延时功能的变量
    for(i=0;i<19601;i++)//延时1s
    {
        for(j=5;j>0;j--);
    }
}

void main()
{  
    ADDR3 = 1;//使能三八译码器
    ENLED = 0;// 

    ADDR2 = 1;//**************************
    ADDR1 = 1;//让三八译码器的IO6输出低电平
    ADDR0 = 0;//**************************

    while (1)
    {
        LED2=0;//点亮最右端的灯
        delay();//延时1s  
        LED2=1;//熄灭最右端的灯
        delay();//延时1s
    }
}

这个原理很简单,我们用一张图表示就知道什么叫函数封装调用了

函数封装调用

这里只不过是把变量i和变量j放在了“void delay()”中定义,实现的功能和上一讲的代码都是一样的。不过笔者用软件仿真发现这样写会花掉CPU调用函数的4微秒时间,为了方便阅读牺牲这4微秒是必须的,但我们不需在后面加例如“LED2=0;”或“i=0;”等这些语句也可以离奇的解决上一讲所说的灯跳变与秒表计时数字跳变不同步的诡异现象。

我们比较推荐用函数封装来模块化编程,因为这样比较符合编程思想也是我们必须要使用的编程技巧。

 

2.建议

本节的代码虽然不多,但是我们也要养成从主函数开始阅读代码的习惯,而不是一开始就从头往下看代码。比如映入我们第一眼帘的是“void delay()”函数,这时我们不应该进入函数体去阅读里面的内容,而是马上找到“void main()”进入阅读研究里面的代码,当看到“delay();”时有了注释我们就有了对这个函数的第一印象,这时再去查看这个函数的内容。

常见步骤如下:

函数封装调用2

函数封装调用3

一定要在编译之后才能按F12。虽然在代码量少的时候看不出这种方法的优势,但当我们阅读别人的代码时,代码量一般比较多,用此方法则能快速了解别人所写程序的层层意思,关于这个习惯,大家学到后面的程序就能领悟了。


本文固定URL:https://www.dotcpp.com/course/183

上一课:

延时1秒

下一课:

函数传参调用

单片机教程
第一章 单片机入门
第二章 LED及入门
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)