打印
[活动专区]

【AT-START-L021测评】+串行数码管显示驱动

[复制链接]
47|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2024-11-27 17:07 编辑

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

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

对所用引脚的配置函数为:
void smg_config(void)
{
  gpio_init_type gpio_init_struct;
  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  gpio_default_para_init(&gpio_init_struct);
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  gpio_init_struct.gpio_pins = GPIO_PINS_5|GPIO_PINS_6|GPIO_PINS_7;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(GPIOA, &gpio_init_struct);
}

为便于向串行数码管显示模块输出高低电平,所定义的语句为:
#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,故为它配置了一个串行发送字节数据的函数,其内容为:
void Write_Max7219_byte(char DATA)
{
  char i;
  CS_SetLow;
  delay_us(10);
  for(i=8;i>=1;i--)
  {
      CLK_SetLow;
      if(DATA&0x80)
         DIN_SetHigh;
      else
         DIN_SetLow;
      delay_us(10);
      DATA=(char)(DATA<<1);
      CLK_SetHigh;
      delay_us(10);
  }
}

以函数Write_Max7219_byte()为基础,向指定地址发送数据的函数为:
void Write_Max7219(char address,char dat)
{
  CS_SetLow;
  Write_Max7219_byte(address);
  Write_Max7219_byte(dat);
  CS_SetHigh;
}

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

要实现串行数码管显示模块的测试,相应的主程序为:
int main(void)
{
  system_clock_config();
  at32_board_init();
  smg_config();
  Init_MAX7219();
  Write_Max7219(1,1);
  Write_Max7219(2,2);
  Write_Max7219(3,3);
  Write_Max7219(4,4);
  Write_Max7219(5,5);
  Write_Max7219(6,6);
  Write_Max7219(7,7);
  Write_Max7219(8,8);
  while(1)
  {
    at32_led_toggle(LED2);
    delay_ms(200);
    at32_led_toggle(LED3);
    delay_ms(200);
    at32_led_toggle(LED4);
    delay_ms(200);
  }
}

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

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

使用特权

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

本版积分规则

457

主题

2758

帖子

38

粉丝