关于对定时器,按键,LED,数码管的一体化应用,进阶提升能力
//999定时器倒计时LED闪烁,s4 正计时
#include <STC15F2K60S2.H>
#define uchar unsigned char;
uchar code a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar num;
uchar yi,er,san,si,time;
uchar mode;
bit s4,s5,s6,s7;
void Delayms(int ms);
void Time0Init(void);
void Keyscan(void);
void Display1(void);
void Display2(void);
void LED(void);
void main(void)
{
P2=0xA0;P0=0x00;P2=0x80;P0=0xFF;
P2=0xC0;P0=0x03;P2=0xFF;P0=0xFF;
Time0Init();
EA=1;
ET0=1;
while(1)
{
Keyscan();
LED();
if(s4==1)
{
mode=1;
num=0;
s4=0;
}
}
}
void Time0Init(void)
{
AUXR |=0x80;//定时器时钟模式//AUXR=AUXR|0x80;0010 1010 |1000 0000=
TMOD &=0xF0;//设置定时器模式
TH0=0x28;//设置初始值
TL0=0x00;//设置初始值
TF0=0;//清楚TF0标志
TR0=1;//开始计时
}
void time0() interrupt 1
{
if(mode!=1){
TH0=0x28;
TL0=0x00;
time++;
if(time==200)
{
time=0;
if(num==0)
{
num=1000;
}
num--;
}
yi=num/100%10;
er=num/10%10;
san=num%10;
Display1();
Display2();
}
else if(mode==1)
{
TH0=0x28;
TL0=0x00;
time++;
if(time==200)
{
time=0;
if(num==1000)
{
num=0;
}
num++;
}
yi=num/100%10;
er=num/10%10;
san=num%10;
Display1();
Display2();
}
}
void Delayms(int ms)
{
int i,j;
for(i=0;i<ms;i++)
for(j=845;j>0;j--);
}
void Display1(void)
{
P2=0xc0;//打开控制数码管位选的573
P0=0x01;//选中所有数码管
P2=0xE0;//打开控制数码管段选的573
P0=a[yi];//
Delayms(1);
P2=0xc0;//打开控制数码管位选的573
P0=0x02;//选中所有数码管
P2=0xE0;//打开控制数码管段选的573
P0=a[er];//
Delayms(1);
}
void Display2(void)
{
P2=0xc0;//打开控制数码管位选的573
P0=0x04;//选中所有数码管
P2=0xE0;//打开控制数码管段选的573
P0=a[san];//
Delayms(1);
P2=0xc0;//打开控制数码管位选的573
P0=0x08;//选中所有数码管
P2=0xE0;//打开控制数码管段选的573
P0=a[si];//
Delayms(1);
}
void Keyscan(void)//独立按键
{
if(P30==0)
{
Delayms(1);
if(P30==0)
{
s7=1;
}
while(!P30);//松手检测
}
else if(P31==0)
{
Delayms(1);
if(P31==0)
{
s6=1;
}
while(!P31);//松手检测
}
else if(P32==0)
{
Delayms(1);
if(P32==0)
{
s5=1;
}
while(!P32);//松手检测
}
else if(P33==0)
{
Delayms(1);
if(P33==0)
{
s4=1;
}
while(!P33);//松手检测
}
}
void LED(void)
{
if(num%2==0)
{
P2=0x80;//打开控制LED的573
P0=0xfe;//关闭所有LED
}
else {
P2=0x80;//打开控制LED的573
P0=0xff;//关闭所有LED
}
}