/*6M晶振--内部RC*/
#include <STC12C5A60S2.H>
#define uint unsigned int
#define uchar unsigned char
sbit led1=P3^0;
sbit led2=P3^1;
sbit key=P3^2;
sbit reset=P3^3;
sbit speak=P3^4;
sbit led=P3^5;
uchar num,t,flag,kt;
uint second;
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};//0-9
uchar code distab[]={00,01,02,10,11,12,20,21,22,30,31,32,40,41,42};//display number
void display(); //显示
void presskey(); //按键
void delay(uchar c) ; //延迟1ms
void delayus(); //延迟50us
void InitTimer0(void); //初始化
void dd(); //嘀
void main()
{
P3M0 = 0x13;
P3M1 = 0x00;
AUXR = AUXR|0x80; // T0, 1T Mode
InitTimer0();
while(1)
{
display();
presskey();
}
}
void presskey()
{
if(flag==0) //按键保护
{
if(key==0)
{
delay(10);
if(key==0)
{
flag=1;
kt=0;
second=0;
num++;
dd();
if(num==15)
num=0;
}
}
}
if(reset==0)
{
delay(20);
if(reset==0)
{
num=0;
dd();dd();dd();dd();dd();dd();
second=0;
while(reset==0);
}
}
}
void display()
{
led2=0;
led1=0;
P1=table[distab[num]/10];
led1=1;
delay(5);
led1=0;
P1=table[distab[num]%10];
led2=1;
delay(5);
led2=0;
}
void delay(uchar c) //误差 0us 1ms
{
unsigned char a,b,d;
for(d=c;d>0;d--)
for(b=111;b>0;b--)
for(a=12;a>0;a--);
}
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x8A;
TL0 = 0x0D0;
EA = 1;
ET0 = 1;
TR0 = 1;
EX0=0;//先关闭外部中断
EX1=0;//先关闭外部中断
IT0= 1;
IT1= 1;
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x8A;
TL0 = 0x0D0;
if(flag==1) //按键等待
{
if(key==1)
{
kt++;
if(kt==30)
{
kt=0;
flag=0;
}
}
}
t++;
if(t==20)
{
t=0;
second++;
if(second==180) // 180是18S
{
led=!led;
second=0;
led1=led2=0;
EX0=1;//激活外部唤醒
EX1=1;//激活外部唤醒
PCON=0x02; //进入掉电模式
}
}
}
void delayus(void)
{
unsigned char a,b;
for(b=21;b>0;b--)
for(a=50;a>0;a--);
}
void dd()
{
uint y;
for(y=40;y>0;y--)
{
speak=!speak;
delayus();//工作延迟
}
speak=1;
}
void ex_int0() interrupt 0
{
PCON=0;
EX0=0;//关闭外部中断
EX1=0;//关闭外部中断
}
void ex_int1() interrupt 2
{
PCON=0;
EX0=0;//关闭外部中断
EX1=0;//关闭外部中断
}
评论0