c语言多文件编程单片机例子,多文件编程首次测试

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

1.function.c的代码#include 

#include 

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

编程界面图片

f9b27eed97162b892d230307ffe7e087.png

3.main.c文件代码

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

#include 

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端口的轮流输出,这个问题我们后面再讲解。