本帖最后由 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 显示效果图
这样,就实现了串行数码管模块的显示驱动,后面再有数值显示的需要就可以交它来完成。
|