本人新手,发一个小改的秒表,赚点人气,也请多多指点
#include<reg51.h>
sbit Key1 = P1^0;
sbit Key2 = P1^1;
sbit Key3 = P1^2;
sbit Key4 = P1^3;
bit StopwatchRuning = 0;
bit StopwatchRefresh = 1;
unsigned char code LedChar[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[8] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF
};
unsigned char KeySta[4] = {1, 1, 1, 1};
unsigned char ms = 0;
unsigned char sec = 0;
unsigned char minu = 0;
unsigned char hour = 0;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
void ConfigTimer0(unsigned char ms);
void StopwatchDisplay();
void KeyDriver();
void main()
{
EA = 1;
P1 = 0xEF;
ConfigTimer0(2);
while(1)
{
if(StopwatchRefresh)
{
StopwatchRefresh = 0;
StopwatchDisplay();
}
KeyDriver();
}
}
void ConfigTimer0(unsigned char ms)
{
unsigned long tmp;
tmp = 11059200 / 12;
tmp = (tmp * ms) / 1000;
tmp = 65536 - tmp;
tmp = tmp + 18;
T0RH = (unsigned char)(tmp>>8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1;
TR0 = 1;
}
void StopwatchDisplay()
{
signed char i;
unsigned char buf[6];
LedBuff[0] = LedChar[ms%10];
LedBuff[1] = LedChar[ms/10];
buf[0] = sec%10;
buf[1] = sec/10;
buf[2] = minu%10;
buf[3] = minu/10;
buf[4] = hour%10;
buf[5] = hour/10;
for(i=5; i>=1; i--)
{
if(buf[i] == 0)
LedBuff[i+2] = 0xFF;
else
break;
}
for( ; i>=0; i--)
LedBuff[i+2] = LedChar[buf[i]];
LedBuff[2] &= 0x7F;
if((buf[2] != 0) || (buf[3] != 0 ) || (buf[4] != 0) || (buf[5] != 0))
LedBuff[4] &= 0x7F;
if((buf[4] != 0) || (buf[5] != 0))
LedBuff[6] &= 0x7F;
}
void StopwatchAction()
{
if(StopwatchRuning)
StopwatchRuning = 0;
else
StopwatchRuning = 1;
}
void StopwatchReset()
{
StopwatchRuning = 0;
ms = 0;
sec = 0;
minu = 0;
hour = 0;
StopwatchRefresh = 1;
}
void KeyDriver()
{
unsigned char i;
static unsigned char backup[4] = {1, 1, 1, 1};
for(i=0; i<4; i++)
{
if(KeySta[i] != backup[i])
{
if(backup[i] == 0)
{
if(i == 1)
StopwatchReset();
else if(i == 2)
StopwatchAction();
}
backup[i] = KeySta[i];
}
}
}
void KeyScan()
{
static unsigned char keybuf[4];
unsigned char i;
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)
KeySta[i] = 0;
else if(keybuf[i] == 0xFF)
KeySta[i] = 1;
}
}
void LedScan()
{
static unsigned char i = 0;
P0 = 0xFF;
switch(i)
{
case 0: P2 = 0xFE; i++; P0 = LedBuff[0]; break;
case 1: P2 = 0xFD; i++; P0 = LedBuff[1]; break;
case 2: P2 = 0xFB; i++; P0 = LedBuff[2]; break;
case 3: P2 = 0xF7; i++; P0 = LedBuff[3]; break;
case 4: P2 = 0xEF; i++; P0 = LedBuff[4]; break;
case 5: P2 = 0xDF; i++; P0 = LedBuff[5]; break;
case 6: P2 = 0xBF; i++; P0 = LedBuff[6]; break;
case 7: P2 = 0x7F; i=0; P0 = LedBuff[7]; break;
default: break;
}
}
void StopwatchCount()
{
if(StopwatchRuning)
{
ms++;
if(ms >= 100)
{
ms = 0;
sec++;
if(sec >= 60)
{
sec = 0;
minu++;
if(minu >=60)
{
minu = 0;
hour++;
if(hour >= 100)
hour = 0;
}
}
}
StopwatchRefresh = 1;
}
}
void int0() interrupt 1
{
static unsigned char tmr10ms = 0;
TH0 = T0RH;
TL0 = T0RL;
LedScan();
KeyScan();
tmr10ms++;
if(tmr10ms >= 5)
{
tmr10ms = 0;
StopwatchCount();
}
}
|