单片机学习笔记 —— 8位数码管动态扫描

我们知道,依次只能让一个数码管/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 ! ??

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值