目录
数码管
显示的基本原理
LED数码管的显示方式
静态显示方式
动态显示方式
具体案例
数码管静态显示
电路图
keil文件
数码管动态显示
电路图
keil文件
74LS138译码器
简介
译码表
译码器案例
电路图
keil文件
74HC595译码器
前言
举例解释
简单案例
电路图
keil文件
进阶案例
电路图
keil文件
数码管
LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成的8字型器件
注意:8个LED构成了数码管,数码管的连接方式有共阴极和共阳极连接。
显示的基本原理
LED数码管的显示方式
静态显示方式
特点
- 公共端直接接地或接电源
- 每个数码管的段选线与一组IO接口线相连
- 每个数码管一直在显示
动态显示方式
特点
- 所有的数码管的段选线与一组IO接口线并联在一起
- 每个数码管的公共端由一根IO线控制
- 显示为逐个显示(利用人眼的视觉暂留原理,数码管切换的速度够快就好像多个数码管一起显示)
注意:段码线决定晶体管显示的是什么,位码线决定是哪个晶体管要显示;若想要四个数码管均显示不同的数字那么就需要以很小的时间内不断地切换四个数码管的显示(人眼的视觉暂留)
具体案例
数码管静态显示
需求:共阴极的方式实现0——9的不断循环。
电路图
keil文件
#include "reg51.h"
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()
{
int i=0;
for(i=0;i<10;i++)
{
P2=s[i];
delay(500);
}
}
void main()
{
while(1)
{
seg();
}
}
数码管动态显示
需求:在数码管上显示hello这个字符串。
电路图
注意:英文字母为段码线,数字为位码线;
keil文件
#include "reg51.h"
unsigned char str[]={0x76,0x79,0x38,0x38,0x3F};
unsigned char wei[]={0x01,0x02,0x04,0x08,0x10};
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(){
int i=0;
for(i=0;i<5;i++){
P3=~wei[i];
P2=str[i];
delay(5);
}
}
void main()
{
while(1)
{
seg();
}
}
74LS138译码器
简介
前言:该译码器可以仅通过3个针脚来决定右面对应针脚的信号(其中一个为0剩下的全是1),进而对数码管的位选断进行选择。
理解:左边的针脚为数字输入端,右边的8个端口为数字输出端;上下两端分别为电源和接地;左下脚3个针脚为使能端(需要把G1接上高电平、G2A和G2B接上低电平)
译码表
- 000——Y0
- 001——Y1
- 010——Y2
- 011——Y3
- 100——Y4
- 101——Y5
- 110——Y6
- 111——Y7
注意:译码表输入端三个字母的排序为CBA
译码器案例
需求:在特定位置显示特定数字。
电路图
keil文件
#include "reg51.h"
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
#1——9对应的段码
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void show(unsigned char location,unsigned char number){
switch(location)
{
case 1:P3_0=0;P3_1=0;P3_2=0;break;
case 2:P3_0=1;P3_1=0;P3_2=0;break;
case 3:P3_0=0;P3_1=1;P3_2=0;break;
case 4:P3_0=1;P3_1=1;P3_2=0;break;
case 5:P3_0=0;P3_1=0;P3_2=1;break;
case 6:P3_0=1;P3_1=0;P3_2=1;break;
case 7:P3_0=0;P3_1=1;P3_2=1;break;
case 8:P3_0=1;P3_1=1;P3_2=1;break;
}
P2=s[number];
}
void main()
{
while(1){
#展示第三列的数字为8
show(3,8);
}
}
74HC595译码器
前言
含义:74HC595是串行输入并行输出的移位寄存器,可用三根线输入串行数据,8根线输出并行数据,多片级联后可输出16位、24位、32位等,常用于IO口扩展。
注意:左边为移位寄存器,右边为输出缓存寄存器。
工作模式:首先SER(DS)串行数据要给其对应的移位寄存器输入,之后串行数据就会进入到移位寄存器(当SERCLK/SH_CP串行时钟每来一个上升沿,那么SER的串行数据就会向下进入一位)然后数据都走到了移位寄存器,那么就会根据RCK/ST_CP寄存器时钟的上升沿信号把移位寄存器内部的数据一位一位的搬到输出缓存中,因此就达到了串行输入并行输出的目的。
注意:QH撇是接另外一个74HC595的SER端,使其达到扩充移位寄存器的目的。
举例解释
需求:QA-QH输出00000101
解释:SER串行数据口写入1,控制时钟SERCLK来一个上升沿,那么1就会被移到移位寄存器的第一个块中,然后SERCLK上升沿清零回到默认低电平状态,然后继续向SER写数据0,SERCLK又来高电平,那么这个1就会移到移位寄存器的第二块,0就会被移到移位寄存器的第一块中,SERCLK又回到低电平,如此循环往复直到移位寄存器被填满,此时数据移位完成,RCLK来个高电平将移位寄存器中的数各个搬到输出缓存中,之后RCLK恢复到低电平。
简单案例
需求:通过74HC595用三条线在LED数码管中显示6
电路图
注意:MR杠和OE杠为功能脚,若MR杠接低电平,那么右边的Q0——Q7撇全输出低电平;若OE杠接高电平,那么Q0——Q7这个管脚就会被禁用。所以正常来说10管脚MR杠接高电平;13管脚OE杠接低电平。
keil文件
#include "reg51.h"
sbit SER=P2^1;
sbit SCK=P2^0;
sbit RCK=P2^3;
//74HC595
void WriteByte(unsigned char Byte){
unsigned char i;
for(i=0;i<8;i++){
SER=Byte&(0x80>>i);
SCK=1;
SCK=0;
}
RCK=1;
RCK=0;
}
void main()
{
SCK=0;
RCK=0;
while(1)
{
WriteByte(0x7D);
}
}
进阶案例
需求:要求用3根线来实现控制多位数码管显示hello。
电路图
keil文件
#include "reg51.h"
unsigned char str[]={0x76,0x79,0x38,0x38,0x3F};
unsigned char wei[]={0x01,0x02,0x04,0x08,0x10};
sbit SER=P2^1;
sbit SCK=P2^0;
sbit RCK=P2^3;
void delay(unsigned int n){
unsigned int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++);
}
}
void writeByte(unsigned char wei,unsigned char duan){
unsigned char i,j;
//位选
unsigned char weidi=~wei;
for(i=0;i<8;i++){
SER=weidi&(0x80>>i);
SCK=1;
SCK=0;
}
//段选
for(j=0;j<8;j++){
SER=duan&(0x80>>j);
SCK=1;
SCK=0;
}
RCK=1;
RCK=0;
}
void hello(){
int i=0;
for(i=0;i<5;i++){
writeByte(wei[i],str[i]);
delay(5);
}
}
void main()
{
SCK=0;
RCK=0;
while(1)
{
hello();
}
}