|
本帖最后由 loyc 于 2017-6-6 10:43 编辑
情况是这个样子的,我在学习一个教材里面的程序,数码管的动态显示。 程序没有任何更改过,自己也差不多理解了,因为没有教材里面的学习板,所以想用protues仿真实验一下,仿真的情况是一开始数码管不显示,让仿真运行一会儿之后数码管就开始显示了,但是抖动很厉害根本没法观察。期望大家帮帮忙,万分感谢,后面我会把仿真和程序打包一起发上来,麻烦大佬看一下谢谢,另外我还发了一些截图,麻烦大家饿了谢谢。
对了,发上来的截图里面应该也能看出来,就是一开始P0口全为高电平,无现象,但是过一会儿之后P0口有电平变化,出现现象。仔细看可以看出来。
程序如下,谢谢:
#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;
}
}
|
|