【GD32L233C-START 评测】-四、GD32驱动MAX7219数码管显示
[复制链接]
手头刚好找到一款MAX7219的数码管,如图
就拿GD32来测试下,用demo例程的GPIO_LED例程修改下。复制整个GPIO_LED目录,改个名称,然后在
中改下名称,查看下目标各项设置是否正确。GD32的板子上焊上排针,然后,用杜邦线连接好MAX7219
其中A2--DIN
A3--LD
A4--CLK
并记录在max7219.h中
整个max7219.h文件如下
#ifndef MAX7219_H
#define MAX7219_H
//引脚设置
#define MAX7219_DIN_PORT GPIOA
#define MAX7219_DIN_PIN GPIO_PIN_2
#define MAX7219_LD_PORT GPIOA
#define MAX7219_LD_PIN GPIO_PIN_3
#define MAX7219_CLK_PORT GPIOA
#define MAX7219_CLK_PIN GPIO_PIN_4
#define MAX7219_PERIPH_CLK RCU_GPIOA
#define MAX7219DIN_L() gpio_bit_reset( MAX7219_DIN_PORT, MAX7219_DIN_PIN )
#define MAX7219DIN_H() gpio_bit_set( MAX7219_DIN_PORT, MAX7219_DIN_PIN )
#define MAX7219CLK_L() gpio_bit_reset( MAX7219_CLK_PORT, MAX7219_CLK_PIN )
#define MAX7219CLK_H() gpio_bit_set( MAX7219_CLK_PORT, MAX7219_CLK_PIN )
#define MAX7219LD_L() gpio_bit_reset( MAX7219_LD_PORT, MAX7219_LD_PIN )
#define MAX7219LD_H() gpio_bit_set( MAX7219_LD_PORT, MAX7219_LD_PIN )
//配置设置
//显示亮度,取值范围0~f
#define Display_Level 0x07
//译码方式,0x00为不译码,0xff为译码
#define Display_Encode 0x00
//操作方式,0x00为低功耗模式,0x01为正常操作模式
#define Display_Power 0x01
//显示状态,0x00为正常显示,0x01为显示测试
#define Display_Mode 0x00
//8位扫描显示,取值范围0x01~0x07
#define Display_Addr 0x07
void MAX7219_Init(void);
void max7219_config(void);
void w_max7219(unsigned char addr, unsigned char wdata);
void Display_7219(unsigned char addr, unsigned char digtal);
#endif
max7219.c文件如下
#include "max7219.h"
#include "systick.h"
#include "gd32l23x.h"
unsigned char code_disp_table[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,
0x77,0x1f,0x4e,0x3d,0x4f,0x47}; //非译码方式时的共阴数码管显示编码,0~9,A~F
void Display_7219(unsigned char addr, unsigned char digtal)
{
w_max7219(addr & 0x0F, code_disp_table[digtal & 0x0F]);
}
void MAX7219_Init(void)
{
rcu_periph_clock_enable(MAX7219_PERIPH_CLK);
/* configure MAX7219 GPIO pin */
gpio_mode_set(MAX7219_DIN_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, MAX7219_DIN_PIN);
gpio_output_options_set(MAX7219_DIN_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, MAX7219_DIN_PIN);
gpio_mode_set(MAX7219_LD_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, MAX7219_LD_PIN);
gpio_output_options_set(MAX7219_LD_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, MAX7219_LD_PIN);
gpio_mode_set(MAX7219_CLK_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, MAX7219_CLK_PIN);
gpio_output_options_set(MAX7219_CLK_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, MAX7219_CLK_PIN);
/* set MAX7219 GPIO pin */
MAX7219DIN_H();
MAX7219CLK_H();
MAX7219LD_H();
delay_1ms(2);
max7219_config();
}
void max7219_config(void)
{
w_max7219(0x0a,Display_Level); //显示亮度,取值范围0~f
w_max7219(0x0b,Display_Addr); //8位扫描显示,取值范围0x01~0x07
w_max7219(0x09,Display_Encode); //译码方式,0x00为不译码,0xff为译码
w_max7219(0x0c,Display_Power); //操作方式,0x00为低功耗模式,0x01为正常操作模式
w_max7219(0x0f,Display_Mode); //显示状态,0x00为正常显示,0x01为显示测试
delay_1ms(2);
}
/*********************************************************************************************
函数名称:w_max7219
函数功能:向MAX7219写入数据
入口参数:addr MAX7219内部寄存器地址,wdata 写入内部寄存器的操作数值
出口参数:
其 它:
*********************************************************************************************/
void w_max7219(unsigned char addr, unsigned char wdata)
{
unsigned char temp, i=1,j,k;
MAX7219LD_L();
while(i<16)
{
if(i<8) temp=addr; //先写入MAX7219内部寄存器地址,再向内部寄存器写入操作数值
else temp=wdata;
for(j=0;j<8;j++)
{
MAX7219CLK_L();
if((temp&0x80)==0x80) MAX7219DIN_H(); //先发送数据的最高位
else MAX7219DIN_L();
for(k=5;k>0;k--); //时钟频率高的单片机需曾加延时时间,此处为12MHz
MAX7219CLK_H();
for(k=5;k>0;k--);
temp <<= 1;
}
i+=8;
}
MAX7219LD_H();
}
然后修改main.c文件,加入测试代码
编译后下载至开发板,运行效果如下
|