对@Dream_begin_学长提供的解答的代码优化。
直接上代码。详情请看@Dream_begin_学长的文章矩阵按键控制动态数码管矩阵按键控制动态数码管
#include <REGX52.H>
#include "MatrixKey.h"
#include "Key.h"
#include "Timer0.h"
#include "Buzzer.h"
#include "Delay.h"
#include "Nixie.h"
sbit Buzzer = P2^5;
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
unsigned char KeyNum,flag1,flag2=1,PassWord,Num,Count;
//flag1 为0 开始计时 为1停止计时
void main()
{
Timer0Init();
TR0=0;
/*
初始化状态未开始计时,如果没有这行代码,那么当 Nnm=0时,计时器直接开始计时,Num会溢出为255,
使得每次启动单片机时都会自动从255开始计时。为了避免这种情况我们一开始就令TR0=0,使计时器先不工作。
在之后按下K1才工作。
*/
while(1)
{
//***********k1控制记时开始结束**********
if(K1==0)
{
Delay(20);while(K1==0);Delay(20);
if(flag1==0)
{
TR0=1;
flag1=1;
}
else
{
TR0=0;
}
}
//***********k2控制蜂鸣器停止鸣叫**********
while(flag2==0&Num==0)//证明 倒计时结束 并且蜂鸣器已经响了
{
Buzzer_Time(100);
if(K2==0)
{
Delay(20);while(K2==0);Delay(20);//消抖
flag2=1;
}
}
//***********k3清零**********
if(K3==0)
{
PassWord=0;
Num=0;
TR0=0;
Count=0;
}
KeyNum = MatrixKey();
if(KeyNum)
{
if(Count<4)
{
PassWord*=10;
PassWord+=KeyNum%10;
Num=PassWord;
Count++;
}
}
Nixie(5,Num/1000);
Nixie(6,Num/100%10);
Nixie(7,Num/10%10);
Nixie(8,Num%10);
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count++;
if(T0Count>=1000)
{
T0Count=0;
Num--;
if(Num==0)
{
Buzzer_Time(500);
TR0=0;
Num=0;
flag2=0;
}
}
}