电路图
段选:选择每个小数码管中的某几个二极管(a,b,c,d,e,f,g,dp)
位选:选择上图中大数码管中的某一个小数码管
这里数码管为共阳极,低电平有效(即P0.0~P0.7置0可实现段选)
具体段选的实现可参考文章:
https://blog.csdn.net/weixin_48524215/article/details/111398111
下图NPN型三极管导通条件:Uc>Ub>Ue
因为Uc=+5V、Ue=0V,所以q1(接引脚P2.0)为的输出电压应该为+5V<Ub<0V,即将P2.0置为高电平有效(引脚P2.0=1)
下图所有三极管的集电极接+5V,要使三极管导通,按照下图,需要将q1 ~ q8(分别接引脚P2.0 ~ P2.7置1)
完整程序
/*
*数码管共阳极
*P0.0~P0.7置0实现段选(segment)
*P2.0~P2.7置1实现位选(position)
*/
#include<reg51.h>
#include<intrins.h>
unsigned char code seg[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};//共阳极
unsigned char i;
void delay(int a)//延时函数,增大从一个状态到另一个状态之间的时间,避免因变化过快而超出人眼视觉停留的最佳时间
{
while(a--);
}
void main()
{
while(1)
{
//位选,选择第1个数码管,在电路图中第一个小数码管在最左侧
P2=0x01;//0000 0001,初始化状态,选择第一个数码管
for(i=1;i<=8;i++) //段选,共8个小数码管
{
P0=seg[i]; //seg[0]显示数字0,以此类推
delay(30000); //增大从一个状态到另一个状态之间的时间
P2=_crol_(P2,1);//第一个小数码管显示完一个数字后,位选第二个数码管进行显示第二个数字
}
}
}