功能是数码管前两位用来计数倒计时的次数的,最后四位用来做倒计时的时钟,当我按K1按键的时候开始倒计时,计数加1,倒计时结束后再次按启动增加计数获取时间继续倒计时,当我长按K2按键的时候次数,分钟,秒钟,对应的数码管能够闪烁显示,其他数码管正常显示,K4和K8两个按键在k2按键按下之后用来对其闪烁的次数,分钟,秒钟加减。现在的情况是我k4和k8按键按下后并不增减闪烁的数值,然后另一个问题是启动的时候计数显示的不对一直都是显示8.
求助大佬
下面是单片机代码
#include "reg52.h"
sbit k1=P3^0;
sbit k2=P3^1;
sbit k4=P3^3;
sbit k8=P3^7;
bit flash;
unsigned int j=0;
unsigned int num=0;
unsigned int l=0;
unsigned int flag=0;
unsigned int cishu=1;
unsigned ssec=0,sec=5,min=0;
unsigned DisplayData[8];
unsigned code dongtai[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(unsigned int i)
{
while(i--);
}
void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0Xd8; //给定时器赋初值,定时10ms
TL0=0Xf0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
void aaa()
{
if(l==0)
{
DisplayData[4]=dongtai[min/10];
DisplayData[5]=dongtai[min%10]+0x80;
DisplayData[6]=dongtai[sec/10];
DisplayData[7]=dongtai[sec%10];
DisplayData[0]=dongtai[cishu];
DisplayData[1]=0x80;
DisplayData[2]=0x80;
DisplayData[3]=0x80;
}
else
{
if(l==1&&flash==1)
{
DisplayData[4]=0;
DisplayData[5]=0;
}
else
{
DisplayData[4]=dongtai[min/10];
DisplayData[5]=dongtai[min%10]+0x80;
}
if(l==2&&flash==1)
{
DisplayData[6]=0;
DisplayData[7]=0;
}
else
{
DisplayData[6]=dongtai[sec/10];
DisplayData[7]=dongtai[sec%10];
}
if(l==3&&flash==1)
{
DisplayData[0]=0;
DisplayData[1]=0;
}
else
{
DisplayData[0]=dongtai[cishu];
DisplayData[1]=0x80;
}
if(l==4)
{
DisplayData[4]=dongtai[min/10];
DisplayData[5]=dongtai[min%10]+0x80;
DisplayData[6]=dongtai[sec/10];
DisplayData[7]=dongtai[sec%10];
DisplayData[0]=dongtai[cishu];
DisplayData[1]=0x80;
DisplayData[2]=0x80;
DisplayData[3]=0x80;
}
}
if(min==0&&sec==0)
{
DisplayData[4]= 0x3f;
DisplayData[5]= 0x3f+0x80;
DisplayData[6]= 0x3f;
DisplayData[7]= 0x3f;
}
}
void abc()
{
static unsigned char t=0;
P0=0x00;
P2&=0xe3;
P2|=(t<<2);
P0=DisplayData[t];
t=++t%8;
}
void main()
{
Timer0Init();
while(1)
{
if(!k1)
{
delay(1000);
if(!k1 && flag==0)
while(!k1)
{
flag=1;
l=0;
min=0;
sec=5;
cishu=++cishu; //这有问题
}
}
if(k2!=0xFF)
{
delay(30000);
if(k2!=0xFF)
{
while(!k2);
flag=0;
l++;
if(!k4&&l>0)
{
switch(l)
{
case 1: if(min<99)min++; break;
case 2: if(sec<59)sec++; break; 这儿有问题
case 3: if(cishu<9)cishu++; break;
}
}
if(!k8&&l>0)
{
switch(l)
{
case 1: if(min>0)min--; break;
case 2: if(sec>0)sec--; break;
case 3: if(cishu>0)cishu--; break;
}
}
if(l>=4)
l=0;
}
}
aaa();
}
}
void Timer0() interrupt 1
{
TH0 = 0xFC; //设置定时初值
TL0 = 0x18; //设置定时初值
if(flag)
{
if(min|sec!=0)
{
j++;
if(j>=1000) //1s
{
j=0;
sec--;
if(min==0&&sec==0)
flag=0;
else if(sec<0)
{
min--;
sec=59;
}
}
}
else flag=0;
}
if(++num==200)
{
num=0;
flash=~flash;
}
abc();
}
|