数码管:
- 数码管由7个发光二极管组成一个日字形,如果需要显示小数点,那么就再加一个点,就是8段数码管。
- 数码管显示亮度高,响应速度快,分共阴和共阳两种形式,常用的有单个的和4联的,还有两联的和专门用来显示时间的。
- 分类:共阴;共阳
- 编码问题:
必须对数字或字符进行编码。因此为LED显示器提供的编码正好是一个字节。也有采用BCD-7段译码芯片的。
- 显示问题:
v静态显示方式
静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。
v动态显示
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
- 数码管下方有一个反相器。默认P3输出1,即默认数码管共阴。
- 现在需要操作P1,扫描所有数码管
如何扫描:
- P3:10000 P1送入数字编码
- P3:01000 P1送入数字编码
- P3:00100 P1送入数字编码
- P3:00010 P1送入数字编码
- P3:00001 P1送入数字编码
送入数字编码:按照16进制编码表即可
其他类型的数码管:
四个管子同时接出a---dp
74HC138译码器:
- A1,A2,A3三个加权(A0A1A2的输入相当于一个八进制数)输入可以产生八个互斥输出Y0-Y7
输入输出特性:
使能条件:E1E2 :低电平 E3:高电平
芯片使用:
G2A G2B G1:代表E1E2E3
ABC:A0A1A2
点亮数码管:
//静态显示
#include <reg52.h>
unsigned char a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c};
int main()
{
P1=a[1];
//接地端默认使数码管共阴
while(1);
return 0;
}
//数码管的动态显示
/*
思路:
1.向138芯片的A123输出选中数码管,选中谁 谁是低电平
2.同时P10输出十六进制
*/
#include <reg52.h>
sbit smgen=P2^3;//573芯片 高电平
sbit rs=P3^6;//其他芯片会影响 所以用这个脚关闭那个芯片。
unsigned char table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c};//对应着数字
unsigned char table2[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70};
//总线驱动:A1A2A3
void delay(unsigned int a)
{
while(a--);
}
unsigned int t;
void main()
{
unsigned char i;
rs=0;//OE接地
t = 50;
while(1)
{
for(i=0;i<8;i++)
{
P2=table2[i];
smgen=1;
P1=table1[i];
delay(t);
}
}
}
点阵:
如何显示:
- 上图原理图中:横向是P0 纵向是P1 此板使用左边原理图。延序号有P0-P7
-
如果想让点阵点亮,则保证P0i = 0;P1j = 1
举例:动态显示数字0:
- P0选中第一列 P0 = 1111 1110 ;P1 = 0000 0000
- P0选中第二列 P0 = 1111 1101 ;P1 = 0000 0000
- P0选中第三列 P0 = 1111 1011 ;P1 = 0011 1110
- P0选中第四列 P0 = 1111 0111 ;P1 = 0100 0001
- P0选中第五列 P0 = 1110 1111 ;P1 = 0100 0001
- P0选中第六列 P0 = 1101 1111 ;P1 = 0100 0001
- P0选中第七列 P0 = 1011 1111 ;P1 = 0011 1110
- P0选中第八列 P0 = 0111 1111 ;P1 = 0000 0000
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit en1=P2^0;//573高电平
sbit en2=P2^3;//573高电平
sbit rs=P3^6;//某个芯片需要关闭
uchar table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar table2[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};
void init(void)
{
en1=1;
en2=1;
rs=0;
}
void delay(uint a)
{
while(a--);
}
void main()
{
uchar i;
init();//初始化
while(1)
{
for(i=0;i<8;i++)
{
P0=table1[i];
P1=table2[i];
delay(40);
}
}
}