打印
[活动]

【开发板型号测评】APM32F411点亮数码管功能

[复制链接]
843|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 虚幻的是灵魂 于 2024-5-17 08:38 编辑

#申请原创# 数码管结构共阴与共阳
共阳数码管是指将所有发光二极管的阳极接到一起,形成公共阳极(COM)的数码管,共阳数码管在应用的时候,应该将 COM 端口接到正极,当某一段发光二极管的阴极为低电平的时候,相对应的段就点亮,当某一字段的阴极为高电平的时候,相对应段就不亮。  
1位数码管



2位数码管



4位数码管



移位寄存器
74HC595 是一款 8 位 CMOS 移位寄存器。8 位并行输出端口为可控的三态输出,一 个串行输入端口,可以实现多级芯片串行控制,组成 8n 位(n 为芯片数量)并行输出  。
优点:通过逻辑操作来控制LED的状态,少量的引脚控制更多的状态。
了解了数码管的基本原理后,就可以开发了。这里使用的是74HC595N移位芯片。

代码如下:
main.c
#include "main.h"
#include "Board.h"
#include "NIXIE.h"
#include "systick.h"


int main(void)
{
NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_2);
    systick_config();
    /* Initialization */
          NIXIE_init();
        
    while(1)
    {                 
                        NIXIE_display(0,0);
                        delay_1ms(1);
                        NIXIE_display(1,1);
                        delay_1ms(1);
                        NIXIE_display(2,2);
                        delay_1ms(1);
                        NIXIE_display(3,3);
                        delay_1ms(1);
                        NIXIE_display(4,4);
                        delay_1ms(1);
                        NIXIE_display(5,5);
                        delay_1ms(1);
                        NIXIE_display(6,6);
                        delay_1ms(1);
                        NIXIE_display(7,7);
                        delay_1ms(1);
                        NIXIE_display(8,8);
                        delay_1ms(1);

    }
}



NIXIE.h
#ifndef __NIXIE_H__
#define __NIXIE_H__

#include "Board.h"

#ifndef u8
#define u8 uint8_t
#endif

#ifndef u16
#define u16 uint16_t
#endif

#ifndef u32
#define u32 uint32_t
#endif

#define NIXIE_DI_RCU                RCM_AHB1_PERIPH_GPIOA
#define NIXIE_DI_PORT                GPIOA
#define NIXIE_DI_PIN                GPIO_PIN_1

#define NIXIE_SCK_RCU                RCM_AHB1_PERIPH_GPIOC
#define NIXIE_SCK_PORT        GPIOC
#define NIXIE_SCK_PIN   GPIO_PIN_1

#define NIXIE_RCK_RCU                RCM_AHB1_PERIPH_GPIOA
#define NIXIE_RCK_PORT        GPIOA
#define NIXIE_RCK_PIN                GPIO_PIN_2

#define        NIXIE_DI(bit)                GPIO_WriteBitValue(NIXIE_DI_PORT, NIXIE_DI_PIN, bit ? BIT_SET : BIT_RESET)        
#define        NIXIE_SCK(bit)        GPIO_WriteBitValue(NIXIE_SCK_PORT, NIXIE_SCK_PIN, bit ? BIT_SET : BIT_RESET)        
#define        NIXIE_RCK(bit)        GPIO_WriteBitValue(NIXIE_RCK_PORT, NIXIE_RCK_PIN, bit ? BIT_SET : BIT_RESET)        


#define NIXIE_GPIO_CONFIG(gpio_rcu, gpio_port, gpio_pin,configStruct)                                     \
        RCM_EnableAHB1PeriphClock(gpio_rcu);                                         \
        GPIO_ConfigStructInit(&configStruct);                                        \
        configStruct.pin = gpio_pin;                                                 \
        configStruct.mode = GPIO_MODE_OUT;                                           \
        configStruct.speed = GPIO_SPEED_50MHz;                                       \
        GPIO_Config(gpio_port, &configStruct);                                        \

void NIXIE_init(void);
void NIXIE_show(u8 a_dat, u8 b_idx);
void NIXIE_display(u8 num, u8 id);

#endif




NIXIE.c
#include "NIXIE.h"
#include <stdio.h>

#define GET_BIT_VAL(byte, pos)        (byte & (1 << pos))

#define NOP_TIME() __NOP();__NOP()

#define RCK_ACTION()         \
                NIXIE_RCK(0);                \
                NOP_TIME();                                \
                NIXIE_RCK(1);                \
                NOP_TIME();

u8 LED_TABLE[] =
{
        // 0         1         2        -> 9        
        0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
        // 0. 1. 2. -> 9.        
  0x64,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
        // . -                                       
        0x7F, 0xBF,
        // AbCdEFHJLPqU        
        0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89,0xF1,0xC7,0x8C,0x98,0xC1
};

void NIXIE_init(){
        GPIO_Config_T  configStruct;  
        // NIXIE_DI
        NIXIE_GPIO_CONFIG(NIXIE_DI_RCU, NIXIE_DI_PORT, NIXIE_DI_PIN,configStruct);
        // NIXIE_SCK
        NIXIE_GPIO_CONFIG(NIXIE_SCK_RCU, NIXIE_SCK_PORT, NIXIE_SCK_PIN,configStruct);
        // NIXIE_RCK
        NIXIE_GPIO_CONFIG(NIXIE_RCK_RCU, NIXIE_RCK_PORT,NIXIE_RCK_PIN ,configStruct);

}

static void NIXIE_out(u8 dat){
                int8_t i;
                for(i = 7; i >= 0; i--){
                        NIXIE_DI(GET_BIT_VAL(dat, i));
                        NIXIE_SCK(0);
                        NOP_TIME();
                        NIXIE_SCK(1);
                        NOP_TIME();
                }
}

void NIXIE_display(u8 num, u8 id){
        u8 a_dat = LED_TABLE[num];        // 0001 0010        
        u8 b_idx = 1 << id;                                        // 0010 0000               
        NIXIE_show(a_dat, b_idx);
}

void NIXIE_show(u8 a_dat, u8 b_idx){
                NIXIE_out(a_dat);
                NIXIE_out(b_idx);
                RCK_ACTION();
}

效果如下:


https://m.youku.com/mid_video/id_XNjM5NzE5MDI4MA==.html?scene=short&playMode=pugv&sharekey=531f61f73a5e258d15ad9abeae5c593d9


apm32f411_use.zip

3.89 MB, 阅读权限: 50

使用特权

评论回复
沙发
szt1993| | 2024-5-23 17:51 | 只看该作者
数码管其实是IO的操作过程

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

115

帖子

1

粉丝