AT32 MCU中74HC138作为位选74HC595段选个实现联合驱动数码管代码编写
时间: 2024-10-23 10:02:48 浏览: 93
74HC595驱动8段数码管的程序
5星 · 资源好评率100%
AT32 MCU (Arm Cortex-M系列单片机) 中,使用74HC138作为位选器和74HC595作为段选器可以联合驱动共阴极或多阳极的数码管显示。以下是基本的步骤和代码示例:
1. **硬件连接**:
- 将74HC138的输出与74HC595的数据输入端相连,用于控制74HC595的不同段。
- 74HC138的选通信号(S0-S7)分别对应数码管的每一位,由MCU控制其高电平选出相应位。
- 74HC595的串行输入端接收从MCU来的8位数据,通过适当的电阻网络连接到74HC138的选通信号上。
- 段选器74HC595的串行加载信号(SRCLK)、串行输出锁存允许信号(SLA)和输出使能信号(OE)也需要接至MCU。
2. **软件部分**(假设使用C语言):
```c
#include "at32f4xx.h" // 引入AT32的头文件
// 定义数码管的位选和段选寄存器地址
#define DATA_PORT GPIOB // 假设数码管数据线在GPIOB
#define SELECTION_DDR DDRB
#define SELECTION PORTB
#define SELECTOR_DDR DDRH // 假设74HC138的选通信号在GPIOH
#define SELECTOR PORTH
void setDigit(uint8_t digit, uint8_t value) {
// 设置74HC138的位选
for(int i = 7; i >= 0; i--) {
if(digit & (1 << i)) { // 判断当前位是否需要选中
SELECTOR_DDR |= (1 << i); // 开放相应的位选口
SELECTOR |= (1 << i); // 输出低电平选中
} else {
SELECTOR_DDR &= ~(1 << i); // 关闭位选口
}
}
// 发送数据到74HC595
DATA_PORT = value;
}
void displayNumber(uint8_t number) {
for(int i = 0; i < 8; i++) {
setDigit(i, (number >> i) & 0x01);
// 这里假设74HC595的串行加载信号是固定的,如延时1us后自动更新
delay_us(1);
}
}
int main(void) {
// 初始化GPIO
// ...
// 数码管初始化
// ...
while(1) {
displayNumber(0x3F); // 显示数字3(ASCII码对应的十进制数)
// 更换其他数字...
}
}
```
阅读全文