3 位共阳管显示的定时器。3个按键K1、K2和K3 。K1为设定键,K2和K3分别是加、减键。K1按下第1次,第1位闪烁,调整(由K2、K3作加、减调整。以下同);按下第2次,第2 位闪烁,调整;按下第3 次,第3 位闪烁,调整;按第4 次开始倒计时。
//E:\DPJ_C\OTHER\1\定时器\定时器.c
//2012 05 16
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit K1=P3^1;
sbit K2=P3^2;
sbit K3=P3^3;
uchar temp,ge,bai,shi,time,time1;
uint num;
bit flag,flag1,flag2;
uchar code tab[]={
0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
};
void delay(uint ms)
{
uchar i;
while(ms--)
for(i=0;i<123;i++);
}
void t0init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display()
{
dula=1;
P0=tab[ge];
dula=0;
wela=1;
if(temp==1)
{
P0=0x04;
if(flag)
{
P0=0x00;
}
}
else
P0=0x04;
wela=0;
delay(2);
P0=0xff;
dula=1;
P0=tab[shi];
dula=0;
wela=1;
if(temp==2)
{
P0=0x08;
if(flag)
{
P0=0x00;
}
}
else
P0=0x08;
wela=0;
delay(2);
P0=0xff;
dula=1;
P0=tab[bai];
dula=0;
wela=1;
if(temp==3)
{
P0=0x10;
if(flag)
{
P0=0x00;
}
}
else
P0=0x10;
wela=0;
delay(2);
P0=0xff;
}
void keyscan()
{
while(!K1)
{
display( );
if(K1)
{
temp++;
if(temp==4)
{
temp=0;
time=0;
time1=0;
flag2=0;
flag1=1;//开始倒计时
}
}
}
while(!K2)
{
display( );
if(K2)
{
if(temp==1)
{
ge++;
if(ge==10)
ge=0;
}
if(temp==2)
{
shi++;
if(shi==10)
shi=0;
}
if(temp==3)
{
bai++;
if(bai==10)
bai=0;
}
}
}
while(!K3)
{
display( );
if(K3)
{
if(temp==1&&ge>=1)
ge--;
if(temp==2&&shi>=1)
shi--;
if(temp==3&&bai>=1)
bai--;
}
}
}
void main()
{
t0init();
while(1)
{
display();
keyscan();
if(flag1&&flag2) //flag1 K1按第4次标志 flag2 1S标志
{
flag2=0;
num=ge+shi*10+bai*100;
if(num!=0)
num--;
if(num==0)
{
flag1=0;
time=0;
}
bai=num/100;
shi=num%100/10;
ge=num%10;
}
}
}
void t0int() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if(time==10)
{
time=0;
flag=!flag;
time1++;
if(time1==2)
{
time1=0;
flag2=1;
}
}
}
|