秒表仿真,兩位共陰極數碼管顯示秒數,十位上的數只閃一下,顯示的時間比個位上的數短,是什么原因呢?
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,shi,ge;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰極數碼管碼表
void display(uchar shi,uchar ge);
void delayms(uint);
void init();
void main()
{
init();
while(1)
{
if(aa==20)
{
aa=0;
temp++;
if(temp==59)
{
temp=0;
}
shi=temp/10;
ge=temp%10;
display(shi,ge);
}
}
}
void delayms(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar shi,uchar ge) //顯示子程式
{
P2=0xfe;
P1=table[shi];
delayms(5);
P2=0xfd;
P1=table[ge];
delayms(5);
}
void init() //定時器初始化程式
{
temp=0;
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0()interrupt 1 //定時器T0中斷子程式
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
uj5u.com熱心網友回復:
這應該是你的延時沒處理好,每顯示一位數之后不是要進行一段時間的延時來產生余暉嘛,你那個延時可能不合適。另外,每顯示一位數并延時后,最后再讓段選輸出oxff(假如數碼管段選是共陽極),讓段選全部關閉,再進行下一位數的位選、段選和延時uj5u.com熱心網友回復:
有問題的總是這樣的寫法,P2的2個引腳單獨定義呼叫比較好。uj5u.com熱心網友回復:
改延時時間沒用,這程式這樣寫好像不行,顯示個位上的數時,十位的段選就關閉了,個位數一出來十位數就沒了,所以十位數看起來就是閃的
uj5u.com熱心網友回復:
改延時時間沒用,這程式這樣寫好像不行,顯示個位上的數時,十位的段選就關閉了,個位數一出來十位數就沒了,所以十位數看起來就是閃的
uj5u.com熱心網友回復:
改延時時間沒用,這程式這樣寫好像不行,顯示個位上的數時,十位的段選就關閉了,個位數一出來十位數就沒了,所以十位數看起來就是閃的
uj5u.com熱心網友回復:
我覺得程式沒問題,因為數字本身就是一位一位顯示的,我們之所以能看到連續的數字是因為余暉效應,而選擇好延時函式是產生余暉效應的關鍵轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/45661.html
標籤:單片機/工控
上一篇:示波器讀取編碼器AB相電壓問題
