stm32驱动tm1650显示4位共阴数码管
时间: 2024-02-17 09:37:23 浏览: 131
TM1650是一种常用的驱动4位共阴数码管的芯片,可以通过STM32的I2C接口进行控制。下面是一个简单的代码示例:
```c
#include "stm32f10x.h"
#include "tm1650.h"
void TM1650_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
/* 使能GPIO和I2C时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
/* 配置PB6和PB7为复用推挽输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* 配置I2C参数 */
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_Init(I2C1, &I2C_InitStructure);
/* 使能I2C */
I2C_Cmd(I2C1, ENABLE);
}
void TM1650_WriteByte(uint8_t addr, uint8_t data)
{
/* 等待I2C空闲 */
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
/* 发送START信号 */
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* 发送从设备地址和写模式 */
I2C_Send7bitAddress(I2C1, addr, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* 发送数据 */
I2C_SendData(I2C1, data);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* 发送STOP信号 */
I2C_GenerateSTOP(I2C1, ENABLE);
}
void TM1650_SetDigit(uint8_t digit, uint8_t value)
{
uint8_t data = 0;
/* 对数码管值进行转换 */
switch(value)
{
case 0:
data = 0x3f;
break;
case 1:
data = 0x06;
break;
case 2:
data = 0x5b;
break;
case 3:
data = 0x4f;
break;
case 4:
data = 0x66;
break;
case 5:
data = 0x6d;
break;
case 6:
data = 0x7d;
break;
case 7:
data = 0x07;
break;
case 8:
data = 0x7f;
break;
case 9:
data = 0x6f;
break;
default:
data = 0x00;
break;
}
/* 设置数码管值 */
TM1650_WriteByte(TM1650_ADDR, (digit << 1) | 0xc0);
TM1650_WriteByte(TM1650_ADDR, data);
}
void TM1650_SetNumber(uint16_t num)
{
uint8_t digits[4];
uint8_t i;
/* 将数字拆分成每一位 */
digits[0] = num / 1000;
digits[1] = (num / 100) % 10;
digits[2] = (num / 10) % 10;
digits[3] = num % 10;
/* 设置每一位数码管的值 */
for(i = 0; i < 4; i++)
{
TM1650_SetDigit(i, digits[i]);
}
}
int main(void)
{
/* 初始化TM1650 */
TM1650_Init();
/* 显示数字1234 */
TM1650_SetNumber(1234);
while(1);
return 0;
}
```
需要注意的是,TM1650的I2C地址为0x24,因此在进行数据传输时需要使用该地址。此外,由于TM1650的数据传输方式为按位传输,因此在设置每一位数码管的值时需要将地址和数据分别发送两次。
阅读全文