数码管的原理及静态显示
数码管的结构和原理
显示字符 | 共阴极字段码 | 共阳极字段码 | 显示字符 | 共阴极字段码 | 共阳极字段码 |
---|---|---|---|---|---|
0 | 3FH | C0H | C | 39H | C6H |
1 | 06H | F9H | D | 5EH | A1H |
2 | 5BH | A4H | E | 79H | 86H |
3 | 4FH | B0H | F | 71H | 8EH |
4 | 66H | 99H | P | 73H | 8CH |
5 | 6DH | 92H | U | 3EH | C1H |
6 | 7DH | 82H | T | 31H | CEH |
7 | 07H | F8H | Y | 6EH | 91H |
8 | 7FH | 80H | L | 38H | C7H |
9 | 6FH | 90H | 8. | FFH | 00H |
A | 77H | 88H | “灭” | 00 | FFH |
B | 7CH | 83H | …… | …… | …… |
LED数码管的显示方式
静态显示和动态显示
静态显示方式
特点:
- 公共端直接接地(共阴极)或接电源(共阳极) 。
- 每个数码管的段选线与一组I/O接口线相连。
- 每个数码管一直显示。
绘制
下面有一条线的就是共阴极的,相反共阳极的在上面
先亮0
根据这个,我们可以写出完整代码
#include "reg51.h"
#include "string.h"
//定义一个数组,共阴0-9
unsigned char s[] =
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};
void delay(unsigned int n)
{
//给变量一个初始值,防止变量初始化的时候是一个随机数
//可能造成程序的误动作
unsigned int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<120;j++);
}
}
void seg()
{
//P2 = 0x3F;//0011 1111,横和接地不亮
int i=0;
for(i=0;i<strlen(s);i++)
{
//P2 = s[i];//共阴
P2 = ~s[i];//共阳
delay(500);
}
}
void main()
{
while(1)
{
//子函数,执行数码管的操作
seg();
}
}
编译运行
共阳
共阴
动态显示方式
特点:
- 所有数码管的段选线与一组I/O接口线并连在一起。
- 每个数码管的公共端由一根I/O线控制。
- 显示为逐个显示。
位码低电平有效,验证
编译,用共阴
#include "reg51.h"
#include "string.h"
//定义一个数组,共阴0-9
unsigned char s[] =
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};
void delay(unsigned int n)
{
//给变量一个初始值,防止变量初始化的时候是一个随机数
//可能造成程序的误动作
unsigned int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<120;j++);
}
}
void seg()
{
//P2 = 0x3F;//0011 1111,横和接地不亮
int i=0;
for(i=0;i<strlen(s);i++)
{
P2 = s[i];//共阴
//P2 = ~s[i];//共阳
delay(500);
}
}
void main()
{
while(1)
{
//子函数,执行数码管的操作
seg();
}
}
导入hex文件
接下来我们显示出HELLO
H:0111 0110 --> 0x76
E:0111 1001 --> 0x79
L:0011 1000 --> 0x38
O: 0011 1111 --> 0x3F
更改单片机连接方式
#include "reg51.h"
#include "string.h"
//定义一个数组,共阴0-9
unsigned char s[] =
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};
//定义一个数组,显示HELLO
unsigned char str[] = {0x76,0x79,0x38,0x38,0x3F};
//位码数组
unsigned char wei[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void delay(unsigned int n)
{
//给变量一个初始值,防止变量初始化的时候是一个随机数
//可能造成程序的误动作
unsigned int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<120;j++);
}
}
void seg()
{
//P2 = 0x3F;//0011 1111,横和接地不亮
int i=0;
//字母只有5个,可以循环5次
for(i=0;i<5;i++)
{
P3=~wei[i];//选中位,低电平有效,取反
P2 = str[i];//给段码值
//P2 = ~s[i];//共阳
delay(5);//更改延时,更快显示来欺骗眼睛
}
}
void main()
{
while(1)
{
//子函数,执行数码管的操作
seg();
}
}
效果:
电路图简化
74LS138 为3 线-8线译码器,共有 54LS138和 74LS138 两种线路结构型式。54LS138为军用,74LS138为民用。
输出端的圆圈是取反
Y0是低电平输出
E2是高电平有效
更改代码:
#include "reg51.h"
#include "string.h"
//定义一个数组,共阴0-9
unsigned char s[] =
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};
//定义一个数组,显示HELLO
unsigned char str[] = {0x76,0x79,0x38,0x38,0x3F};
//位码数组
//unsigned char wei[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char wei[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
void delay(unsigned int n)
{
//给变量一个初始值,防止变量初始化的时候是一个随机数
//可能造成程序的误动作
unsigned int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<120;j++);
}
}
void seg()
{
//P2 = 0x3F;//0011 1111,横和接地不亮
int i=0;
//字母只有5个,可以循环5次
for(i=0;i<5;i++)
{
//P3=~wei[i];//选中位,低电平有效,取反
P3 = wei[i];
P2 = str[i];//给段码值
//P2 = ~s[i];//共阳
delay(5);
}
}
void main()
{
while(1)
{
//子函数,执行数码管的操作
seg();
}
}
硬件电路优化,减少IO口的使用(减少了5个)