51单片机实验2
题目: 编写一个程序实现按下k4按键,让第四位数码管从F到0的13秒倒计时,按下k1使倒计时暂停其中需要使用定时器1,倒计时结束后一直显示0
思路: 既然是需要使用按键和定时器的,那么可以编写一个按键函数其中k4让定时器1的初始化开始,k1用来暂停定时器,显示数码管的任务就可以用定时器1的服务函数来编写,具体看下面的示例
#include <reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit k1 = P3^1;
sbit k4 = P3^3;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
void keypros();
void Time1Iinit();
void delay(u16);
u8 code smgduan[] = {0x71,0x79,0x5e,0x39,
0x7c,0x77,0x6f,0x7f,
0x07,0x7d,0x6d,0x66,
0x4f,0x5b,0x06,0x3f
};
void main()
{
LSA = 1;
LSB = 0;
LSC = 1;
P0 = 0x71;
while(1)
{
keypros();
}
}
void keypros()
{
if(k4 == 0)
{
delay(1000);
if(k4 == 0)
{
Time1Init();
}
while(!k4);
}
if(k1 == 0)
{
delay(1000);
if(k1 == 0)
{
TR1 = 0;
}
while(!k1);
}
}
void delay(u16 i)
{
while(i--);
}
void Time1Init()
{
TMOD |= 0x01;
TH1 = 0xfc;
TL1 = 0x18;
EA = 1;
ET1 = 1;
TR1 = 1;
}
void Time1Start() interrupt 3
{
u16 count = 0;
u8 i = 0;
TH1 = 0xfc;
TL1 = 0x18;
count ++;
if(count == 1000)
{
count = 0;
if(i == 15 )
{
i = 14;
}
P0 = smgduan[i];
i++;
}
}