在stm32中控制三位共阴极数码管的代码
时间: 2024-12-13 15:27:50 浏览: 15
在STM32中控制三位共阴极数码管,通常会使用GPIO作为数据线,SPI或者I2C接口来驱动74HC595或其他类似的8位移位寄存器来扩展IO口。以下是一个基本的示例代码片段,假设使用的是GPIO和8位寄存器的方式:
```c
#include "stm32f10x.h" // 引入STM32 HAL库
// 定义数码管的GPIO端口和管脚
#define LCD_PORT GPIOA
#define LCD_DB7 GPIO_Pin_0
#define LCD_DB6 GPIO_Pin_1
#define LCD_DB5 GPIO_Pin_2
#define LCD_DB4 GPIO_Pin_3
#define LCD_DB3 GPIO_Pin_4
#define LCD_DB2 GPIO_Pin_5
#define LCD_DB1 GPIO_Pin_6
#define LCD_DB0 GPIO_Pin_7
// 初始化函数
void LCD_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 启动GPIOA时钟
GPIO_InitStructure.GPIO_Pin = LCD_DB7 | LCD_DB6 | LCD_DB5 | LCD_DB4 | LCD_DB3 | LCD_DB2 | LCD_DB1 | LCD_DB0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 输出推挽模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_PORT, &GPIO_InitStructure);
}
// 设置数码管显示数字
void LCD_DisplayDigit(uint8_t digit) {
uint8_t data;
// 清零
for (int i = 0; i < 8; i++) {
if (!(digit & (1 << i))) {
LCD_PORT->ODR &= ~(1 << i);
} else {
LCD_PORT->ODR |= (1 << i);
}
}
// 写入74HC595的输入端
data = digit << 1; // 右移一位,加上最低位的高电平
GPIOA->ODR = ~data; // 通过GPIOA将数据反相后送到74HC595的D引脚
Delay_us(1); // 稍微延时,让信号稳定
}
// 数码管清零
void LCD_Clear(void) {
LCD_PORT->ODR = 0xFF; // 所有位都置低
}
// 需要的延迟函数
void Delay_us(uint16_t us) {
for (uint16_t i = 0; i < us; i++);
}
// 示例主函数
int main(void) {
LCD_Init();
LCD_Clear(); // 显示清除
// 设置数码管显示0~9
for (uint8_t digit = 0; digit <= 9; digit++) {
LCD_DisplayDigit(digit);
Delay_ms(200); // 每个数字停留一段时间
}
while (1); // 无限循环,程序不断运行
}
阅读全文