普中51单片机学习笔记-数码管
目录
动态显示原理
74HC138(3-8译码器)
74HC245(双向总线驱动器)
硬件电路
示例代码
关键要点
总结
动态显示原理
要让多位数码管同时显示不同的数字,需要利用“动态扫描”技术。其核心原理是:
- 分时点亮:在极短的时间内(例如每位数码管点亮1-2毫秒),依次快速点亮每一位数码管。
- 段码位码配合:在点亮某一位数码管时,74HC245送出该位需要显示的数字对应的段码,同时74HC138选中这一位数码管。
- 利用视觉暂留:由于人眼的视觉暂留效应,只要扫描的速度足够快(通常整个循环周期小于20ms),看起来就像是所有数码管在同时稳定显示一样。
74HC138(3-8译码器)
它的角色是“位选”,也就是控制多位数码管中的哪一位被点亮。
它通过3个输入引脚(A0, A1, A2)的二进制组合,来选择8个输出引脚(Y0~Y7)中的一个输出有效电平(通常是低电平),从而选中对应的数码管。



74HC245(双向总线驱动器)
它的角色是“段选”,负责增强单片机IO口的驱动能力,并提供数码管显示具体数字(或字符)所需的段码数据(即控制a, b, c, d, e, f, g, dp这8个段是否点亮)。



硬件电路

示例代码
#include "reg52.h"//对系统默认数据类型进行重定义
typedef unsigned int u16;
typedef unsigned char u8;//使用宏定义数码管段码口
#define SMG_A_DP_PORT P0 //定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//共阴极数码管显示 0~F 的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1 时,大约延时 10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}/*******************************************************************************
* 函 数 名 : smg_display
* 函数功能 : 动态数码管显示
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void smg_display(void)
{u8 i=0;for(i=0;i<8;i++){switch(i)//位选{case 0: LSC=1;LSB=1;LSA=1;break;case 1: LSC=1;LSB=1;LSA=0;break;case 2: LSC=1;LSB=0;LSA=1;break;case 3: LSC=1;LSB=0;LSA=0;break;case 4: LSC=0;LSB=1;LSA=1;break;case 5: LSC=0;LSB=1;LSA=0;break;case 6: LSC=0;LSB=0;LSA=1;break;case 7: LSC=0;LSB=0;LSA=0;break;}SMG_A_DP_PORT=gsmg_code[i];//传送段选数据delay_10us(100);//延时一段时间,等待显示稳定SMG_A_DP_PORT=0x00;//消隐:在切换到下一位前,可以先关闭段码,防止"鬼影"}
}/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{while(1){smg_display();}
}
关键要点
-
消隐处理:在切换位选时,一定要先关闭段码(清空P0口或发送消隐码)再切换位选,最后送入新的段码。这能有效避免“鬼影”(即数码管显示模糊或不该亮的段微微发亮)。
-
驱动能力:74HC245的主要作用就是提供足够的电流驱动,让数码管亮度足够。如果直接用单片机IO口驱动,可能会因为电流不足导致显示昏暗,甚至损坏单片机。
-
扫描频率:确保8位数码管整体的扫描频率高于50Hz(即循环一周时间小于20ms),否则会观察到明显的闪烁。
-
限流电阻:别忘了在74HC245的输出端(或者数码管的段码输入端)串联限流电阻(通常几百欧姆),以保护LED段不被过大的电流烧毁。
总结
总的来说,74HC138负责精准定位到哪一位数码管亮(位选),而74HC245则负责让这位数码管显示出正确的数字(段选),两者配合,通过动态扫描的方式,就能轻松实现多位数码管的稳定显示。
