|
本帖最后由 loyc 于 2017-6-6 10:43 編輯
情況是這個樣子的,我在學習一個教材里面的程序,數(shù)碼管的動態(tài)顯示。 程序沒有任何更改過,自己也差不多理解了,因為沒有教材里面的學習板,所以想用protues仿真實驗一下,仿真的情況是一開始數(shù)碼管不顯示,讓仿真運行一會兒之后數(shù)碼管就開始顯示了,但是抖動很厲害根本沒法觀察。期望大家?guī)蛶兔Γf分感謝,后面我會把仿真和程序打包一起發(fā)上來,麻煩大佬看一下謝謝,另外我還發(fā)了一些截圖,麻煩大家餓了謝謝。
對了,發(fā)上來的截圖里面應(yīng)該也能看出來,就是一開始P0口全為高電平,無現(xiàn)象,但是過一會兒之后P0口有電平變化,出現(xiàn)現(xiàn)象。仔細看可以看出來。
程序如下,謝謝:
#include<reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[]={
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6]={
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned char i = 0;
unsigned int cnt = 0;
unsigned char flag1s = 0;
void main()
{
unsigned long sec = 0;
ENLED = 0;
ADDR3 = 1;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
TR0 = 1;
EA = 1;
ET0 = 1;
while(1)
{
if(flag1s == 1)
{
flag1s = 0;
sec++;
LedBuff[0] = LedChar[sec%10];
LedBuff[1] = LedChar[sec/10%10];
LedBuff[2] = LedChar[sec/100%10];
LedBuff[3] = LedChar[sec/1000%10];
LedBuff[4] = LedChar[sec/10000%10];
LedBuff[5] = LedChar[sec/100000%10];
}
}
}
void InterruptTime0() interrupt 1
{
TH0 = 0xFC;
TL0 = 0x67;
cnt++;
if(cnt >= 1000)
{
cnt = 0;
flag1s = 1;
}
P0 = 0xFF;
switch(i)
{
case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0];break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1];break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2];break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3];break;
case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4];break;
case 5: ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[5];break;
default:break;
}
}
|
|