通常的数码管显示是靠刷新来维持显示的,而有一种数码管显示模块是以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);
- }
- }
经初步检测,该数码管显示模块的显示效果还是很不错的,适于替代常规的数码管显示模式。
|