嵌入式数码管静态显示
使用两个并排的共阴极4位数码管,显示数字(要求在8位任意一个位置只显示一位数字)。两个数码管一共有8个阴极引脚和16个阳极引脚,为了节省MCU的引脚。我们可以将两个数码管的8个阳极接在一起。这样只使用8个GPIO引脚就能控制数码管的显示内容了。
设计思路
我们使用了8个GPIO引脚来控制数码管的阳极。因为我们只要求同一时刻只显示一位数字,所以我们可以使用74HC138(三八译码器)芯片进一步节省MCU的引脚。使用74HC138芯片就可以使用三个引脚控制八个的引脚的输出。如下图所示:
74HC245N(放大驱动器)
因为51单片机高电平的驱动能力很微弱,不足以点亮数码管,可以使用74HC245N芯片放大电流。使用74HC245N之后,51单片引脚的输出就只用作信号传输,电流由74HC245N芯片的电源提供。
实现思路
为了实现当前需求,分别是显示的位置和显示内容。确定显示位置称为数码管的位选,确定显示内容称为数码管的段选。首先位选我们通过74HC138芯片控制,是通过单片机的P13、P14、P15引脚控制。数码管的段选通过单片机的P00~P07这8个引脚控制,具体的对应关系如下图。
#include <STC89C5xRC.H>
#define SMG_EN P36
typedef unsigned char u8;
typedef unsigned int u16;
static u8 s_digit_codes[10] = {
0x3F, //0
0x06, //1
0x5B, //2
0x4F, //3
0x66, //4
0x6D, //5
0x7D, //6
0x07, //7
0x7F, //8
0x6F, //9
};
/**
* @brief 数码管显示函数
*
* @param dig 显示的位置
* @param num 显示的数字
*/
void DigitalTube_DisplaySingle(u8 dig, u8 num){
P0 = 0; //清空上一次的显示
/**
* 因为位选的三个引脚为P13,P14,P15。是P1的中间3位 00[000]000
* 所以先将中间三位清零,在将显示位置的数左移三位,最后进行或运算。
*/
P1 &= 0xC7;
dig <<= 3;
P1 |= dig;
P0 = num;
}
void main(){
// 数码管开关
SMG_EN = 0;
DigitalTube_DisplaySingle(5, s_digit_codes[0]);
while(1); // 可以卡主运行程序
}