写一段利用STM32控制TM1640点亮数码管的程序
时间: 2024-06-02 18:13:36 浏览: 69
#include "stm32f10x.h"
#define CLK_PIN GPIO_Pin_5
#define DATA_PIN GPIO_Pin_7
#define CLK_PORT GPIOA
#define DATA_PORT GPIOA
void TM1640_Init(void);
void TM1640_SendByte(uint8_t data);
void TM1640_Display(uint8_t *data);
int main(void)
{
uint8_t num[4] = {0x0F, 0x0F, 0x0F, 0x0F}; // 初始化数码管为全暗
TM1640_Init(); // 初始化TM1640
while(1)
{
TM1640_Display(num); // 显示num数组中的数字
num[0]++; // 数字加1
if(num[0] > 9) // 如果数字大于9,则重置为0
{
num[0] = 0;
}
for(uint32_t i = 0; i < 500000; i++); // 延时一段时间,使数字变化有可见效果
}
}
void TM1640_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = CLK_PIN | DATA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(CLK_PORT, CLK_PIN);
GPIO_SetBits(DATA_PORT, DATA_PIN);
}
void TM1640_SendByte(uint8_t data)
{
for(uint8_t i = 0; i < 8; i++)
{
GPIO_ResetBits(CLK_PORT, CLK_PIN); // 下降沿时将CLK拉低
if(data & 0x01) // 发送数据的最低位
{
GPIO_SetBits(DATA_PORT, DATA_PIN);
}
else
{
GPIO_ResetBits(DATA_PORT, DATA_PIN);
}
data >>= 1; // 准备发送下一位数据
GPIO_SetBits(CLK_PORT, CLK_PIN); // 上升沿时将CLK拉高
}
}
void TM1640_Display(uint8_t *data)
{
TM1640_SendByte(0x44); // 固定命令字
TM1640_SendByte(0xC0); // 设置起始地址为0xC0
for(uint8_t i = 0; i < 4; i++)
{
TM1640_SendByte(data[i]); // 发送数据
}
TM1640_SendByte(0x8F); // 固定命令字
}
阅读全文