MSC-51中斷綜合應(yīng)用
源程序如下:
本文引用地址:http://www.ex-cimer.com/article/201611/316242.htm#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;/*定義時(shí)間變量*/
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;//數(shù)碼管1
sbit P2_7 = P2^7;//數(shù)碼管2
/**********************************************************************
函數(shù)功能:延時(shí)程序
入口參數(shù):延遲時(shí)間
出口參數(shù):無
***********************************************************************/
void Delay(byte time)
{
byte i;
for(;time > 0;time--)
for(i=10;i > 0;i--);
}
/*LED數(shù)碼管顯示程序****************************************************
入口函數(shù):要顯示的值
出口函數(shù):無
**********************************************************************/
void xianshi(byte xs)//輸入要顯示的值
{
byte code Seg[10]={0x28,0xf9,0x4c,0x58,0x99,0x1a,0x0a,0xf8,0x08,0x18};
P0=0xff;//顯示個(gè)位
P2_7=1;
P2_6=0;
P0=Seg[xs%10];
Delay(10);//延時(shí)程序
P0=0xff;//顯示十位
P2_6=1;
P2_7=0;
P0=Seg[xs/10];
Delay(10);//延時(shí)程序
}
/**********************************************************************
函數(shù)功能:掃描鍵盤
函數(shù)入口:無
函數(shù)出口:有/無鍵按下1/0
**********************************************************************/
byte keyfun(void)
{
byte P2copy;
P2 &= 0xfc;
P2copy = P2;
if((P2copy & 0x04) && (P2copy & 0x08))return 0;
else
{
EA = 0;
return 1;
}
}
/**********************************************************************
函數(shù)功能:外部中斷服務(wù)程序
入口參數(shù):無
出口參數(shù):無
***********************************************************************/
void STOP1() interrupt 2/*當(dāng)ITN0中斷時(shí)執(zhí)行此函數(shù)*/
{
ET0 = 1;
xs_en = 1;
}
/**********************************************************************
函數(shù)功能:外部中斷服務(wù)程序
入口參數(shù):無
出口參數(shù):無
***********************************************************************/
void STOP0() interrupt 0/*當(dāng)ITN0中斷時(shí)執(zhí)行此函數(shù)*/
{
if(xs_en)
{
xs_en = 0;
ms = 0;
sec = 0;
}
else
{
ET0 = 0;
}
}
/**********************************************************************
函數(shù)功能:定時(shí)器中斷函數(shù)(掃描鍵盤)(10ms 16位定時(shí))
入口參數(shù):無
出口參數(shù):無
***********************************************************************/
void Time0_Func() interrupt 1/*當(dāng)定時(shí)器中斷時(shí)執(zhí)行此函數(shù)*/
{
TH0=(0xffff-9259)/256;/*10ms*/
TL0=(0xffff-9259)%256;
ms++;
if(keyfun())//當(dāng)有鍵時(shí),P2低四位置1,定時(shí)器中斷禁止
{
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;
}
}
}
}
/**********************************************************************
函數(shù)功能:上電初始化函數(shù)
入口參數(shù):無
出口參數(shù):無
***********************************************************************/
void Power_Up(void)
{
TMOD = 0x01;/*Time0為16計(jì)數(shù)器*/
TH0=(0xffff-9259)/256;/*10ms*/
TL0=(0xffff-9259)%256;
TR0=1;//T0啟動(dòng)
IT0 = 1;//外部中斷為邊沿觸發(fā)
IE=0x87;/*EA=1 ET0=1 EX0=1 EX1=1*/
P1=0xff;
P2=0xff;
}
/**********************************************************************
函數(shù)功能:鍵值掃描
入口參數(shù):無
出口參數(shù):鍵值
***********************************************************************/
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;
}
/**********************************************************************
函數(shù)功能:時(shí)間調(diào)整
入口參數(shù):無
出口參數(shù):無
***********************************************************************/
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 ://退出調(diào)整
sp=0;
while(Keyc == keyscan());
Power_Up();
break;
}
Keyl = Keyc;
}
}
}
/**********************************************************************
函數(shù)功能:主函數(shù)
入口參數(shù):無
出口參數(shù):無
***********************************************************************/
void main()
{
sec=0;//初始化
ms=0;
xs_en=1;
shic=10;//初始時(shí)長10秒
Power_Up();//初始化
while(1)
{
if(EA == 0)TiaoZ();
if(ET0 == 0){P1 = ~sec;xianshi(ms);}
if(xs_en == 1)xianshi(ms);
}
}
評(píng)論