通常的数码管显示是靠刷新来维持显示的,而有一种数码管显示模块是以Max7219为驱动芯片的,以串并转换的方式工作的。该显示模块能同时显示8位数字,相较于常规的数码管显示具有无需刷新维持的优势,且占用的I/O资源比较少,其显示效果如下图所示。 数码管显示效果 数码管与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 配置引脚为输出功能的函数为: void AT_eval_smg_init(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = GPIO_Pins_10|GPIO_Pins_8|GPIO_Pins_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
SMG_CLK_Set();
SMG_DIN_Set();
SMG_CS_Set();
}
MAX7219的初始化函数为: void Init_MAX7219(void)
{
Write_Max7219(0x09, 0xff);
Write_Max7219(0x0a, 0x03);
Write_Max7219(0x0b, 0x07);
Write_Max7219(0x0c, 0x01);
Write_Max7219(0x0f, 0x01);
}
向MAX7219写入字节数据的函数为: void Write_Max7219_byte(uchar DATA)
{
uchar i;
SMG_CS_Clr();
for(i=8;i>=1;i--)
{
SMG_CLK_Clr();
if(DATA&0x80)
{
SMG_DIN_Set();
}
else
{
SMG_DIN_Clr();
}
DATA=DATA<<1;
SMG_CLK_Set();
}
}
实现显示效果的主程序为: int main(void)
{
AT32_Board_Init();
AT_eval_smg_init();
Init_MAX7219();
Delay_ms(2000);
Write_Max7219(0x0f,0x00);
Write_Max7219(1,8);
Write_Max7219(2,7);
Write_Max7219(3,6);
Write_Max7219(4,5);
Write_Max7219(5,4);
Write_Max7219(6,3);
Write_Max7219(7,2);
Write_Max7219(8,1);
for(;;)
{
AT32_LEDn_Toggle(LED2);
Delay_ms(200);
AT32_LEDn_Toggle(LED3);
Delay_ms(200);
AT32_LEDn_Toggle(LED4);
Delay_ms(200);
}
}
经初步检测,该数码管显示模块的显示效果还是很不错的,适于替代常规的数码管显示模式。
|