利用点阵实现滚动屏数字显示
时间: 2023-12-21 13:05:38 浏览: 39
要实现点阵的滚动屏数字显示,可以采用以下步骤:
1. 定义一个变量来存储要显示的数字,将其初始化为一个较大的值,以保证点阵显示屏上的数字足够长。
2. 将点阵的各个LED灯与控制它们的GPIO口相连,将这些GPIO口设置为输出模式,并根据需要将它们的输出电平设置为高电平或低电平,从而控制点阵的显示效果。
3. 在程序中循环执行以下操作,以实现数字的滚动屏显示:
a. 将要显示的数字通过一定的算法转换为对应的数码管亮灭状态。
b. 将转换后的数码管亮灭状态存储在一个数组中,数组的长度应该等于点阵显示屏的长度。
c. 将数组中的元素依次移位,并通过控制GPIO口的电平来实现数字的滚动屏显示。
d. 延时一段时间,用于控制滚动屏的速度。
下面是一个示例代码,用于实现一个滚动屏数字显示:
```c
#include "stm32f4xx.h"
// 数码管亮灭状态定义
#define NUM_0 0x3F
#define NUM_1 0x06
#define NUM_2 0x5B
#define NUM_3 0x4F
#define NUM_4 0x66
#define NUM_5 0x6D
#define NUM_6 0x7D
#define NUM_7 0x07
#define NUM_8 0x7F
#define NUM_9 0x6F
// 数码管GPIO口定义
#define LED_A GPIO_Pin_0
#define LED_B GPIO_Pin_1
#define LED_C GPIO_Pin_2
#define LED_D GPIO_Pin_3
#define LED_E GPIO_Pin_4
#define LED_F GPIO_Pin_5
#define LED_G GPIO_Pin_6
#define LED_DP GPIO_Pin_7
#define LED_COM1 GPIO_Pin_8
#define LED_COM2 GPIO_Pin_9
// 数字定义
uint16_t num = 1234;
// 数码管亮灭状态数组
uint8_t led[10] = {NUM_0, NUM_1, NUM_2, NUM_3, NUM_4, NUM_5, NUM_6, NUM_7, NUM_8, NUM_9};
// 数码管GPIO口数组
GPIO_TypeDef* LED_PORT[10] = {
GPIOE, GPIOE, GPIOE, GPIOE, GPIOE, GPIOE, GPIOE, GPIOE, GPIOE, GPIOE
};
uint16_t LED_PIN[10] = {
LED_A, LED_B, LED_C, LED_D, LED_E, LED_F, LED_G, LED_DP, LED_COM1, LED_COM2
};
// 数码管亮灭状态数组
uint8_t led_num[4];
// 数码管显示函数
void LED_Display(uint8_t* led_num)
{
uint8_t i, j;
for(i = 0; i < 4; i++)
{
uint8_t led_val = led[led_num[i]];
for(j = 0; j < 8; j++)
{
if(led_val & (0x01 << j))
GPIO_SetBits(LED_PORT[j], LED_PIN[i * 8 + j]);
else
GPIO_ResetBits(LED_PORT[j], LED_PIN[i * 8 + j]);
}
}
}
int main(void)
{
// 初始化GPIO口
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
GPIO_InitStruct.GPIO_Pin = LED_A | LED_B | LED_C | LED_D | LED_E | LED_F | LED_G | LED_DP | LED_COM1 | LED_COM2;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOE, &GPIO_InitStruct);
// 循环显示数字
while(1)
{
// 将数字转换为数码管亮灭状态
led_num[0] = num / 1000;
led_num[1] = (num % 1000) / 100;
led_num[2] = (num % 100) / 10;
led_num[3] = num % 10;
// 数码管滚动显示
uint8_t i, j;
for(i = 0; i < 4 * 8; i++)
{
for(j = 0; j < 4; j++)
{
if(i >= j * 8 && i < (j + 1) * 8)
continue;
GPIO_ResetBits(GPIOE, LED_PIN[j * 8 + i % 8]);
}
LED_Display(&led_num[i / 8]);
for(j = 0; j < 4; j++)
{
if(i >= j * 8 && i < (j + 1) * 8)
continue;
GPIO_SetBits(GPIOE, LED_PIN[j * 8 + i % 8]);
}
for(j = 0; j < 500; j++);
}
}
}
```
这个示例程序使用了共阴数码管,将数码管的各个LED灯分别与控制它们的GPIO口相连,并通过控制GPIO口的电平来实现数字的滚动屏显示。程序每次循环都会将数字转换为对应的数码管亮灭状态,并通过控制GPIO口的电平来实现数字的滚动屏显示。在滚动屏显示过程中,程序将数码管亮灭状态存储在一个数组中,并通过移位的方式实现滚动屏效果。为了控制滚动屏速度,程序在移位之后进行了一定的延时。