实验要求:
控制两组4位一体共阴动态数码管显示数字0-7
实验思路:
1、动态数码管段选接P0端口,宏定义P0端口为SMG_A_DP_PORT
#define SMG_A_DP_PORT P0 //重定义P0端口
2、动态数码管位选通过一个74HC138译码器控制,仅需3个管脚即可控制两组4位一体动态数码管。因此对38译码器的数据输入端口A0,A1,A2进行定义。如下方原理图:A0=A;A1=B;A2=C,因此对A,B,C三个管脚进行定义即可。
sbit LSA=P1^0; sbit LSB=P1^1; sbit LSC=P1^2;

3、重定义系统数据类型
//重定义系统数据类型 typedef unsigned char U8; typedef unsigned int U16;
4、定义一个数组变量gsmg_code[],用于定义0-7共阴数码管段码表
U8 gsmg_code[9]={
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x00, //消稳
};5、定义一个延时函数delay_10us,用于字符显示延时。
6、定义一个动态数码管显示函数smg_display。(模块化代码有利于后期移稙)
完整代码:
/*****************************程序信息*********************************
* 实验名称:控制动态数码管显示0-7
* 文件名称:main.c
* 版 本:V1.00
* 日 期:2021-12-21
* 编 著:gefon
* 说 明:使用普中A7开发版,控制两组4位一体动态数码管显示0-7数字
*******************************声明区*********************************/
#include "reg52.h"
#define SMG_A_DP_PORT P0 //重定义P0端口
//定义74HC138数据输入管脚
sbit LSA=P1^0;
sbit LSB=P1^1;
sbit LSC=P1^2;
//重定义系统数据类型
typedef unsigned char U8;
typedef unsigned int U16;
//共阴数码管段码表
U8 gsmg_code[9]={
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x00, //消稳
};
/*******************************子程序*********************************
* 函 数 名 :delay_10us
* 函数功能 :延时函数,当传入变量ten_us=1时,约延时10us
* 输 入 :ten_us
* 输 出 :无
***********************************************************************/
void delay_10us(U16 ten_us)
{
while(ten_us--);
}
/*******************************子程序*********************************
* 函 数 名 :smg_display
* 函数功能 :动态数码管显示
* 输 入 :无
* 输 出 :无
***********************************************************************/
void smg_display()
{
U8 i=0;
for(i=0;i<8;i++) //动态数码管位选控制
{
switch(i)
{
case 0:LSC=0;LSB=0;LSA=0;break;
case 1:LSC=0;LSB=0;LSA=1;break;
case 2:LSC=0;LSB=1;LSA=0;break;
case 3:LSC=0;LSB=1;LSA=1;break;
case 4:LSC=1;LSB=0;LSA=0;break;
case 5:LSC=1;LSB=0;LSA=1;break;
case 6:LSC=1;LSB=1;LSA=0;break;
case 7:LSC=1;LSB=1;LSA=1;break;
}
SMG_A_DP_PORT=gsmg_code[i]; //动态数码管传送段选数据
delay_10us(100); //延时一定时间,等待显示稳定
SMG_A_DP_PORT=0x00; //消隐
}
}
/*******************************主程序*********************************
* 函 数 名 :main
* 函数功能 :主函数
* 输 入 :无
* 输 出 :无
***********************************************************************/
void main()
{
while(1)
{
smg_display();
}
}实验分析:
1、实现多个数码管一起显示,实际是轮流点亮数码管。利用人眼视觉暂留现象(又称余晖效应),要显示的动态数码管点亮/熄灭的切换时间在视觉暂留现象的时间内(约20ms内),人眼看到的即是几个数码管同时在显示。本实验,我们需要同时显示8个数码管,从第1位数码管切换到第8位,再切换回第1位,一共需要切换8次,可以计算出每位数码管之间的切换时间为2.5ms(20/8),因此我们在代码内延时设置成1ms。
2、动态数码管上一位延时显示完关闭,在显示下一位选时,段选发送高电平会干扰到上一位选,会造成上一位选有下一位选数字的重影。因此这里需要给段选置低电平进行清零进行消隐,即SMG_A_DP_PORT置0(十六进制为:0x00)