#include <stc15.h>
#include <intrins.h>
unsigned char LED_Bit=0XFF;
unsigned char Actuator_Bit=0X00;
#define LEDx_ON(n) {LED_Bit&=_crol_(0XFE,n-1);P0=LED_Bit;P2|=0X80;P2&=0X9F;P2&=0X1F;}
#define LEDx_OFF(n) {LED_Bit|=_crol_(0X01,n-1);P0=LED_Bit;P2|=0X80;P2&=0X9F;P2&=0X1F;}
#define Buzzer_ON Actuator_Bit|=0X40;P0=Actuator_Bit;P2|=0XA0;P2&=0XBF;P2&=0X1F;
#define Buzzer_OFF Actuator_Bit&=0XBF;P0=Actuator_Bit;P2|=0XA0;P2&=0XBF;P2&=0X1F;
#define Relay_ON Actuator_Bit|=0X10;P0=Actuator_Bit;P2|=0XA0;P2&=0XBF;P2&=0X1F;
#define Relay_OFF Actuator_Bit&=0XEF;P0=Actuator_Bit;P2|=0XA0;P2&=0XBF;P2&=0X1F;
unsigned char code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
unsigned char KEY_Value=0;
unsigned char DigCom=0;
unsigned char DigBuf[8]={10,10,10,10,10,10,10,10};
unsigned char LED=1;
unsigned char LED_tt=0;
bit LED_Ref=0;
unsigned int SEG_tt=0;
bit SEG_Ref=0;
bit SEG_Run=0;
unsigned int Num=800;
void Delay_MS(unsigned int MS);
void KeyScan(void);
void ArrKeyScan(void);
void ALL_Init(void);
void Timer0Init(void);
void main(void)
{
ALL_Init();
Timer0Init();
EA=1;ET0=1;
while(1)
{
KeyScan();
if(KEY_Value==7){KEY_Value=0;SEG_Run=1;}
if(KEY_Value==6){KEY_Value=0;SEG_Run=0;}
if(KEY_Value==5){KEY_Value=0;LEDx_ON(2);LEDx_ON(5);Buzzer_ON;}
if(KEY_Value==4){KEY_Value=0;LEDx_OFF(2);Buzzer_OFF;}
if(LED_Ref==1)
{
LED_Ref=0;
LEDx_ON(LED);LEDx_OFF(LED-1);
if(++LED==9)LED=1;
}
if(SEG_Ref==1)
{
SEG_Ref=0;
Num=Num-1;
}
if(SEG_Run==1)
{
DigBuf[3]=11;DigBuf[4]=11;DigBuf[5]=11;DigBuf[6]=11;DigBuf[7]=11;
DigBuf[0]=Num/100;DigBuf[1]=Num%100/10;DigBuf[2]=Num%10;
}
}
}
void Timer0(void) interrupt 1
{
P0=0X00;
P2|=0XC0;
P2&=0XDF;
P2&=0X1F;
P0=tab[DigBuf[DigCom]];
P2|=0XE0;
P2&=0XFF;
P2&=0X1F;
P0=(0X01<<DigCom);
P2|=0XC0;
P2&=0XDF;
P2&=0X1F;
if(++DigCom==8)DigCom=0;
if(++LED_tt==999){LED_tt=0;LED_Ref=1;}
if(++SEG_tt==1000){SEG_tt=0;SEG_Ref=1;}
}
void Timer0Init(void)
{
AUXR|=0X80;
TMOD&=0XF0;
TL0=0XCD;
TH0=0XD4;
TF0=0;
TR0=1;
}
void KeyScan(void)
{
if(P30==0)
{
Delay_MS(10);
if(P30==0)KEY_Value=7;
while(!P30);
}
else if(P31==0)
{
Delay_MS(10);
if(P31==0)KEY_Value=6;
while(!P31);
}
else if(P32==0)
{
Delay_MS(10);
if(P32==0)KEY_Value=5;
while(!P32);
}
else if(P33==0)
{
Delay_MS(10);
if(P33==0)KEY_Value=4;
while(!P33);
}
}
void ALL_Init(void)
{
P0=0X00;
P2|=0XA0;
P2&=0XBF;
P2&=0X1F;
P0=0XFF;
P2|=0X80;
P2&=0X9F;
P2&=0X1F;
P0=0X00;
P2|=0XC0;
P2&=0XDF;
P2&=0X1F;
}
void Delay_MS(unsigned int MS)
{
unsigned int i,j;
for(i=0;i<MS;i++);
for(j=845;j>0;j--);
}
void ArrKeyScan(void)
{
unsigned char temp;
P44=0;P42=1;P3=0X7F;
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
Delay_MS(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0X7E:KEY_Value=1;break;
case 0X7D:KEY_Value=2;break;
case 0X7B:KEY_Value=2;break;
case 0X77:KEY_Value=4;break;
default:break;
}
while(temp!=0X0F)
{
temp=P3;
temp=temp&0X0F;
}
}
}
P44=1;P42=0;P3=0XBF;
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
Delay_MS(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0XBE:KEY_Value=5;break;
case 0XBD:KEY_Value=6;break;
case 0XBB:KEY_Value=7;break;
case 0XB7:KEY_Value=8;break;
default:break;
}
while(temp!=0X0F)
{
temp=P3;
temp=temp&0X0F;
}
}
}
P44=1;P42=1;P3=0XDF;
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
Delay_MS(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0XDE:KEY_Value=9;break;
case 0XDD:KEY_Value=10;break;
case 0XDB:KEY_Value=11;break;
case 0XD7:KEY_Value=5;break;
default:break;
}
while(temp!=0X0F)
{
temp=P3;
temp=temp&0X0F;
}
}
}
P44=1;P42=1;P3=0XEF;
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0XEE:KEY_Value=1;break;
case 0XED:KEY_Value=2;break;
case 0XEB:KEY_Value=3;break;
case 0XE7:KEY_Value=4;break;
}
while(temp!=0X0F)
{
temp=P3;
temp=temp&0X0F;
}
}
}
}