记录STM32F103C8T6驱动MAX7219八位数码管的一些坑

使用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]);
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值