动态数码管
1.显示原理:
利用减少段选线,分开位选线,利用为选线不同时,选择通断,改变段选数据来实现的。
2.原理图
A2—A4:看RP4
3.人眼区分在20-50ms
让0 1 2 3之间的时间小于20-50ms,利用人眼的余晖效应,使人眼观察为同时显示0 1 2 3。
4.74HC245芯片根据芯片手册DIR为高电平输出
5.38译码器真值表
真值表解释分析
L:0;H=1;
_(低电平有效) 简便记忆:A0 A1 A2
Y0:有效000 LED1 二进制:000=0
_
Y1:有效100 LED2 二进制:100=1
_
Y2:有效010 LED3 二进制:010=2
_
Y3:有效110 LED4 二进制:110=3
_
Y4:有效001 LED5 二进制:001=4
_
Y5:有效101 LED6 二进制:101=5
_
Y6:有效011 LED7 二进制:110=6
_
Y7:有效111 LED8 二进制:111=7
原理图对应真值表
C 对应的A2 ;管脚:P2^4
B 对应的A1 ;管脚:P2^3
A 对应的A0 ;管脚:P2^2
A0=P0^0
A1=P0^1
A2=P0^2
共阴极:输入低电平(0)
6.软件设计
实现功能:控制动态数码管从左到右显示数字0-7。
led8=0,led7=1…led1=8;
7.程序编码
#include <REGX51.H>
typedef unsigned char u8;
typedef unsigned int u16;
#define SMG_A_DP_PORT P0
/SMG:数码管;A_DP:段选a-dp;PORT P0:端口P0 ;(宏定义通常大写)/
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
/sbit单个管脚的定义,38译码器的输入管脚/
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/定义数组共阴0-F;
8位:每一个段码都是一个字节,因此选用u8类型;
注意数组命名原则,g:全局变量(无g:内部变量)/
void delay_10us(u16 ten_us)
{
while(ten_us–);
}
void smg_disply(void)
{
u8 i=0;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:LSC=1;LSB=1;LSA=1;break;//led8
case 1:LSC=1;LSB=1;LSA=0;break;//led7
case 2:LSC=1;LSB=0;LSA=1;break;//led6
case 3:LSC=1;LSB=0;LSA=0;break;//led5
case 4:LSC=0;LSB=1;LSA=1;break;//led4
case 5:LSC=0;LSB=1;LSA=0;break;//led3
case 6:LSC=0;LSB=0;LSA=1;break;//led2
case 7:LSC=0;LSB=0;LSA=0;break;//led1
}
SMG_A_DP_PORT=gsmg_code[i];//段选i=0——LED8显示0;i=1——LED7显示1;
delay_10us(100);//延时1ms 人眼余辉效应:20-50ms
SMG_A_DP_PORT=0x00;
/*数据口清零,消除重影(消除下一个数码管对上一个数码管的影响)
但非常短暂导致人眼发现不了*/
}
}
void main()
{
while(1)
{
smg_disply();
//放在循环体里不断循环
}
}
8.改编
软件设计:
实现功能:流水形式:t s j y F R j y (唐山加油 丰润加油)
#include <REGX51.H>
typedef unsigned char u8;
typedef unsigned int u16;
#define SMG_A_DP_PORT P0
/SMG:数码管;A_DP:段选a-dp;PORT P0:端口P0 ;(宏定义通常大写)/
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
/sbit单个管脚的定义,38译码器的输入管脚/
u8 gsmg_code[8]={0x78,0x6d,0x0e,0x6e,0x71,0x77,0x0e,0x6e};
//tsjy FRjy 唐山加油丰润加油
/定义数组共阴 tsjyFRjy;
8位:每一个段码都是一个字节,因此选用u8类型;
注意数组命名原则,g:全局变量(无g:内部变量)/
void delay_10us(u16 ten_us)
{
while(ten_us–);
}
void smg_disply(void)
{
u8 i=0;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:LSC=1;LSB=1;LSA=1;break;//led8
case 1:LSC=1;LSB=1;LSA=0;break;//led7
case 2:LSC=1;LSB=0;LSA=1;break;//led6
case 3:LSC=1;LSB=0;LSA=0;break;//led5
case 4:LSC=0;LSB=1;LSA=1;break;//led4
case 5:LSC=0;LSB=1;LSA=0;break;//led3
case 6:LSC=0;LSB=0;LSA=1;break;//led2
case 7:LSC=0;LSB=0;LSA=0;break;//led1
}
SMG_A_DP_PORT=gsmg_code[i];//段选i=0——LED8显示t;i=1——LED7显示s;
delay_10us(100);//延时1ms 人眼余辉效应:20-50ms
SMG_A_DP_PORT=0x00;
/*数据口清零,消除重影(消除下一个数码管对上一个数码管的影响)
但非常短暂导致人眼发现不了*/
}
}
void main()
{
while(1)
{
smg_disply();//放在循环体里不断循环
}
}