|
本帖最后由 NH6496 于 2017-2-17 08:01 编辑
普中2.0板,将8个数码管分2个倒计时器。
全部灯灭后片,p2,0有闪烁干扰,将中断调快闪烁也加快。
/**************************************************************************************
* *
实现现象:倒计时1不到0,P2,6亮 。 倒计时1到0,P2,6灭;
倒计时2接着倒计时 ,P2,0亮。倒计时2到0 ,P2,0也灭 。
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int uint; //对数据类型进行声明定义
typedef unsigned char u8;
int s=5,m=0,sa=6,ma=0;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit OUTa=P2^0;
sbit OUT=P2^6;
uint a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0到9
uint sg,ss,mg,ms,sga,ssa,mga,msa,flaga=0,flagb=0;
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(uint i)
{
while(i--);
}
/***************************************************
动态置LEDCOM口低电平
**********************/
void DigDisplay()
{
u8 i;
sg=s%10;
ss=s/10;
mg=m%10;
ms=m/10;
sga=sa%10;
ssa=sa/10;
mga=ma%10;
msa=ma/10;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; P0=a[sg]; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; P0=a[ss]; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; P0=a[mg]; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; P0=a[ms];break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; P0=a[sga]; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; P0=a[ssa];break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; P0=a[mga];; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; P0=a[msa]; break;//显示第7位
}
delay(11); //间隔一段时间扫描
P0=0x00;//消隐
}
}
/*******************************************************************************
* 函 数 名 : Timer1Init
* 函数功能 : 定时器1初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer1Init()
{
TMOD=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
/*******************************************************************************
* 函 数 名 : void Timer1() interrupt 3
* 函数功能 : 定时器1中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer1() interrupt 3
{
static uint i;
TH1=0Xfc; //给定时器赋初值,定时1ms
TL1=0X00;
i++;
if((s||m)!=0)
{
if(i==1000)
{
{
i=0;
s--;
}
if(s<=-1&&(m!=0))
{
s=59;
m--;
}
}
}
else
{
if(i==1000)
{
{
i=0;
sa--;
}
if(sa<=-1&&(ma!=0))
{
sa=59;
ma--;
}
else{ ma-=0; if(ma<=-1) { ma=0; flagb=1; }}
}
else{ sa-=0; if(sa<=-1) { sa=0; flaga=1; }}
if(flaga==1&&flagb==1) EA=0;
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
while(1)
{
DigDisplay();
Timer1Init(); //定时器1初始化
if(flaga==1&&flagb==1) EA=0;
OUTa=1;
if((s||m)==0)
{
OUT=1;
if((sa||ma)!=0)
OUTa=0;
}
else{OUT=0;OUTa=1;}
if((sa||ma)==0)
{OUTa=1;}
if((sa||ma)==0)
EA=0;//关总中断
}
|
|