守时中止和外部中止都用上了。
源程序如下:
#pragma REGPARMS CD DB SB OE OT(5)
#include
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
byte sec,ms,xs_en,shic;/*界说时刻变量*/
sbit P2_0 = P2^0;//键盘输出1
sbit P2_1 = P2^1;//键盘输出2
sbit P2_2 = P2^2;//键盘输入1
sbit P2_3 = P2^3;//键盘输入2
sbit P2_4 = P2^4;//蜂鸣器
sbit P2_5 = P2^5;//继电器
sbit P2_6 = P2^6;//数码管1
sbit P2_7 = P2^7;//数码管2
/**********************************************************************
函数功用:延时程序
进口参数:延迟时刻
出口参数:无
***********************************************************************/
void Delay(byte time)
{
byte i;
for(;time > 0;time–)
for(i=10;i > 0;i–);
}
/*LED数码管显现程序****************************************************
进口函数:要显现的值
出口函数:无
**********************************************************************/
void xianshi(byte xs)//输入要显现的值
{
byte code Seg[10]={0x28,0xf9,0x4c,0x58,0x99,0x1a,0x0a,0xf8,0x08,0x18};
P0=0xff;//显现个位
P2_7=1;
P2_6=0;
P0=Seg[xs%10];
Delay(10);//延时程序
P0=0xff;//显现十位
P2_6=1;
P2_7=0;
P0=Seg[xs/10];
Delay(10);//延时程序
}
/**********************************************************************
函数功用:扫描键盘
函数进口:无
函数出口:有/无键按下1/0
**********************************************************************/
byte keyfun(void)
{
byte P2copy;
P2 &= 0xfc;
P2copy = P2;
if((P2copy & 0x04) && (P2copy & 0x08))return 0;
else
{
EA = 0;
return 1;
}
}
/**********************************************************************
函数功用:外部中止服务程序
进口参数:无
出口参数:无
***********************************************************************/
void STOP1() interrupt 2/*当ITN0中止时履行此函数*/
{
ET0 = 1;
xs_en = 1;
}
/**********************************************************************
函数功用:外部中止服务程序
进口参数:无
出口参数:无
***********************************************************************/
void STOP0() interrupt 0/*当ITN0中止时履行此函数*/
{
if(xs_en)
{
xs_en = 0;
ms = 0;
sec = 0;
}
else
{
ET0 = 0;
}
}
/**********************************************************************
函数功用:守时器中止函数(扫描键盘)(10ms 16位守时)
进口参数:无
出口参数:无
***********************************************************************/
void Time0_Func() interrupt 1/*当守时器中止时履行此函数*/
{
TH0=(0xffff-9259)/256;/*10ms*/
TL0=(0xffff-9259)%256;
ms++;
if(keyfun())//当有键时,P2低四方位1,守时器中止制止
{
P2 |= 0x0f;
}
else
{
if(ms == 99){ms = 0;sec++;}
if(ms % 5 == 0 && xs_en)
{
switch(ms / 5)
{
case 1 : P1 = 0x7f;break;
case 2 : P1 = 0x3f;break;
case 3 : P1 = 0x1f;break;
case 4 : P1 = 0x8f;break;
case 5 : P1 = 0xc7;break;
case 6 : P1 = 0xe3;break;
case 7 : P1 = 0xf1;break;
case 8 : P1 = 0xf8;break;
case 9 : P1 = 0xfc;break;
case 10: P1 = 0xfe;break;
default: P1 = 0xff;
}
}
}
}
/**********************************************************************
函数功用:上电初始化函数
进口参数:无
出口参数:无
***********************************************************************/
void Power_Up(void)
{
TMOD = 0x01;/*Time0为16计数器*/
TH0=(0xffff-9259)/256;/*10ms*/
TL0=(0xffff-9259)%256;
TR0=1;//T0发动
IT0 = 1;//外部中止为边缘触发
IE=0x87;/*EA=1 ET0=1 EX0=1 EX1=1*/
P1=0xff;
P2=0xff;
}
/**********************************************************************
函数功用:键值扫描
进口参数:无
出口参数:键值
***********************************************************************/
byte keyscan(void)
{
byte i,j;
P2 |= 0x0f;
P2 &= 0xfe;//Key_1低电平
for(i=0;i<2;i++)
{
if(i)
{
P2 |= 0x0f;
P2 &= 0xfd;//Key_2低电平
}
j = P2 & 0x0c;
j >>= 1;
if(j != 6){return (i+j-1);break;}
}
return 0;
}
/**********************************************************************
函数功用:时刻调整
进口参数:无
出口参数:无
***********************************************************************/
void TiaoZ(void)
{
byte sp=1,Keyc,Keyl;
while(sp)
{
xianshi(shic);
Delay(20);
Keyc = keyscan();
while(Keyc != Keyl)
{
xianshi(shic);
Delay(20);
switch(Keyc)
{
case 3 ://显现值加1
shic++;break;
case 2 ://显现值减1
shic–;break;
case 4 ://退出调整
sp=0;
while(Keyc == keyscan());
Power_Up();
break;
}
Keyl = Keyc;
}
}
}
/**********************************************************************
函数功用:主函数
进口参数:无
出口参数:无
***********************************************************************/
void main()
{
sec=0;//初始化
ms=0;
xs_en=1;
shic=10;//初始时长10秒
Power_Up();//初始化
while(1)
{
if(EA == 0)TiaoZ();
if(ET0 == 0){P1 = ~sec;xianshi(ms);}
if(xs_en == 1)xianshi(ms);
}
}