[蓝桥杯单片机 八位共阳数码管](4)

[蓝桥杯单片机 共阳数码管]

一、数码管原理图

开发板上的八位数码管为共阳连接,com1–com8分别控制公共端(公共阳极);a–dp分别控制数码管每一位的八个段。它们两又分别被锁存器U6和U7控制着。


当com端为高电平,对应的a–dp为低电平时相应段码就会亮。如:com1为高电平,com2–com8为低电平,此时让dp为低电平,a–g为高电平,则第一个数码管只有dp亮,也就是亮一个点。

由于段码有八个,如果一个一个赋值很麻烦,因此一般用十六进制数一次性给段码进行赋值。十六进制数控制的段码显示如下:

二、数码管显示代码

下面举几个例子:
1、让数码管八个位都显示6(数码管静态显示)

#include"reg52.h"
sbit HC138_A = P2^5;//定义译码器中ABC所在引脚
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;

void Show_SMG()
{	
	HC138_C = 1;  //给CBA赋值,打通U6
	HC138_B = 1;
	HC138_A = 0;
	P0 = 0xff;   //com1-8设为高电平
	
	HC138_C = 1;  //给CBA赋值,打通U7
	HC138_B = 1;
	HC138_A = 1;
	P0 = 0x82;  //给八个段赋值显示6
}

void main()
{
	while(1)
	{
	Show_SMG();
	}
}

2、让数码管八个位从0显示到9(数码管静态显示)

为了方便,我们将所有要用的段码放在一个数组中;将选择锁存器的代码也进行优化,要理解这些的原理都要将十六进制转化为二进制来理解。

#include"reg52.h"

unsigned char SMG_Duanma[12] = 
	{0xc0,0xf9,0xa4,0xb0,0x99,0x92,
	 0x82,0xf8,0x80,0x90,0xbf,0x7f};//数码管段码
void Delay(unsigned int t)
{
	while(t--);
}

void SelectHC573(unsigned channel)  //选择锁存器
{
	switch(channel)
	{
		case 6:  //选择U6锁存器
		  P2 = P2 & 0x1f | 0xc0;
		break;
		case 7:  //选择U7锁存器
    		  P2 = P2 & 0x1f | 0xe0;
  		break;
	}
}

unsigned char i;
void ShowSMG()
{
	SelectHC573(6);
	P0 = 0xff;  //com1-8设为高电平
	SelectHC573(7);
	for(i = 0; i<=9; i++)
	{
		P0 = SMG_Duanma[i];
		Delay(50000);
		Delay(50000);
	}	
}

void main()
{
	while(1)
	{
		ShowSMG();
	}

}

3、让数码管从0显示到99(数码管动态显示)

动态显示原理:让不同位的数码管只亮一小段极小时间,从而造成视觉暂留效果,人眼无法识别这极小段的熄灭时间,从而觉得这些不同位数码管是同时亮的。

上代码:

#include"reg52.h"

unsigned char SMG_Duanma[12]=
	{0xc0,0xf9,0xa4,0xb0,0x99,0x92,
 	 0x82,0xf8,0x80,0x90,0xbf,0x7f};//数码管段码
 	 
void Delay(unsigned int t)
 {
 	while(t--);
 }

void SelectHC573(unsigned char channel)
{
	switch(channel)
	{
		case 6:  //选择U6锁存器
    		   P2 = P2 & 0x1f | 0xc0;
 		 break;
		 case 7:  //选择U7锁存器
  		  P2 = P2 & 0x1f | 0xe0;
		  break;
	}
}

void ShowSMG_Bit(unsigned char pos,  unsigned char value)  //pos位显示value
{
	SelectHC573(6);
	P0 = 0x01 << (pos - 1);
	SelectHC573(7);
	P0 = value;
	Delay(200);  //消影
	P0 = 0xff;   //消影
}

unsigned char i, j;
void DelaySMG(unsigned int t)
{
	while(t--)
	{
		ShowSMG_Bit(1, SMG_Duanma[i]);  //第一位显示SMG_Duanma[i]
		Delay(200);
		ShowSMG_Bit(2, SMG_Duanma[j]);  //第二位显示SMG_Duanma[j]
		Delay(200);
	}
}

void ShowSMG()
{
	for(i = 0; i<=9; i++)	
		for(j = 0; j <= 9; j++)
		{	
			ShowSMG_Bit(1, SMG_Duanma[i]);  //第一位显示SMG_Duanma[i]
			DelaySMG(200);
			ShowSMG_Bit(2, SMG_Duanma[j]);  //第二位显示SMG_Duanma[j]
 			DelaySMG(200);
		}			
}

void main()
{
	while(1)
	{
		ShowSMG();
	}
}
		 
	 
	 
	
	```


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我会尽力回答你的问题。 首先,我们需要了解八段八位共阳数码管的显示原理。它由8个发光二极管和一个共阳极组成。在共阳极接通的情况下,当对应的发光二极管接通时,该二极管就会发光。因此,我们可以通过控制发光二极管和共阳极的电平来实现数码管上显示不同的数字、字母和符号。 接下来,我们需要了解如何使用STM32F401VE芯片来控制数码管的显示。我们可以通过STM32F401VE芯片上的GPIO口来控制数码管的显示。具体步骤如下: 1. 定义一个数组,用于存储要显示的数字。 ``` uint8_t num[8] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07}; ``` 上面的数组中,每个元素分别代表0~7的数字在数码管上的显示方式,其中0x3f表示0在数码管上的显示方式,0x06表示1在数码管上的显示方式,以此类推。 2. 设置GPIO口的工作模式。 我们需要将8个GPIO口设置为输出模式,用于控制数码管的8个发光二极管。具体代码如下: ``` GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIO时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 配置GPIO口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); ``` 上面的代码中,我们将PA0~PA7这8个GPIO口设置为输出模式。 3. 实现动态显示。 我们可以通过使用定时器中断来实现数码管的动态显示。具体步骤如下: - 定义一个定时器中断函数,并在其中实现数码管的动态显示。具体代码如下: ``` void TIM2_IRQHandler(void) { static uint8_t i = 0; // 关闭上一个数码管 GPIO_SetBits(GPIOA, 1 << i); // 显示下一个数码管 GPIO_ResetBits(GPIOA, 1 << ((i + 1) % 8)); // 显示当前数码 GPIO_Write(GPIOA, num[i]); // 更新计数器 i = (i + 1) % 8; // 清除中断标志位 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } ``` 上面的代码中,我们使用了一个静态变量i来记录当前显示的是哪个数码管。每次中断时,我们先关闭当前显示的数码管,然后显示下一个数码管,并显示当前数码。最后更新计数器i的值,以便下一次中断时显示下一个数码管。 - 配置定时器中断。具体代码如下: ``` TIM_TimeBaseInitTypeDef TIM_InitStructure; // 使能定时器2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 配置定时器2 TIM_InitStructure.TIM_Period = 999; TIM_InitStructure.TIM_Prescaler = 8399; TIM_InitStructure.TIM_ClockDivision = 0; TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_InitStructure); // 配置定时器2中断 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 启动定时器2 TIM_Cmd(TIM2, ENABLE); ``` 上面的代码中,我们使用定时器2来实现中断,每1ms中断一次。我们将定时器的周期设置为999,预分频系数设置为8399。这样,定时器2的计数频率就是100Hz,即每秒钟计数100次。 至此,我们就完成了使用STM32F401VE芯片实现八段八位共阳数码管动态显示的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值