动态扫描就是给各个数码管依次显示,任意时间只有一个数码管亮,但闪烁的太快了,人眼分辨不出,给人的感觉就是每个数码管都在亮。一般过程就是赋值,开显示,延时,关显示,这是我以前写过的程序
#include <REGX52H>
main()
{unsigned int i;
while(1)
{P0=0x3f;//个位赋值
P1_0=0;//开显示
for(i=0;i<2;i++);//延时
P1_0=1;//关显示
P0=0x6;//十位
P1_1=0;
for(i=0;i<2;i++);
P1_1=1;
P0=0x5b;//百位
P1_2=0;
for(i=0;i<2;i++);
P1_2=1;
P0=0x4f;//千位
P1_3=0;
for(i=0;i<2;i++);
P1_3=1;}
}
这个是4位数码管,P0口接赋值端,P1口低四位接4个数码管的选通端,你要八个的话就把P1口的高四位再接到另外四个数码管的片选端,程序仿照就可以了
很容易,首先假如我们有6位数码管,每位数码管需要8个段选1个公共选通端, 那么6位数码管自然是8位端选信号 6位选通信号(分别选通1-6其中的一个数码管)
#define SMG_WEI P0 //P10 -P15 分别驱动数码管选通
#define SMG_DUAN P1 //P10 -P17接数码管8个段选
unsigned char smgcode[]={x,x,x,x,x,x,x,x,x,x} //对应数码管0-9的值,实际根据段信号确定
void Delay(unsigned long w)
{
while(w--);
}
void DisPlay(unsigned char s1,unsigned char s2,unsigned char s3,unsigned char s4,unsigned char s5,unsigned char s6) //s1 -s6表示1-6的数码管需要显示的数字
{
SMG_WEI =0x01 //第1个数码管选通 000001
SMG_DUAN =smgcode[s1]; //如s1传入1表示要显示1,那么直接调用数组偏移量为1的值,显示1
Delay(100); //延时一段时间消影
SMG_WEI =0x02 //第2个数码管选通 000010
SMG_DUAN =smgcode[s2]; //如s2传入2表示要显示2,那么直接调用数组偏移量为2的值,显示2
Delay(100); //延时一段时间消影
S3 /////
S4 /////
S5 //////
SMG_WEI =0x20 //第6个数码管选通 100000
SMG_DUAN =smgcode[s6]; //如s6传入6表示要显示6,那么直接调用数组偏移量为6的值,显示6
Delay(100); //延时一段时间消影
SMG_WEI =0;
SMG_DUAN =0; //清除显示,保证每位数码管亮度一致
}
void main()
{
while(1)
{
DisPlay(1,2,3,4,5,6);//数码管显示 1 2 3 4 5 6
}
}
以上就是关于51单片机如何控制八个数码管,进行动态扫描全部的内容,包括:51单片机如何控制八个数码管,进行动态扫描、怎么实现数码管动态动态扫描显示(同时显示不同的数字)以下程序只能一次显示一个数字。、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)