仿真图如下:
要写的程序:
main.c
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar cp,cp1,sec,flash;
uchar seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
#include<display.c>
#include<key.c>
#include<time.c>
void timer0_isr(void) interrupt 1
{
TH0 = (65536 - 2000) / 256;
TL0 = (65536 - 2000) % 256;
cp++;
if(cp >= 250){cp1++;cp = 0;}
if(cp1 >= 2){cp1 = 0;sec--;}
if(sec <= 0)sec=11;
time();
// display();
}
void timer0_init()
{
TMOD = 0x01;
TH0 = (65536 - 2000) / 256;
TL0 = (65536 - 2000) % 256;
EA = 1;
TR0 = 1;
ET0 = 1;
}
void main()
{
timer0_init();
while(1)
{
display();
key();
}
}
display.c
sbit RED_A=P3^5;
sbit YELLOW_A=P3^6;
sbit GREEN_A=P3^7;
sbit RED_B=P1^2;
sbit YELLOW_B=P1^3;
sbit GREEN_B=P1^4;
uchar flash_count = 0;//闪硕次数
Oreration_Type = 1;
void delay(uint x)
{
uchar t;
while(x--)
{
for(t=120;t>0;t--);
}
}
void display()
{
switch(Oreration_Type)
{
case 1:
RED_A=1;YELLOW_A=0;GREEN_A=0;
RED_B=0;YELLOW_B=0;GREEN_B=1;
if(sec==3)
{
Oreration_Type = 2;
sec=3;
}
break;
case 2:
delay(500);
YELLOW_A=~YELLOW_A;
if(++flash_count !=6)
return;
flash_count=0;
Oreration_Type = 3;
break;
case 3:
RED_A=0;YELLOW_A=0;GREEN_A=1;
RED_B=1;YELLOW_B=0;GREEN_B=0;
if(sec==3)
{
Oreration_Type = 4;
sec=3;
}
break;
case 4:
delay(500);
YELLOW_B=~YELLOW_B;
if(++flash_count !=6)
return;
flash_count=0;
Oreration_Type = 1;
break;
case 5:
RED_A=0;YELLOW_A=1;GREEN_A=0;
RED_B=0;YELLOW_B=1;GREEN_B=0;
// delay(2000);
// Oreration_Type = 1;
break;
}
}
key.c
unsigned char key_i;
sbit k1=P3^1;
sbit k2=P3^2;
sbit k3=P3^3;
sbit k4=P3^4;
void key()
{
if(k1 == 0)
{
delay(100);
if(k1 == 0)
{
key_i++;
if(key_i >= 3)key_i = 0;
}
while(k1 == 0);
}
if(k2 == 0)
{
delay(100);
if(k2 == 0)
{
if(key_i == 1){sec++;if(sec >= 10)sec = 9;}
}
while(k2 == 0);
}
if(k3 == 0)
{
delay(100);
if(k3 == 0)
{
if(key_i == 2){sec--;if(sec <= 0)sec = 0;}
}
while(k3 == 0);
}
if(k4 == 0)
{
delay(100);
if(k4 == 0)Oreration_Type = 5;
while(k4 == 0);
}
}
time.c
void time ()
{
uchar i;
P0 = 0xff;
switch(i)
{
case 0:P2=0x08;P0=seven_seg[sec / 10];break;
case 1:P2=0x10;P0=seven_seg[sec % 10];break;
}i++;if(i >= 2)i = 0;
}
运行结果:
每次11秒倒计时。