原理图
内容
74HC138译码器
输出端Y0-Y7
(单片机原理图中的LED1-LED8
)受控于三个输入端A0~A2
(P22 P23 P24
)
A0 A1 A2
相当于表示了一个三位二进制数,A0是最低位,A2是最高位,且对应的
Y
A
2
A
1
A
0
Y_{A_2A_1A_0}
YA2A1A0呈现低电平(有效电平)
数码管
公共端 -> 位选线
连在一起的段线 -> 段选线
通过控制在不同位选线 不同的段选线通电(段选数据不同)以达到在不同位置显示不同数字的目的
具体看单片机原理图即可
动态显示其实一个时刻只点亮一个数字,在24ms内点亮下一个就会看成是同时亮的
代码
首先是一段转码用的
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//最高位为小数点,如果需要点亮小数点只需 | (0x80)或是 | 128
然后是显示用的函数
#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
u8 code ddnum[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,};
void delay(u16 k) //k=1 -> 10us
{
while(k--);
}
void Dig_Display(u8 i, u8 num, u8 Dot) //ith num from right to left, the num to be displayed, whether to light the dot
{
switch(i)
{
case 0:
LSA=0;LSB=0;LSC=0;break;
case 1:
LSA=1;LSB=0;LSC=0;break;
case 2:
LSA=0;LSB=1;LSC=0;break;
case 3:
LSA=1;LSB=1;LSC=0;break;
case 4:
LSA=0;LSB=0;LSC=1;break;
case 5:
LSA=1;LSB=0;LSC=1;break;
case 6:
LSA=0;LSB=1;LSC=1;break;
case 7:
LSA=1;LSB=1;LSC=1;break;
}
if(Dot)
P0=(ddnum[num]|128);
else
P0=ddnum[num];
delay(100);
P0=0x00;
}
显示一个日期的示例程序(以1926.08.17为例)
#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
u8 code ddnum[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,};
void delay(u16 k) //k=1 -> 10us
{
while(k--);
}
void Dig_Display(u8 i, u8 num, u8 Dot) //ith num from right to left, the num to be displayed, whether to light the dot
{
switch(i)
{
case 0:
LSA=0;LSB=0;LSC=0;break;
case 1:
LSA=1;LSB=0;LSC=0;break;
case 2:
LSA=0;LSB=1;LSC=0;break;
case 3:
LSA=1;LSB=1;LSC=0;break;
case 4:
LSA=0;LSB=0;LSC=1;break;
case 5:
LSA=1;LSB=0;LSC=1;break;
case 6:
LSA=0;LSB=1;LSC=1;break;
case 7:
LSA=1;LSB=1;LSC=1;break;
}
if(Dot)
P0=(ddnum[num]|128);
else
P0=ddnum[num];
delay(100);
P0=0x00;
}
void main()
{
while(1)
{
Dig_Display(0, 7, 0);
Dig_Display(1, 1, 0);
Dig_Display(2, 8, 1);
Dig_Display(3, 0, 0);
Dig_Display(4, 6, 1);
Dig_Display(5, 2, 0);
Dig_Display(6, 9, 0);
Dig_Display(7, 1, 0);
}
}
总结
一旦理解了还是挺容易的,主要是搞明白哪个口在什么情况下呈现什么电平