#include <reg52.h>
unsigned char ledbuf[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char ledchar[] = { 0xfc,0xc,0xda,0xf2,0x66,0xb6,0xbe,0xe0,
0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e };
unsigned char key_sta[] = {1,1,1,1};
sbit key1 = P2^4;
sbit key2 = P2^5;
sbit key3 = P2^6;
sbit key4 = P2^7;
bit watch_running = 0;
void ledscan();
void init_interrupt0(unsigned int ms);
void keydriver();
void keyscan();
void count_time();
void watch_show();
void watch_close();
void watch_reset();
unsigned char t0_high = 0;
unsigned char t0_low = 0;
unsigned char decimal = 0;
unsigned int integer = 0;
int main()
{
EA = 1;
init_interrupt0(2);
P2 = 0xfe;
while(1)
{
watch_show();
keydriver();
}
return 0;
}
void init_interrupt0(unsigned int ms)
{
unsigned long tmp;
tmp = 11059200 / 12;
tmp = (ms * tmp) / 1000;
tmp = 65536 - tmp;
t0_high = (unsigned char)(tmp>>8);
t0_low = (unsigned char)tmp;
TMOD &= 0xf0;
TMOD |= 0x01;
TH0 = t0_high;
TL0 = t0_low;
TR0 = 1;
ET0 = 1;
}
void watch_show()
{
unsigned char buf[4];
signed char i = 0;
ledbuf[5] = ledchar[decimal % 10];
ledbuf[4] = ledchar[decimal / 10];
buf[0] = integer % 10;
buf[1] = (integer / 10) % 10;
buf[2] = (integer / 100) %10;
buf[3] = (integer / 1000) % 10;
for(i = 3;i >= 1;i--)
{
if(buf[i] == 0)
{
ledbuf[3 - i] = 0x00;
}
else
{
break;
}
}
for(;i >= 0;i--)
{
ledbuf[3 - i] = ledchar[buf[i]];
}
ledbuf[3] |= 0x01;
}
void watch_close()
{
decimal = 0;
integer = 0;
watch_running = 0;
}
void watch_reset()
{
if( watch_running == 1)
{
watch_running = 0;
}
else if( watch_running == 0)
{
watch_running = 1;
}
}
void keydriver()
{
static unsigned char backup[] = {1,1,1,1};
unsigned char i = 0;
for(i = 0; i < 4;i++)
{
if(backup[i] != key_sta[i])
{
if(backup[i] == 0)
{
if(i == 0)
{
watch_close();
}
else if(i == 1)
{
watch_reset();
}
}
backup[i] = key_sta[i];
}
}
}
void ledscan()
{
static unsigned char i = 0;
P0 = 0x00;
P1 = (P1 & 0xf8) | i;
P0 = ledbuf[i];
if(i < 5)
{
i++;
}
else
{
i = 0;
}
}
void keyscan()
{
static unsigned char keybuf[] = {0xff,0xff,0xff,0xff};
unsigned char i = 0;
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[i] == 0x00)
{
key_sta[i] = 0;
}
else if(keybuf[i] == 0xff)
{
key_sta[i] = 1;
}
}
}
void count_time()
{
if(watch_running)
{
decimal++;
if(decimal >= 100)
{
decimal = 0;
integer++;
if(integer >= 10000)
{
integer = 0;
}
}
}
}
void interrupt0() interrupt 1
{
static unsigned char ms10 = 0;
TH0 = t0_high;
TL0 = t0_low;
ledscan();
keyscan();
ms10++;
if(ms10 >= 5)
{
count_time();
ms10 = 0;
}
} |