MSC-51中断综合应用
源程序如下:
#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;
}
/**********************************************************************
函数功能:时间调整
入口参数:无
出口参数:无
*********************************
MSC-51中 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)