|
50黑幣
功能是數(shù)碼管前兩位用來計數(shù)倒計時的次數(shù)的,最后四位用來做倒計時的時鐘,當(dāng)我按K1按鍵的時候開始倒計時,計數(shù)加1,倒計時結(jié)束后再次按啟動增加計數(shù)獲取時間繼續(xù)倒計時,當(dāng)我長按K2按鍵的時候次數(shù),分鐘,秒鐘,對應(yīng)的數(shù)碼管能夠閃爍顯示,其他數(shù)碼管正常顯示,K4和K8兩個按鍵在k2按鍵按下之后用來對其閃爍的次數(shù),分鐘,秒鐘加減。現(xiàn)在的情況是我k4和k8按鍵按下后并不增減閃爍的數(shù)值,然后另一個問題是啟動的時候計數(shù)顯示的不對一直都是顯示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; //設(shè)置定時初值
TL0 = 0x18; //設(shè)置定時初值
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();
}
|
|