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

[复制链接]
1294|1
 楼主| 虚幻的是灵魂 发表于 2024-5-16 13:51 | 显示全部楼层 |阅读模式
本帖最后由 虚幻的是灵魂 于 2024-5-17 08:38 编辑

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

4位寄存器

4位寄存器
4.png


2位数码管

2位寄存器

2位寄存器
2.png


4位数码管

1位寄存器

1位寄存器



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

代码如下:
main.c
  1. #include "main.h"
  2. #include "Board.h"
  3. #include "NIXIE.h"
  4. #include "systick.h"


  5. int main(void)
  6. {
  7. NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_2);
  8.     systick_config();
  9.     /* Initialization */
  10.           NIXIE_init();
  11.         
  12.     while(1)
  13.     {                 
  14.                         NIXIE_display(0,0);
  15.                         delay_1ms(1);
  16.                         NIXIE_display(1,1);
  17.                         delay_1ms(1);
  18.                         NIXIE_display(2,2);
  19.                         delay_1ms(1);
  20.                         NIXIE_display(3,3);
  21.                         delay_1ms(1);
  22.                         NIXIE_display(4,4);
  23.                         delay_1ms(1);
  24.                         NIXIE_display(5,5);
  25.                         delay_1ms(1);
  26.                         NIXIE_display(6,6);
  27.                         delay_1ms(1);
  28.                         NIXIE_display(7,7);
  29.                         delay_1ms(1);
  30.                         NIXIE_display(8,8);
  31.                         delay_1ms(1);

  32.     }
  33. }



NIXIE.h
  1. #ifndef __NIXIE_H__
  2. #define __NIXIE_H__

  3. #include "Board.h"

  4. #ifndef u8
  5. #define u8 uint8_t
  6. #endif

  7. #ifndef u16
  8. #define u16 uint16_t
  9. #endif

  10. #ifndef u32
  11. #define u32 uint32_t
  12. #endif

  13. #define NIXIE_DI_RCU                RCM_AHB1_PERIPH_GPIOA
  14. #define NIXIE_DI_PORT                GPIOA
  15. #define NIXIE_DI_PIN                GPIO_PIN_1

  16. #define NIXIE_SCK_RCU                RCM_AHB1_PERIPH_GPIOC
  17. #define NIXIE_SCK_PORT        GPIOC
  18. #define NIXIE_SCK_PIN   GPIO_PIN_1

  19. #define NIXIE_RCK_RCU                RCM_AHB1_PERIPH_GPIOA
  20. #define NIXIE_RCK_PORT        GPIOA
  21. #define NIXIE_RCK_PIN                GPIO_PIN_2

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


  25. #define NIXIE_GPIO_CONFIG(gpio_rcu, gpio_port, gpio_pin,configStruct)                                     \
  26.         RCM_EnableAHB1PeriphClock(gpio_rcu);                                         \
  27.         GPIO_ConfigStructInit(&configStruct);                                        \
  28.         configStruct.pin = gpio_pin;                                                 \
  29.         configStruct.mode = GPIO_MODE_OUT;                                           \
  30.         configStruct.speed = GPIO_SPEED_50MHz;                                       \
  31.         GPIO_Config(gpio_port, &configStruct);                                        \

  32. void NIXIE_init(void);
  33. void NIXIE_show(u8 a_dat, u8 b_idx);
  34. void NIXIE_display(u8 num, u8 id);

  35. #endif




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

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

  4. #define NOP_TIME() __NOP();__NOP()

  5. #define RCK_ACTION()         \
  6.                 NIXIE_RCK(0);                \
  7.                 NOP_TIME();                                \
  8.                 NIXIE_RCK(1);                \
  9.                 NOP_TIME();

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

  21. void NIXIE_init(){
  22.         GPIO_Config_T  configStruct;  
  23.         // NIXIE_DI
  24.         NIXIE_GPIO_CONFIG(NIXIE_DI_RCU, NIXIE_DI_PORT, NIXIE_DI_PIN,configStruct);
  25.         // NIXIE_SCK
  26.         NIXIE_GPIO_CONFIG(NIXIE_SCK_RCU, NIXIE_SCK_PORT, NIXIE_SCK_PIN,configStruct);
  27.         // NIXIE_RCK
  28.         NIXIE_GPIO_CONFIG(NIXIE_RCK_RCU, NIXIE_RCK_PORT,NIXIE_RCK_PIN ,configStruct);

  29. }

  30. static void NIXIE_out(u8 dat){
  31.                 int8_t i;
  32.                 for(i = 7; i >= 0; i--){
  33.                         NIXIE_DI(GET_BIT_VAL(dat, i));
  34.                         NIXIE_SCK(0);
  35.                         NOP_TIME();
  36.                         NIXIE_SCK(1);
  37.                         NOP_TIME();
  38.                 }
  39. }

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

  45. void NIXIE_show(u8 a_dat, u8 b_idx){
  46.                 NIXIE_out(a_dat);
  47.                 NIXIE_out(b_idx);
  48.                 RCK_ACTION();
  49. }

效果如下:
微信图片_20240516124926.jpg WeChat_20240515120344 (3).gif

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


apm32f411_use.zip

3.89 MB, 阅读权限: 50, 下载次数: 0

szt1993 发表于 2024-5-23 17:51 | 显示全部楼层
数码管其实是IO的操作过程
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

118

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部