|
使用 独立按键 数码管 定时器 ;
源代码如下:
#include "reg52.h"
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
#define plusvalue 30 //每次按键增加多少秒,可调
#define delays 6200
unsigned int times=0;
int seconds=0,seconds_1=0;
unsigned int sec=0;
unsigned int flag=0;
unsigned int wei[8]={0};
unsigned int i;
unsigned char code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};
/*0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d
0 1 2 3 4 5
0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c
6 7 8 9 A B
0x39 , 0x5e , 0x79 , 0x71 , 0x00
C D E F NULL
*/
void Timer0Init(void) //10毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 0; //定时器0开始计时
ET0=1;
EA=0;
}
void delay() //@11.0592MHz
{
unsigned char i, j;
i = 18;
j = 235;
do
{
while (--j);
} while (--i);
}
void delay1( int a)
{
while(a--);
}
void display()
{
LSA=0;LSB=0;LSC=0;P0=smgduan[wei[0]];delay1(10);P0=0x00;
LSA=1;LSB=0;LSC=0;P0=smgduan[wei[1]];delay1(10);P0=0x00;
LSA=0;LSB=1;LSC=0;P0=smgduan[wei[2]];delay1(10);P0=0x00;
LSA=1;LSB=1;LSC=0;P0=smgduan[wei[3]];delay1(10);P0=0x00;
LSA=0;LSB=0;LSC=1;P0=smgduan[wei[4]];delay1(10);P0=0x00;
LSA=1;LSB=0;LSC=1;P0=smgduan[wei[5]];delay1(10);P0=0x00;
LSA=0;LSB=1;LSC=1;P0=smgduan[wei[6]];delay1(10);P0=0x00;
LSA=1;LSB=1;LSC=1;P0=smgduan[wei[7]];delay1(10);P0=0x00;
wei[7]=seconds_1/60/10;
wei[6]=seconds_1/60%10;
wei[5]=16;
wei[4]=seconds_1%60/10;
wei[3]=seconds_1%60%10;
wei[2]=17;
wei[1]=17;
wei[0]=17;
}
void caculate()
{
seconds=plusvalue*times;
seconds_1=seconds;
}
void start()
{
if(seconds!=0)
{
TR0=1;
EA=1;
}
else
{
TR0=0;
EA=0;
}
}
void stop()
{
TR0=0;
EA=0;
flag++;
if(flag%2==0)
{
TR0=1;
EA=1;
flag=0;
}
}
void plus()
{
times=times+1;
}
void cut()
{
times=times-1;
}
void keyscan()
{
if(k1==0)
{
delay1(delays);
if(k1==0)
start();
caculate();
}
else if(k2==0)
{
delay1(delays);
if(k2==0)
stop();
}
else if(k3==0)
{
delay1(delays);
if(k3==0)
plus();
caculate();
}
else if(k4==0)
{
delay1(delays);
if(k4==0)
cut();
caculate();
}
}
void main()
{
Timer0Init();
while(1)
{
keyscan();
display();
if(seconds_1<0)
{
EA=0;
for(i=0;i<8;i++)
wei[ i]=17;
}
}
}
void Timer0_Routine() interrupt 1 //10ms溢出一次
{
unsigned int T0Count;
TL0 = 0x00; //设置定时初值
TH0 = 0xDC;
T0Count++;
if(T0Count==100)
{
T0Count=0;
seconds_1--;
}
} |
|