实验要求:
控制两组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内,人肉眼是无法分辨上一位数码管熄灭,看到的是几个位是同时在显示,因此我们在代码内延时设置成1ms。
2、动态数码管上一位延时显示完关闭,在显示下一位选时,段选发送高电平会干扰到上一位选,会造成上一位选有下一位选数字的重影。因此这里需要给段选置低电平进行清零进行消隐,即SMG_A_DP_PORT置0(十六进制为:0x00)