#include<reg52.h>
sbit ENLED = P1^1;
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit KEY1 = P2^7;
sbit KEY2 = P2^6;
sbit KEY3 = P2^5;
sbit KEY4 = P2^4;
unsigned char T0RL = 0;
unsigned char T0RH = 0;
unsigned char T1RL = 0;
unsigned char T1RH = 0;
bit a = 0;
unsigned char speed [4] = { 1, 5, 8 , 20 };
unsigned char keysta[4] = {1,1,1,1};
void timerdesigner(unsigned int ms);
void lookkey();
void keydriver();
void main()
{
ENLED = 0;
EA = 1;
ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 1;
P2 = 0xFE;
lookkey();
while(1)
{
keydriver();
}
}
void keydriver()
{
unsigned char i = 0;
static char backup [4] = {1,1,1,1};
for(i=0;i<4;i++)
{
if(backup !=keysta )
{
if(backup == 0 )
{
switch(i)
{
case 0: timerdesigner(speed[0]);break;
case 1: timerdesigner(speed[1]);break;
case 2: timerdesigner(speed[2]);break;
case 3: timerdesigner(speed[3]);break;
default:break;
}
}
backup = keysta;
}
}
}
void lookkey()
{
unsigned long tmp1 = 0;
tmp1 = 32768000/12;
tmp1 = (tmp1*2)/1000;
tmp1 = 65536 - tmp1;
T1RH = (unsigned char )(tmp1>>8);
T1RL = (unsigned char)tmp1;
TMOD &= 0x0F;
TMOD |= 0X10;
TH1 = T1RH;
TL1 = T1RL;
TR1 = 1;
ET1 = 1;
}
void timerdesigner(unsigned int ms)
{
unsigned long tmp;
tmp = 32768000/12;
tmp = (tmp*ms)/1000;
tmp = 65536 - tmp;
T0RH = (unsigned char)(tmp>>8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
TR0 = 1;
ET0 = 1;
}
void InterruptTimer0() interrupt 1
{
static unsigned int i = 0;
static unsigned int cnt1 = 0;
TH0 = T0RH;
TL0 = T0RL;
cnt1++;
if(cnt1>=50)
{
cnt1 = 0;
if(a == 0)
{
i++;
P0 = 0xFF;
P0 = P0>>i;
if(i == 8)
{
i = 0;
a = 1;
}
}
else
{
i++;
P0 = 0xFF;
P0 = P0<<i;
if(i == 8)
{
i = 0;
a = 0;
}
}
}
}
void InterruptTimer1() interrupt 3
{
unsigned char i = 0;
static unsigned char keybuf[4] = {
0xFF,0xFF,0xFF,0xFF};
TH1 = T1RH;
TL1 = T1RL;
keybuf[0] = (keybuf[0]<<1) | KEY1;
keybuf[1] = (keybuf[1]<<1) | KEY2;
keybuf[2] = (keybuf[2]<<1) | KEY3;
keybuf[3] = (keybuf[3]<<1) | KEY4;
for(i=0;i<4;i++)
{
if(keybuf == 0x00)
{
keysta = 0;
}
else if(keybuf == 0xFF)
{
keysta = 1;
}
}
}