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

[复制链接]
 楼主| jinglixixi 发表于 2024-11-27 17:04 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2024-11-27 17:07 编辑

这里选取的串行数码管显示模块以MAX7219为主控芯片,可显示8位数值,并支持级联使用。除电源外,它只需3个GPIO口,故十分节省引脚资源。
260336746dfb8d0c48.png
图1 串行数码管显示模块

该显示模块与开发板的连接关系为:
SCL---PA5
SDA---PA6
CS ---PA7

对所用引脚的配置函数为:
  1. void smg_config(void)
  2. {
  3.   gpio_init_type gpio_init_struct;
  4.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  5.   gpio_default_para_init(&gpio_init_struct);
  6.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  7.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  8.   gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  9.   gpio_init_struct.gpio_pins = GPIO_PINS_5|GPIO_PINS_6|GPIO_PINS_7;
  10.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  11.   gpio_init(GPIOA, &gpio_init_struct);
  12. }

为便于向串行数码管显示模块输出高低电平,所定义的语句为:
#define CLK_SetLow   gpio_bits_write(GPIOA,GPIO_PINS_5,FALSE)
#define CLK_SetHigh  gpio_bits_write(GPIOA,GPIO_PINS_5,TRUE)

#define DIN_SetLow   gpio_bits_write(GPIOA,GPIO_PINS_6,FALSE)
#define DIN_SetHigh  gpio_bits_write(GPIOA,GPIO_PINS_6,TRUE)

#define CS_SetLow    gpio_bits_write(GPIOA,GPIO_PINS_7,FALSE)
#define CS_SetHigh   gpio_bits_write(GPIOA,GPIO_PINS_7,TRUE)

由于该串行数码管显示模块所使用的关键芯片为MAX7219,故为它配置了一个串行发送字节数据的函数,其内容为:
  1. void Write_Max7219_byte(char DATA)
  2. {
  3.   char i;
  4.   CS_SetLow;
  5.   delay_us(10);
  6.   for(i=8;i>=1;i--)
  7.   {
  8.       CLK_SetLow;
  9.       if(DATA&0x80)
  10.          DIN_SetHigh;
  11.       else
  12.          DIN_SetLow;
  13.       delay_us(10);
  14.       DATA=(char)(DATA<<1);
  15.       CLK_SetHigh;
  16.       delay_us(10);
  17.   }
  18. }

以函数Write_Max7219_byte()为基础,向指定地址发送数据的函数为:
  1. void Write_Max7219(char address,char dat)
  2. {
  3.   CS_SetLow;
  4.   Write_Max7219_byte(address);
  5.   Write_Max7219_byte(dat);
  6.   CS_SetHigh;
  7. }

对于串行数码管显示模块,其初始化函数为:
  1. void Init_MAX7219(void)
  2. {
  3.    Write_Max7219(0x09,0xff);
  4.    Write_Max7219(0x0a,0x02);
  5.    Write_Max7219(0x0b,0x07);
  6.    Write_Max7219(0x0c,0x01);
  7.    Write_Max7219(0x0f,0x00);
  8. }

要实现串行数码管显示模块的测试,相应的主程序为:
  1. int main(void)
  2. {
  3.   system_clock_config();
  4.   at32_board_init();
  5.   smg_config();
  6.   Init_MAX7219();
  7.   Write_Max7219(1,1);
  8.   Write_Max7219(2,2);
  9.   Write_Max7219(3,3);
  10.   Write_Max7219(4,4);
  11.   Write_Max7219(5,5);
  12.   Write_Max7219(6,6);
  13.   Write_Max7219(7,7);
  14.   Write_Max7219(8,8);
  15.   while(1)
  16.   {
  17.     at32_led_toggle(LED2);
  18.     delay_ms(200);
  19.     at32_led_toggle(LED3);
  20.     delay_ms(200);
  21.     at32_led_toggle(LED4);
  22.     delay_ms(200);
  23.   }
  24. }

经程序编译与运行,其效果如图2所示。
60276746e130498cb.png
图2 显示效果图

这样,就实现了串行数码管模块的显示驱动,后面再有数值显示的需要就可以交它来完成。

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

本版积分规则

517

主题

2932

帖子

39

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