目录
一、原理图:
1、解释动态数码管原理图:
(1)74HC245作用:信号功率放大(由于IO口输出功率太低)
(2)段选:由J6口选择要选择的a-e需要亮的部分
(3)位选:由J1口选择要亮的位,其中为了节省引脚,我们用74HC138译码器控制J1
(4)74HC138译码器:J9输入三位二进制数控制J10八位引脚,如输入010,则让Y2输出低电平
(5)从0-f对应对应的16进制数:
//不含小数点
u8 code transistor_negative[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
//包含小数点
u8 code transistor_negative_point[]=
{
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1
};
二、STC89C51参考代码:
总体思路:从分析原理图可知,我们只要控制数码管的位选和段选引脚就可以实现我们想要显示的内容
//宏定义
#ifndef VARIABLE_DEFINE_H
#define VARIABLE_DEFINE_H
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
#endif
//主函数
#include "Public.h"
#include "transistor.h"
void main()
{
u8 dat[]={1,2,3,4,5,6,7,8};
while(1)
{
TST_ALL(dat);
}
}
//数码管头文件
#ifndef TRANSISTOR_H
#define TRANSISTOR_H
#include "Public.h"
#define vol_sign 0x3e
#define SGM_Port P1
sbit LSA=P0^0;
sbit LSB=P0^1;
sbit LSC=P0^2;
void TST_ALL(u8 dat[]);
void delay1us(u8 time_out);
#endif
//数码管c文件
#include "transistor.h"
u8 code transistor_positive[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};
u8 code transistor_positive_point[]=
{
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e
};
u8 code transistor_negative[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
u8 code transistor_negative_point[]=
{
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1
};
void delay1us(u8 n);
void TST_ALL(u8 dat[])
{
u8 i;
for(i=0;i<8;i++)
{
switch(i+1)
{
case 1:LSC=0;LSB=0;LSA=0;break;
case 2:LSC=0;LSB=0;LSA=1;break;
case 3:LSC=0;LSB=1;LSA=0;break;
case 4:LSC=0;LSB=1;LSA=1;break;
case 5:LSC=1;LSB=0;LSA=0;break;
case 6:LSC=1;LSB=0;LSA=1;break;
case 7:LSC=1;LSB=1;LSA=0;break;
case 8:LSC=1;LSB=1;LSA=1;break;
}
SGM_Port = transistor_negative[dat[i]];
delay1us(30);
SGM_Port = 0x00;
}
}
void delay1us(u8 time_out)
{
u8 i;
while(time_out--)
for(i=85;i==0;i--);
}