延时的作用就是让数据正确处理。 CPU速度来能多快取得I0口状态就多快取,而是CPU程序按指定时间间隔取值。 比如CPU速度为1微妙可以处理一条语句,你刚取完当前10口状态,如果没有延时处理,在循环处理过程中立即又去取当前10口状态作为下一个Bit位的数据。
为了避免重复打代码浪费时间,把每种函数弄成模块化,再复制过去成新的代码,会节省很多时间,以下是延时函数的c文件和h文件。
delay.c文件
#include "delay.h"
#include "intrins.h"
#include "SMG.h"
#include "regx52.h"
//延时函数
void Delay1_ms(unsigned int a) //@11.0592MHz
{
unsigned char i, j;
for(a;a>0;a--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
delay.h文件
#ifndef _DELAY_H
#define _DELAY_H
void Delay1_ms(unsigned int a);
void SMG_Select(unsigned char a);
#endif
数码管函数显示代码的c文件和h文件。
SMG.c
#include "SMG.h"
#include "regx52.h"
#include "delay.h"
unsigned char meg_code[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
sbit HC_A0 = P2^2;
sbit HC_A1 = P2^3;
sbit HC_A2 = P2^4;
void SMG_Select(unsigned char n)
{
switch(n)
{
case 1:
HC_A0 = 0;
HC_A1 = 0;
HC_A2 = 0;
break;
case 2:
HC_A0 = 1;
HC_A1 = 0;
HC_A2 = 0;
break;
case 3:
HC_A0 = 0;
HC_A1 = 1;
HC_A2 = 0;
break;
case 4:
HC_A0 = 1;
HC_A1 = 1;
HC_A2 = 0;
break;
case 5:
HC_A0 = 0;
HC_A1 = 0;
HC_A2 = 1;
break;
case 6:
HC_A0 = 1;
HC_A1 = 0;
HC_A2 = 1;
break;
case 7:
HC_A0 = 0;
HC_A1 = 1;
HC_A2 = 1;
break;
case 8:
HC_A0 = 1;
HC_A1 = 1;
HC_A2 = 1;
break;
}
}
char i =0;
for(i=1;i<=8;i++) //8个LED灯循环8次
{
SMG_Select(i); //选中第i个LED
P0 = meg_code[num%10]; //取出传入参数的个位数的值
Delay1_ms(1);
P0 = 0x00; //关掉数码管
num = num/10; //取完个位数之后除以10,去掉当前个位数
if(num<=0) //判断传入参数是否取完
break; //如果取完则退出循环
}
}
SMG.h
#ifndef _SMG_H_
#define _SMG_H_
void Show_Num(long num);
void SMG_Select(unsigned char n);
#endif