数码管的介绍
- LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件
数码管的引脚定义
由于四位数码管四个数字的段显示是相同的连接在一个引脚上的。一共需要14个引脚。
我们称12,9,8,6为位选 11、7、4、2、1、10、5、3为段选
由此我们知道这样是不可以4位同时显示不同的数值的,要想实现这一效果我们用到了数码管扫描
我们可以使第一位显示一个数字,第二位显示一个数字,然后一直循环,因为我们人眼的视觉暂留,看起来就是同时显示了。
数码管在开发板中的连接
74HC138译码器
-
作用:译码,用三个引脚控制8个引脚。
-
使用:使能端G1接高电平 G2A、G2B接低电平。A、B、C为输入端 输出端为低电平有效,其他为高电平
| C | B | A | 输出 |
|---|---|---|---|
| 0 | 0 | 0 | Y0低电压 |
| 0 | 0 | 1 | Y1 |
| 0 | 1 | 0 | Y2 |
| 0 | 1 | 1 | Y3 |
| 1 | 0 | 0 | Y4 |
| 1 | 0 | 1 | Y5 |
| 1 | 1 | 0 | Y6 |
| 1 | 1 | 1 | Y7 |
74HC245双向缓冲器
低电平的驱动能力强 高电平的驱动能力弱
所以需要用一个缓冲区来加强电压
使用: OE为使能端 低电平有效 即OE端低电平芯片工作
DIR方向控制 高电平 A到B 低电平 B到A
其他引脚是一一对应的 A0 对 B0 以此类推
代码示例
静态数码管显示
//静态数码管显示 第三位显示6
#include <REGX52.H>
void main()
{
P2_2=1;
P2_3=0;
P2_4=1;
P0=0x7D;
while(1);
}
优化代码
//数码管代码模块化
#include <REGX52.H>
/*
----------------------------------------------------------------------
名称: 数码管模块化代码
函数名称: Nixie(unsigned char Loaction,Number) Loaction 位选 Number 数字
其中Number 10为空 11为点
----------------------------------------------------------------------
*/
unsigned char NixieTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x80};
void Nixie(unsigned char Loaction,Number)
{
switch(Loaction)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTab[Number];
}
void main()
{
Nixie(3,6);
while(1);
}
动态数码管显示
数码管显示是 位选 段选 位选 段选 地重复 在重复时因为单片机速度很快 所以会有重影地现象
消影; 我们延时1微秒 然后空显示就可以了
不延时的话 亮度会明显变暗
#include <REGX52.H>
#include <INTRINS.H>
void Delay(unsigned int ums) //@11.0592MHz
{
while(ums){
_nop_();
_nop_();
_nop_();
ums--;
}
}
unsigned char NixieTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x80};
void Nixie(unsigned char Loaction,Number)
{
switch(Loaction)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTab[Number];
Delay(1);
P0=0x00;
}
void main()
{
while(1){
Nixie(1,1);
Nixie(2,2);
Nixie(3,3);
Nixie(4,4);
Nixie(5,11);
Nixie(6,5);
Nixie(7,6);
Nixie(8,7);
}
}
利用双74CH595控制8位数码管
74CH595
74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于IO口扩展。
#include <REGX52.H>
sbit RCK =P3^5;//转存
sbit SRCK=P3^6;//一位
sbit SER =P3^4;
unsigned char code NixieNum[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
void _74HC595_Write(unsigned char location,unsigned char Num)
{
unsigned char i,locat;
RCK=0;
SRCK=0;
if(location==1)locat=~(0x80);
if(location==2)locat=~(0x40);
if(location==3)locat=~(0x20);
if(location==4)locat=~(0x10);
if(location==5)locat=~(0x08);
if(location==6)locat=~(0x04);
if(location==7)locat=~(0x02);
if(location==8)locat=~(0x01);
for(i=0;i<8;i++)
{
SER=locat&(0x80>>i);
SRCK=1;
SRCK=0;
}
for(i=0;i<8;i++)
{
SER=NixieNum[Num]&(0x80>>i);
SRCK=1;
SRCK=0;
}
RCK=1;
RCK=0;
}
void main()
{
while(1)
{
_74HC595_Write(1,1);
_74HC595_Write(2,2);
_74HC595_Write(3,3);
_74HC595_Write(4,4);
_74HC595_Write(5,5);
_74HC595_Write(6,6);
_74HC595_Write(7,7);
_74HC595_Write(8,8);
}
}
数码管的驱动方式
- 单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间
- 专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可