概述
使用STM32F103C8T6驱动MAX7219八位数码管是非常常用的方法,这样可以显示数据在数码管,实现类似温度控制,时间显示,计数之类的很多运用。
驱动的步骤如下:
1.开启SPI1接口,2线够了,因为只要输出给外设,16bit 地址在高位,数据在低位,传输的bit也是高位在前,使用PA5、PA7管脚,刚好PA6可以用作CS:
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES; // 2线
hspi1.Init.DataSize = SPI_DATASIZE_16BIT; //16bit地址在高位,数据在低位
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; //速度9M以内
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; //高位在前
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
2.开启PA6为 CS脚,一定要注意 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //(这里千万要注意必须是PP驱动,绝对不能OD开漏,即使是使用的上拉也不行,就这一点让我差点崩溃了,因为在开漏情况下,用万用表测得的电压是1V多,不上不下,导致有时候显示正常,有时候怎么都不显示,原因找了很久啊,因为在波形显示的时候怎么看都是正常的状态):
GPIO_InitStruct.Pin = max7219cs_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //(这里千万要注意必须是PP驱动,绝对不能OD开漏,即使是使用的上拉也不行)
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(max7219cs_GPIO_Port, &GPIO_InitStruct);
3.地址数据发送代码:
void max7219_send(uint8_t address,uint8_t data)
{
uint16_t Transmit_buf = (0x00ff&data)|(0xff00&(address<<8));
HAL_GPIO_WritePin(max7219cs_GPIO_Port,max7219cs_Pin,GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1,(uint8_t*)&Transmit_buf,1,1000);
HAL_GPIO_WritePin(max7219cs_GPIO_Port,max7219cs_Pin,GPIO_PIN_SET);
for_delay_us(1);
}
4.初始化代码:
void Init_MAX7219(void)
{
max7219_send(0x09, 0xff); //译码方式:BCD译码
max7219_send(0x0a, 0x05); //亮度
max7219_send(0x0b, 0x07); //显示数码管数量
max7219_send(0x0c, 0x01); //断电模式0,显示模式1
max7219_send(0x0f, 0x00); //开始显示,1为测试,0为显示
}
5.在main的初始化:
HAL_Delay(100); //这里也是一个坑,不加的话上电可能不显示,复位显示正常,应该是上电等加电稳定后再驱动。
Init_MAX7219();
6.显示内容:
max7219_send(1,1);
max7219_send(2,i);
max7219_send(3,i);
max7219_send(4,i);
max7219_send(5,i);
max7219_send(6,i);
max7219_send(7,i);
max7219_send(8,8);
显示波形如下:
希望大家引以为戒,更加顺利的驱动小小的MAX7219
7.如果不使用BCD编码,也可以直接显示:
uint8_t max7219[20] = {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff,0x00}; //A,B,C,D,E,F,P,U,È«ÁÁ,È«Ãð};
改显示方式:
max7219_send(0x09, 0x00); //译码方式:直接显示
max7219_send(1,max7219[0]|0x80); //显示小数点
max7219_send(2,max7219[1]|0x80); //显示小数点
max7219_send(3,max7219[2]);
max7219_send(4,max7219[3]);
max7219_send(5,max7219[4]);
max7219_send(6,max7219[5]);
max7219_send(7,max7219[6]);
max7219_send(8,max7219[7]);
最后
以上就是平常砖头为你收集整理的记录STM32F103C8T6驱动MAX7219八位数码管的一些坑的全部内容,希望文章能够帮你解决记录STM32F103C8T6驱动MAX7219八位数码管的一些坑所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复