遇到的问题是:
动态显示时,如果位选变化间隔太小,会导致计数的部分失效,数码管一直显示0000,间隔在30时数字会有变化,但是显示闪烁的效果太明显了
代码如下:
#define uint unsigned int
#define uchar unsigned char
//位选定义
sbit wei0 =P1^3;
sbit wei1 =P1^4;
sbit wei2 =P1^5;
sbit wei3 =P1^6;
//数码管显示段选数组
uint NUM_SEG[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
//延时函数
void delay(uint time)
{
uint i,j;
for(i=0;i<time;i++)
{
for(j=0;j<100;j++);
}
}
//数码管位选函数
void wei(uint wx)
{
switch(wx)
{
case 0:
wei0 = 0; wei1=1;wei2=1;wei3=1;
break;
case 1:
wei0 = 1; wei1=0;wei2=1;wei3=1;
break;
case 2:
wei0 = 1; wei1=1;wei2=0;wei3=1;
break;
case 3:
wei0 = 1; wei1=1;wei2=1;wei3=0;
break;
default:
wei0 = 1; wei1=1;wei2=1;wei3=1;
break;
}
}
//定时器中断初始化函数,用的是定时器0,方式1
void Timer0Init() {
TMOD = 0x01;
TH0 = (65535-50000)/256;
TL0 = (65535-50000)%256;
ET0 = 1;
EA = 1;
TR0 = 1;
}
uint count = 0;
uint i = 0;
//中断响应函数
void Timer0() interrupt 1
{
TH0 = (65535-50000)/256;
TL0 = (65535-50000)%256;
//每过1s让i进行自加,加到9999置零
count++;
if(count == 20)
{
count = 0;
i++;
if(i==9999)
{
i = 0;
}
}
}
//主函数
void main ()
{
uint ge,shi,bai,qian;//用来显示数码管不同位的数字
P0=0X00;
while(1)
{
Timer0Init();//定时器中断初始化函数
//计算数码管显示的数字
ge=i%10;
shi=i%100/10;
bai=i/100%10;
qian=i/1000;
//动态显示代码
wei(3);
P0=NUM_SEG[ge];//数码管显示
delay(3);//程序的问题是延时短的话数码管显示为0000,延时设置为30,就可以正常显示数字变化,但是闪烁问题严重
wei(2);
P0=NUM_SEG[shi];
delay(3);
wei(1);
P0=NUM_SEG[bai];
delay(3);
wei(0);
P0=NUM_SEG[qian];
delay(3);
}
}
标签:P1,单片机,位选,51,unsigned,数码管,uint,sbit
From: https://www.cnblogs.com/fdzd/p/18678562