Dotcpp  >  编程教程  >  多文件编程  >  多文件编程首次测试

多文件编程首次测试

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

延时函数虽然很少使用了,但是有时需要测试代码的时候还会派上用场,所以也把它放进“function.c”文件中。

 

1.function.c的代码

#include <reg52.h> 
#include <function.h> 
 
u8 code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管状态值初始化
u8 LedBuff[6]={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//初始化数码管显示缓存区
 
void delay_ms(u16 x)
{
    u16 i,j;
    if(x==1000)
    {
        for(i=0;i<19601;i++)//延时1s
        {
            for(j=5;j>0;j--);
        }
    }
    else while(x--)for(j=115;j>0;j--);
}
 
void LED_Init()
{
    P1|=0x0E;//让P1.1,P1.2,P1.3强制输出1
    P1&=0xEE;//让P1.0和P1.4强制输出0
}
 
void SEG_Scan()
{
    static u8 i = 0;     
    P0 = 0xFF;            //端口状态全部熄灭数码管里的LED达到刷新作用
    P1 = (P1 & 0xF8) | i; //i等于0时,就是“ADDR2=0; ADDR1=0; ADDR0=0;”,i等于1时,就是“ADDR2=0; ADDR1=0; ADDR0=1;”,以此类推
    P0 = LedBuff[i];      //6个缓冲区的值轮流赋给P0
    i++;
    if(i>=6)i=0;          //让i在0~5之间循环变化
}
 
void ShowNumber(u32 num)
{
    char i;//取值范围-128~127
    u8 buf[6];    
    for (i=0; i<6; i++)    //把长整型数转换为6位十进制的数组
    {
        buf[i] = num % 10;
        num = num / 10;    //舍掉个位数,重新装载
    }
    for (i=5; i>=1; i--)   //从最高位起,遇到0填充不显示的代码,遇到非0则退出循环
    {
        if (buf[i] == 0)
            LedBuff[i] = 0xFF;
        else
            break;
    }
    for ( ; i>=0; i--)     //剩余低位都如实转换为数码管显示字符
    {
        LedBuff[i] = LedChar[buf[i]];
    }
}

 

2.function.h的代码

#ifndef __FUNCTION_H__
#define __FUNCTION_H__
 
sbit BEEP  = P1^6;
sbit LED2  = P0^0;
sbit LED3  = P0^1;
sbit LED4  = P0^2;
sbit LED5  = P0^3;
sbit LED6  = P0^4;
sbit LED7  = P0^5;
sbit LED8  = P0^6;
sbit LED9  = P0^7;
typedef unsigned char  u8;   //对数据类型进行声明定义
typedef unsigned int  u16;
typedef unsigned long u32;
extern  u8 LedBuff[6];       //对数码管缓存区进行外部声明
extern  u8 code LedChar[16]; //对数码管真值表进行外部声明
 
//只要在“function.c”文件中封装有的函数都需要在头文件中声明一下
void delay_ms(u16 x);
void LED_Init();
void SEG_Scan();
void ShowNumber(u32 num);
 
#endif


编程界面图片

多文件5 


3.main.c文件代码

有了“function.c”和“function.h”,以后我们提供的代码就精简的很多了,这里用一小段代码测试一下,main.c文件加入测试代码,感受一下这种模块化编程的魅力。

#include <reg52.h> 
#include <function.h>

void main()
{  
    u16 i,x,NUM=12345;
    LED_Init();//初始化LED硬件模块
    
    LED2=0;LED9=0;
    delay_ms(100);
    LED3=0;LED8=0;
    delay_ms(100);
    LED4=0;LED7=0;
    delay_ms(100);
    LED5=0;LED6=0;
    delay_ms(100);
    
    for(i=0;i<5000;i++)//蜂鸣器响一下
    {
        BEEP=!BEEP;
        for(x=0;x<30;x++);
    }
    ShowNumber(NUM);//更新缓存区的内容,首次显示12345在数码管上
    while(1)
    {     
        SEG_Scan();
        i++;
        if(i>=8000)//隔一段时间更新数码管显示的内容
        {
            i=0;
            ShowNumber(NUM++);
        }   
    }
}

数码管在数字变化的时候会微闪烁是因为执行“ShowNumber(NUM++);”花费的时间过多导致没能快速切换三八译码器IO端口的轮流输出,这个问题我们后面再讲解。


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

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