[活动专区] 【AT-START-F407测评】+数码管的驱动显示

[复制链接]
772|0
 楼主| jinglixixi 发表于 2021-1-28 11:36 | 显示全部楼层 |阅读模式
通常的数码管显示是靠刷新来维持显示的,而有一种数码管显示模块是以Max7219为驱动芯片的,以串并转换的方式工作的。该显示模块能同时显示8位数字,相较于常规的数码管显示具有无需刷新维持的优势,且占用的I/O资源比较少,其显示效果如下图所示。
                              
1.jpg
数码管显示效果
数码管与MCU的连接关系如下:
CLK---PB9
DIN ---PB8
CS ---PB10
为便于输出高低电平的需要,所做的语句定义如下:
#define SMG_CLK_Set()   GPIOB->BSRE = GPIO_Pins_9
#define SMG_CLK_Clr()   GPIOB->BRE = GPIO_Pins_9
#define SMG_DIN_Set()   GPIOB->BSRE = GPIO_Pins_8
#define SMG_DIN_Clr()   GPIOB->BRE = GPIO_Pins_8
#define SMG_CS_Set()    GPIOB->BSRE = GPIO_Pins_10
#define SMG_CS_Clr()    GPIOB->BRE = GPIO_Pins_10
配置引脚为输出功能的函数为:
  1. void  AT_eval_smg_init(void)
  2. {
  3. GPIO_InitType GPIO_InitStructure;
  4. RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB, ENABLE);
  5. GPIO_StructInit(&GPIO_InitStructure);
  6. GPIO_InitStructure.GPIO_Pins = GPIO_Pins_10|GPIO_Pins_8|GPIO_Pins_9;
  7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
  8. GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;
  9. GPIO_Init(GPIOB, &GPIO_InitStructure);
  10. SMG_CLK_Set();
  11. SMG_DIN_Set();
  12. SMG_CS_Set();
  13. }

MAX7219的初始化函数为:
  1. void Init_MAX7219(void)
  2. {
  3. Write_Max7219(0x09, 0xff);
  4. Write_Max7219(0x0a, 0x03);
  5. Write_Max7219(0x0b, 0x07);
  6. Write_Max7219(0x0c, 0x01);
  7. Write_Max7219(0x0f, 0x01);
  8. }

向MAX7219写入字节数据的函数为:
  1. void Write_Max7219_byte(uchar DATA)
  2. {
  3. uchar i;   
  4. SMG_CS_Clr();
  5. for(i=8;i>=1;i--)
  6. {
  7. SMG_CLK_Clr();
  8. if(DATA&0x80)
  9. {
  10. SMG_DIN_Set();
  11. }
  12. else
  13. {
  14. SMG_DIN_Clr();
  15. }
  16. DATA=DATA<<1;
  17. SMG_CLK_Set();
  18. }
  19. }

实现显示效果的主程序为:
  1. int main(void)
  2. {
  3. AT32_Board_Init();
  4. AT_eval_smg_init();
  5. Init_MAX7219();
  6. Delay_ms(2000);
  7. Write_Max7219(0x0f,0x00);
  8. Write_Max7219(1,8);
  9. Write_Max7219(2,7);
  10. Write_Max7219(3,6);
  11. Write_Max7219(4,5);
  12. Write_Max7219(5,4);
  13. Write_Max7219(6,3);
  14. Write_Max7219(7,2);
  15. Write_Max7219(8,1);   
  16. for(;;)
  17. {
  18. AT32_LEDn_Toggle(LED2);
  19. Delay_ms(200);
  20. AT32_LEDn_Toggle(LED3);
  21. Delay_ms(200);
  22. AT32_LEDn_Toggle(LED4);
  23. Delay_ms(200);
  24. }
  25. }

经初步检测,该数码管显示模块的显示效果还是很不错的,适于替代常规的数码管显示模式。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

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