我们知道,依次只能让一个数码管led灯亮起来,但是我们可以通过高频动态扫描得到8位数码管同时亮起来,这里介绍如何实现。一、八位数码管1
我们知道,依次只能让一个数码管/led灯亮起来,但是我们可以通过高频动态扫描得到8位数码管同时亮起来,这里介绍如何实现。
一、八位数码管
1、八位数码管原理图
下图为原理图:
段选信号:P0[7…0]
位选信号:P2[2…0]
译码使能:P2.3非(图中已用蓝色框圈出)
2、控制信号
段选信号:一位数码管包含8个二极管,a-g,如图:
8个二极管共阴极,以位选信号作为使能信号
位选信号:位选信号为SELP2[2…0],如果位选信号为,结果译码器译码得到(单热点编码方式),选择第五位数码管
显示数字:在位选有效时,通过设置段选信号来设置数值,如段选为P0=11110时,ABCDEFG对应为11110,此时显示数字6
3、点亮一位数码管
通电:每一位数码管的8个二极管阳极姐P0[7…0],共阴极,P0置1
使能:位选信号有效,3-8译码器使能有效,即P2.3=1
模式:I/O模式设置为推挽输出模式(设置P0M1、P0M0、P2M1和P2M0)
二、扫描频率
8位数码管不可能同时亮起来,我们需要设置扫描频率,使数码管类似流水灯诸葛亮起,知识此时扫描频率很高,我们可以定义一个空循环,在主函数中设置n值来得到合适的扫描频率。
voidDelay(intn)//延时函数
{
while(n--);
}
三、流水灯实现
Init()函数:定义常量设置P0M0P0M1P2M0P2M1寄存器的值
#defineuintunsignedint
#defineucharunsignedchar
//定义位选段选信号的十六进制常量
ucharduanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};//段选信号
ucharweixuan[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};//位选信号
voidInit()
{
P2M0=0xff;//éè??í?íìê?3?
P2M1=0x00;
P0M0=0xff;
P0M1=0x00;
}
main()函数:控制动态扫描:
uinti=0;
voidmain()
{
Init();
while(1)
{
for(i=0;i8;i++)
{
P0=0;
P2=weixuan[i];//位选信号P2[2..0],下一周期扫描下一个数码管
P0=duanxuan[i+1];//段选,设置下一个数码管显示的数值
Delay();
}
}
}
描述:主函数中,i值在0-7范围内变化,刚好是8个数字。根每一个循环中,根据每个i值设置位选信号额段选信号,使得在下一扫描周期里下一个数码管被点亮,显示的数值加一。
找元器件现货上唯样商城转载请注明地址:http://www.abmjc.com/zcmbyf/4849.html