
数码管动态显示原理 (如何让数码管的动态扫描慢一点)
数码管(阳极)我把前四位位选打开,让他们分别显示1234,让后再让他们自加,结果太快了,像秒表一样,我就想延时,结果后面一位慢了,可是前面3位都慢了,在闪烁,怎么样才能后...
数码管(阳极)
我把前四位位选打开,让他们分别显示1234,让后再让他们自加,结果太快了 ,像秒表一样,我就想延时,结果后面一位慢了,可是前面3位都慢了,在闪烁,怎么样才能后面的也慢前面的不闪啊???
我的位选是单个开的 ,还有我还没学中断,学长说不用中断也可以的,可是 我就是试不出来~~~不过谢谢你们了 ~~~~ 展开
我把前四位位选打开,让他们分别显示1234,让后再让他们自加,结果太快了 ,像秒表一样,我就想延时,结果后面一位慢了,可是前面3位都慢了,在闪烁,怎么样才能后面的也慢前面的不闪啊???
我的位选是单个开的 ,还有我还没学中断,学长说不用中断也可以的,可是 我就是试不出来~~~不过谢谢你们了 ~~~~ 展开
展开全部
不用中断也可:
1,初始化
2,显示第一位
3,延时(2MS)
4,显示第二位
5,延时(2MS)
6,显示第三位
7,延时(2MS)
8,显示第四位
9,延时(2MS)
10,增加数字(这里设置一个寄存器加1,只有计数到1000显示数值才增加,这样就是4秒显示数值增加1)
11,跳转到第2步
1,初始化
2,显示第一位
3,延时(2MS)
4,显示第二位
5,延时(2MS)
6,显示第三位
7,延时(2MS)
8,显示第四位
9,延时(2MS)
10,增加数字(这里设置一个寄存器加1,只有计数到1000显示数值才增加,这样就是4秒显示数值增加1)
11,跳转到第2步
展开全部
扫描在定时中断内执行,秒脉冲可以用软件延时,也可以用定时中断产生,最好用定时中断,尽量少占用cpu的资源。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我觉得位选不要一起打开。
延时加的太长了,超过人眼视觉停留时间,灯才会闪的。
延时加的太长了,超过人眼视觉停留时间,灯才会闪的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
//简单的写一个,自己参考一下
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit k1 = P1^0;
sbit k2 = P1^1;
sbit k3 = P1^2;
sbit k4 = P1^3;
uchar a,b,c,d;
uint e;
uchar code tab_num[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};//共阳数码管
void delay(uchar k) //延时函数
{
uchar i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++);
}
}
void display_led()
{
k1 = 1;
P0 = tab_num[a];
delay(5);
k1 = 0;
k2 = 1;
P0 = tab_num[b];
delay(5);
k2 = 0;
k3 = 1;
P0 = tab_num[c];
delay(5);
k3 = 0;
k4 = 1;
P0 = tab_num[d];
delay(5);
k4 = 0;
e++;
if(e==100){e=0;d++;};//e==100改变e的大小可以改变自加的速度
//要使用秒闪,要计算好上面程序的执行时间,延时时间,再来却定e的大小
//指令的执行周期与晶振有关,可以去参考资料。
if(d>9){d=0;c++;};
if(c>9){c=0;b++;};
if(b>9){b=0;a++;};
if(a>9){a=0;};
}
void main()
{
a = 1;
b = 2;
c = 3;
d = 4;
P1 = 0x00;
while(1)
{
display_led();
}
}
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit k1 = P1^0;
sbit k2 = P1^1;
sbit k3 = P1^2;
sbit k4 = P1^3;
uchar a,b,c,d;
uint e;
uchar code tab_num[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};//共阳数码管
void delay(uchar k) //延时函数
{
uchar i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++);
}
}
void display_led()
{
k1 = 1;
P0 = tab_num[a];
delay(5);
k1 = 0;
k2 = 1;
P0 = tab_num[b];
delay(5);
k2 = 0;
k3 = 1;
P0 = tab_num[c];
delay(5);
k3 = 0;
k4 = 1;
P0 = tab_num[d];
delay(5);
k4 = 0;
e++;
if(e==100){e=0;d++;};//e==100改变e的大小可以改变自加的速度
//要使用秒闪,要计算好上面程序的执行时间,延时时间,再来却定e的大小
//指令的执行周期与晶振有关,可以去参考资料。
if(d>9){d=0;c++;};
if(c>9){c=0;b++;};
if(b>9){b=0;a++;};
if(a>9){a=0;};
}
void main()
{
a = 1;
b = 2;
c = 3;
d = 4;
P1 = 0x00;
while(1)
{
display_led();
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询