采用四位一體數碼管倆個,限流電阻4.7k歐,主控為STC89c52單片機。以下程序作為參考。實物圖可以去相冊里觀看。
呵呵,在編寫這個程序時遇到了一些問題,拿出來與大家共勉。
剛開始我就把位定義的接口弄錯,單片機怎么都不工作,看來看去終于發現剛開始就錯了;之后發現我的時間走得比標準時鐘快好多,可能我的芯片晶振更快吧,但怎么想真么不合理,那個后來我只好計算一下,只好把時鐘改了;再之后我發現有時調節時和分時,秒針要等很久(大約一分鐘)才工作,后來經過排查發現,當你調節時,如果正好等于time==16,那么time將繼續增加,直至走到下一個16,。
本程序應用了定時器中斷。
#include<reg52.h>
#define DIG P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k0=P3^1;
sbit k1=P3^0;
void timerconfiguration();
void digdisplay();
void clock();
void keydown();
unsigned char num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char state[10];
unsigned char time;
unsigned char a;
unsigned char b;
unsigned char d;
unsigned char c;
unsigned char e;
void main()
{
char k;
for(k=7;k>0;k--)
state[k]=num[0];
state[2]=0x40;
state[5]=0x40;
time=0;
a=0;
b=0;
c=0;
d=0;
e=0;
timerconfiguration();
while(1)
{
digdisplay();
keydown();
clock();
}
}
void timerconfiguration(void)
{
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
EA=1;
ET0=1;
TR0=1;
}
void digdisplay(void)
{
unsigned char i;
unsigned char j;
i=0;
while(i<8)
{
switch(i)
{
case (0): LSA=0; LSB=0; LSC=0; break;
case (1): LSA=1; LSB=0; LSC=0; break;
case (2): LSA=0; LSB=1; LSC=0; break;
case (3): LSA=1; LSB=1; LSC=0; break;
case (4): LSA=0; LSB=0; LSC=1; break;
case (5): LSA=1; LSB=0; LSC=1; break;
case (6): LSA=0; LSB=1; LSC=1; break;
case (7): LSA=1; LSB=1; LSC=1; break;
}
DIG=state[i];
i++;
j=10;
while(j--);
DIG=0x00;
}
}
void timer() interrupt 1
{
time++;
}
void keydown(void)
{
unsigned char q;
unsigned char w;
unsigned char p;
unsigned char number;
if((k0==0) || (k1==0))
{
for(q=38; q>0; q--)
for(w=100; w>0; w--);
if(k0==0)
{
if(state[3]!=num[9])
{
c++;
state[3]=num[c];
}
else
{
c=0;
state[3]=num[c];
if(state[4]!=num[5])
{
d++;
state[4]=num[d];
}
else
{
d=0;
state[4]=num[d];
if(state[6]!=num[9])
{
e++;
state[6]=num[e];
}
else
{
e=0;
state[6]=num[e];
state[7]=num[1];
}
if((state[7]==num[1]) && (state[6]==num[3]))
{
for(number=7; number>0; number--)
state[number]=num[0];
state[2]=0x40;
state[5]=0x40;
d=0;
e=0;
}
}
}
}
if(k1==0)
{
if(state[6]!=num[9])
{
e++;
state[6]=num[e];
}
else
{
e=0;
state[6]=num[e];
state[7]=num[1];
}
if((state[7]==num[1]) && (state[6]==num[3]))
{
for(number=7; number>0; number--)
state[number]=num[0];
state[2]=0x40;
state[5]=0x40;
e=0;
}
}
p=50;
while((p>0) && ((k0==0) ||(k1==0)))
{
p--;
for(q=38; q>0; q--)
for(w=100; w>0; w--);
}
}}
void clock(void)
{
unsigned char number;
if(time>=16)
{
time=0;
if(state[0]!=num[9])
{
a++;
state[0]=num[a];
}
else
{
a=0;
state[0]=num[a];
if(state[1]!=num[5])
{
b++;
state[1]=num[b];
}
else
{
b=0;
state[1]=num[b];
if(state[3]!=num[9])
{
c++;
state[3]=num[c];
}
else
{
c=0;
state[3]=num[c];
if(state[4]!=num[5])
{
d++;
state[4]=num[d];
}
else
{
d=0;
state[4]=num[d];
if(state[6]!=num[9])
{
e++;
state[6]=num[e];
}
else
{
e=0;
state[6]=num[e];
state[7]=num[1];
}
if((state[7]==num[1]) && (state[6]==num[3]))
{
for(number=7; number>0; number--)
state[number]=num[0];
state[2]=0x40;
state[5]=0x40;
e=0;
}
}
}
}
}
}
}
robots brother 之 牧雷(愛昵空間)
歡迎喜歡電子的朋友加我的新qq一起討論,以后作品將很少發在這個qq。
robots brother 2300862512