STM32-4位数码管动态显示0~9999

本章是基于STM32F1xx来写的四位数码管动态显示,通过定时器实现每秒加一。

LED数码管有两大类,一类是共阴极接法,另一类是共阳极接法,共阴极就是7段的显示字码共用一个电源的负极,是高电平点亮,共阳极就是7段的显示字码共用一个电源的正极,是低电平点亮。只要控制其中各段LED的亮灭即可显示相应的数字、字母或符号。
共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已,共阴为所有的LED负极接在一起,共阳为为所有的LED正极接在一起。

共阳极数码管编码表(0~F):
unsigned char code smg[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
共阴极数码管编码表(0~F):
unsigned char code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; 

 Pproteus8进行仿真

数码管选段
uint8_t WEI_tab[]={0x0e,0x0d,0x0b,0x07};//1110,1101,1011,0111
延迟函数
void delay(unsigned int ms)
{
   unsigned int i,j;
   for(i=ms;i>0;i--)
    for(j=150;j>0;j--);
}
数码管显示代码
void display()
 {
    unsigned int shi,ge,bai,qian;
	ge=Num%1000%100%10;;
	shi=Num%1000%100/10;
	bai=Num%1000/100;;
	qian=Num/1000;
		 GPIOC->ODR=(GPIOC->ODR & 0xfffff000) | SEG_tab_CC[ge] | WEI_tab[3]<<8;
   	 delay(20);
	 	 GPIOC->ODR=(GPIOC->ODR & 0xfffff000) | SEG_tab_CC[shi] | WEI_tab[2]<<8;
   	 delay(20);
		 GPIOC->ODR=(GPIOC->ODR & 0xfffff000) | SEG_tab_CC[bai] | WEI_tab[1]<<8;
   	 delay(20);
		GPIOC->ODR=(GPIOC->ODR & 0xfffff000) | SEG_tab_CC[qian] | WEI_tab[0]<<8;
		 delay(20);
 }

  • 18
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: 动态显示2数码管可以使用定时器中断和数码管扫描技术来实现。下面是一个简单的示例程序: ```c #include "stm32f10x.h" #define DIGIT1 GPIO_Pin_0 #define DIGIT2 GPIO_Pin_1 #define SEG_A GPIO_Pin_2 #define SEG_B GPIO_Pin_3 #define SEG_C GPIO_Pin_4 #define SEG_D GPIO_Pin_5 #define SEG_E GPIO_Pin_6 #define SEG_F GPIO_Pin_7 #define SEG_G GPIO_Pin_8 uint8_t digit[2] = {0}; // 存储两数码管显示的数字 void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 数码管选引脚 GPIO_InitStructure.GPIO_Pin = DIGIT1 | DIGIT2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 数码管段选引脚 GPIO_InitStructure.GPIO_Pin = SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } void TIM_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 999; TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 定时器时钟为72MHz,分频系数为7200 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM2, ENABLE); } void TIM2_IRQHandler(void) { static uint8_t digit_num = 0; // 当前扫描的数码管数 if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 关闭上一数码管 if (digit_num == 0) { GPIO_SetBits(GPIOA, DIGIT2); } else { GPIO_SetBits(GPIOA, DIGIT1); } // 显示当前的数字 GPIO_Write(GPIOB, digit[digit_num]); // 打开当前数码管 if (digit_num == 0) { GPIO_ResetBits(GPIOA, DIGIT1); digit_num = 1; } else { GPIO_ResetBits(GPIOA, DIGIT2); digit_num = 0; } } } int main(void) { GPIO_Configuration(); TIM_Configuration(); while (1) { // 更新要显示的数字 digit[0] = rand() % 10; digit[1] = rand() % 10; } } ``` 在程序中,使用定时器 TIM2 的中断来控制数码管的扫描,定时器的时钟为 72MHz,分频系数为 7200,所以定时器的周期为 1000us,即 1ms。在定时器中断中,通过依次打开两数码管并显示对应的数字,实现动态显示的效果。 ### 回答2: STM32是一款单片机,可以用来控制2数码管动态显示动态显示是指通过逐个刷新数码管的方式,实现多个数字在短时间内连续显示的效果。 首先,我们需要通过GPIO口将STM32与2数码管连接起来。数码管一般有共阳极和共阴极两种类型,接法有所不同,需要根据具体的数码管型号选择对应的接线方式。 接下来,我们可以使用TIM定时器来控制刷新数码管的频率。定时器可以设置一个合适的重装载值和预分频系数,以控制刷新的速度。当定时器溢出时,我们可以在中断服务函数中进行数码管的切换。 在每次刷新数码管时,我们可以将待显示的数字通过移操作分别放入控制数码管的GPIO端口中。为了实现动态显示,我们可以通过不同的刷新频率,快速切换数码管的显示内容,从而让多个数字在短时间内轮流显示。 需要注意的是,刷新速度过快可能会导致人眼无法看清显示的数字。因此,我们可以设置一个适当的刷新速度,既能保证数字的流畅切换,又不至于造成观察上的困扰。 总结一下,STM32可以通过GPIO口控制2数码管动态显示。通过合适的接线方式、定时器的设置和中断服务函数的编写,我们可以实现多个数字在短时间内连续显示的效果。动态显示可以应用在各种计时、计数和时钟等场景中。 ### 回答3: 要实现STM32单片机2数码管动态显示,首先需要连接2数码管STM32单片机的GPIO口。假设数码管的共阴极接地,我们可以将对应的7段LED结构接到STM32的GPIO输出端口上。接下来可以按照以下逻辑进行动态显示: 1.定义一个数码管显示的字符数组,包含0到9以及空格的对应显示码。 2.初始化GPIO口的状态,将数码管的每个引脚设置为输出模式。 3.创建一个循环,不断进行数码管动态显示。 4.在每次循环中,先确定显示的数。例如,先将第一数码管设置为低电平,第二数码管设置为高电平。 5.根据当前数和要显示的数字,从字符数组中获取对应的显示码。 6.根据显示码,逐地控制数码管的每个引脚的状态,设置为对应的高或低电平。这样就能够实现数码管显示该数字。 7.延时一段时间,以使数字在数码管上显示出来。可以使用延时函数或者定时器来实现。 8.重复步骤4至7,将两数字分别显示在数码管的两个上,实现动态显示效果。 通过以上步骤,我们就可以实现STM32单片机2数码管动态显示了。不断循环执行这个过程,就能够实现多个数字的动态展示。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值