欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
做了個基于單片機的數字時鐘,顯示880,請大家幫忙看看是哪里的問題?
[打印本頁]
作者:
2373575159
時間:
2021-6-24 08:55
標題:
做了個基于單片機的數字時鐘,顯示880,請大家幫忙看看是哪里的問題?
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void Delayms(uint x);
sbit L=P2^0;
sbit LA=P2^1;
sbit LB=P2^2;
void Display();
sbit key1=P1^5;
sbit key2=P1^6;
sbit key3=P1^7;
/*位碼*/uchar tablew[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
/*位選*/uchar shu[8]={0};
/*共陰極*/
uchar table6[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint aa,bb,cc,dd;
void main()
{
TMOD=0x01;//設置工作方式
TH0=(65536-1000)/256;//設置定時器高八位
TL0=(65536-1000)%256;//設置定時器低八位
ET0=1;//打開定時器T0的中斷開關
TR0=1;//啟動定時器T0工作
EA=0;//打開總中斷開關
while(1)
{
uchar mshi,mge,fshi,fge,sshi,sge;
if(key1==0)
{
EA=1;
}
else if(key2==0)
{
EA=0;
}
else if(key3==0)
{
bb=0;cc=0;dd=0;
}
else;
mshi=bb/10;
mge=bb%10;
if(bb>59)
{
bb=0;
cc++;
}
fshi=cc/10;
fge=cc%10;
if(cc>59)
{
cc=0;
dd++;
}
sshi=dd/10;
sge=dd%10;
if(dd>23)
{
dd=0;
}
shu[7]=table6[mge];
shu[6]=table6[mshi];
shu[5]=0x40;
shu[4]=table6[fge];
shu[3]=table6[fshi];
shu[2]=0x40;
shu[1]=table6[sge];
shu[0]=table6[sshi];
Display();
}
}
void int0_0() interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
aa++;//1ms加一次
if(aa>1000)
{
aa=0;
bb++;//1S加一次
}
}
void Display()
{
uint i;
for(i=0;i<8;i++)
{
P2=tablew[i];
P0=shu[i];
Delayms(1);
}
}
void Delayms(uint x)
{
uchar j;
while(x--)
{
for(j=0;j<125;j++);
}
}
復制代碼
作者:
HSY666NB
時間:
2021-6-24 10:10
看到了你這個代碼的問題,Display函數中的for循環里P0 = shu;這句話錯了,shu是一個數組,你這樣寫keil會警告的,雖說keil有警告也能運行,但是一定要清楚警告了些什么;
其次,你的程序有一些還可以改進的地方,T0定時器僅僅是計算時間的,因此可以將其定時時間改大點,時間越小對while影響越大,建議改成50ms。
另外進階寫法是把顯示數碼管的代碼放到T1中斷里,T1中斷定時3ms左右,每進入一次中斷顯示對應位,這樣做的好處是主程序while里的代碼可以及時運行,而不會因為delay導致運算不及時,當然這也是后面你需要對時鐘再進階時的操作。
另外,很明顯你的代碼是在仿真里運行的,如果你要上機到實物則需要加按鍵消抖。
如果后續你還要再加按鍵更改顯示時間之類的代碼,可以私聊我
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1