大佬們,救救小白吧,萬分感謝呀。
/*現在可以實現整數部分的倒計時,小數部分,我就給了他一個數組循環,讓他自己去跑,跟起前面的整數沒關系,這樣肯定是不對的,網上說調定時器的溢出值,奈何,看不懂呀,有沒有好心人,能夠講解一下,不愿講解的話,在下面貼個程序給看一下。感謝感謝*/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit we=P2^7; //位選端
sbit du=P2^6; //段選端
sbit key_s2 = P3^0; //獨立鍵盤
sbit key_s3 = P3^1; //獨立鍵盤
uchar code xiao[10]={0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f};//小數數組,0,9,8,7,6,5,4,3,2,1
void display(uchar,uchar,uchar);
uchar bai,shi,ge;
uchar a,c;
uchar i; //小數
uint b=9; //整數
/*延時函數*/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
};
void display(uchar bai,uchar shi,uchar ge)
{
bai=b/100;
shi=b%100/10;
ge=b%10;
du=0;
P0=leddata[bai];
du=1;
du=0;
we=0;
P0=0xfe;
we=1;
we=0;
delay(5);
du=0;
P0=leddata[shi];
du=1;
du=0;
we=0;
P0=0xfd;
we=1;
we=0;
delay(5);
du=0;
P0=leddata[ge]|0x80;
du=1;
du=0;
we=0;
P0=0xfb;
we=1;
we=0;
delay(5);
}
void display1()
{
du=0;
P0=xiao[i];
du=1;
du=0;
we=0;
P0=0xf7;
we=1;
we=0;
delay(5);
}
/*開定時器與中斷*/
void init()
{
TMOD=0x11;
TH0=TH1=0x4b;
TL0=TL1=0xfc;
EA=1;
ET0=1;
ET1=1;
}
/*按鍵判斷*/
void init1()
{
if(key_s2 == 0) //判斷是否按下S2
{
delay(5); //軟件消抖
if(key_s2 == 0)//再次判斷是否按下S2
{
TR0 = 1;//啟動定時器0
TR1 = 1;
display(bai,shi,ge);
display1();
}
}
if(key_s3 == 0) //判斷S3是否被按下
{
delay(5);//軟件消抖
if(key_s3 == 0)//再次判斷S3是否被按下
{
TR0 = 0;//停止定時器0
TR1 = 0;
}
}
}
/*主函數*/
void main()
{
init();
while(1)
{
init1();
display(bai,shi,ge);
display1();
}
}
/*定時器1,定的是小數*/
void timer1() interrupt 3
{
TH1=0x4b;
TL1=0xfc;//延時50ms
c++;
if(c==2)
{
c=0;
i++;
}
if(i==10)
{
i=0;
}
}
/*定時器0,定的是整數*/
void timer0() interrupt 1
{
TH0=0x4b;
TL0=0xfc;//延時50ms
a++;
if(a == 20)
{
a=0;
b--;
}
if(b == 0)
{
TR0 = 0;//時間到關閉定時器1
TR1=0;
}
}
|