我们知道,依次只能让一个数码管/led灯亮起来,但是我们可以通过高频动态扫描得到8位数码管同时亮起来,这里介绍如何实现。
一、八位数码管
1、八位数码管原理图
下图为原理图:
段选信号:P0[7…0]
位选信号:P2[2…0]
译码使能:P2.3非 (图中已用蓝色框圈出)
2、控制信号
段选信号:一位数码管包含8个二极管,a-g,如图:
8个二极管共阴极,以位选信号作为使能信号
位选信号:位选信号为SEL P2[2…0],如果位选信号为101,结果译码器译码得到0001 0000(单热点编码方式),选择第五位数码管
显示数字:在位选有效时,通过设置段选信号来设置数值,如段选为P0=10111110时,ABCDEFG对应为10111110,此时显示数字6
3、点亮一位数码管
通电:每一位数码管的8个二极管阳极姐P0[7…0],共阴极,P0置1
使能:位选信号有效,3-8译码器使能有效,即P2.3=1
模式:I/O模式设置为推挽输出模式(设置P0M1、P0M0、P2M1和P2M0)
二、扫描频率
8位数码管不可能同时亮起来,我们需要设置扫描频率,使数码管类似流水灯诸葛亮起,知识此时扫描频率很高,我们可以定义一个空循环,在主函数中设置n值来得到合适的扫描频率。
void Delay(int n) //延时函数
{
while(n--);
}
三、流水灯实现
Init()函数:定义常量 & 设置P0M0 P0M1 P2M0 P2M1 寄存器的值
#define uint unsigned int
#define uchar unsigned char
// 定义位选段选信号的十六进制常量
uchar duanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f}; //段选信号
uchar weixuan[]={0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; //位选信号
void Init()
{
P2M0=0xff; //ÉèÖÃÍÆÍìÊä³ö
P2M1=0x00;
P0M0=0xff;
P0M1=0x00;
}
main()函数:控制动态扫描:
uint i = 0;
void main()
{
Init();
while(1)
{
for(i=0;i<8;i++)
{
P0=0;
P2=weixuan[i]; //位选信号P2[2..0],下一周期扫描下一个数码管
P0=duanxuan[i+1]; //段选,设置下一个数码管显示的数值
Delay(600);
}
}
}
描述:主函数中,i值在0-7范围内变化,刚好是8个数字。根每一个循环中,根据每个i值设置位选信号额段选信号,使得在下一扫描周期里下一个数码管被点亮,显示的数值加一。
第三篇单片机学习笔记完结,cheers ! ??