本帖最后由 机电小生 于 2020-4-17 21:35 编辑
程序如下:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code zixingma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2; //黄灯
sbit P23=P2^3; //红灯
sbit P26=P2^6;
sbit P27=P2^7;
sbit key1=P3^2; //倒计时开关
sbit key2=P3^0; //1
sbit key3=P3^1; //2
sbit key4=P3^5; //复位开关
void daojishi(void);
void yihao(void);
void erhao(void);
void fuwei(void);
void key_scan(void);
uchar n,k,flag;
void delay5ms()
{
uchar i,j;
for(i=10;i>0;i--)
for(j=248;j>0;j--);
}
void delay10ms()
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void main()
{
n=60;
k=20;
P22=0;
P23=0;
P1=0xff;
TMOD=0x01; //T0用中断定时1s,方式一
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IE=0x8f;
IT0=1;
IT1=1;
flag=0;
while(1)
{
key_scan();
switch(flag)
{
case 1:daojishi();break;
case 2:yihao();break;
case 3:erhao();break;
case 4:fuwei();break;
}
}
}
void t_0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
k--;
if(k==0)
{
k=20;
n--;
if(n==0)
{
TR0=0;
P23=1;
P0=0xff;
}
}
}
void key_scan()
{
if(key1==0)
{
delay10ms();
if(key1==0)
{ flag=1;
while(key1==1)
{
delay10ms();
flag=0;
}
}
}
if(key2==0)
{
delay10ms();
if(key2==0)
{
flag=2;
while(key2==1)
{
delay10ms();
flag=0;
}
}
}
if(key3==0)
{
delay10ms();
if(key3==0)
{
flag=3;
while(key3==1)
{
delay10ms();
flag=0;
}
}
}
if(key4==0)
{
delay10ms();
if(key4==0)
{
flag=4;
while(key4==1)
{
delay10ms();
flag=0;
}
}
}
}
void daojishi()
{
TR0=1;
P0=0xff;
P20=1;
P21=0;
if(n>=10)
P0=zixingma[n/10];
delay5ms();
P0=0xff;
P20=0;
P21=1;
P0=zixingma[n%10];
delay5ms();
}
void yihao()
{
P0=0xff;
P1=0xf9;
P22=1;
}
void erhao()
{
P0=0xff;
P1=0xa4;
P22=1;
}
void fuwei()
{
TR0=0;
P2=0;
P0=0xff;
P1=0xff;
n=60;
}
|