数码管显示原理

STC89C52单片机 数码管静态显示-编程知识网

数码管根据内部连接不同分为共阴极和共阳极。八段数码管内部有8颗LED组成,如果想要显示特定字形只需控制相应的LED亮起,其他LED熄灭即可。

STC89C52单片机 数码管静态显示-编程知识网

静态与动态显示

静态显示:

LED显示器工作方式有两种:静态显示方式和动态显示方式。静态显示的特点是每个数码管的段选必须接一个9位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
缺点:使用的IO口比较多。

动态显示

动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余晖和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。

74HC573锁存器的工作原理

STC89C52单片机 数码管静态显示-编程知识网

芯片文档查询网址: https://www.alldatasheet.com/

上拉电阻的作用

上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。下位同理,也是将不确定的信号通过一个电阻钳位在低电平。

当P0口作为输入、输出口时,上电复位后处于开漏模式。P0口内部无上拉电阻,所以作I/0口必须外接10K-4.7K的上拉电阻。

STC89C52单片机 数码管静态显示-编程知识网

点亮一位数字"1"

#include <reg52.h>
#include <intrins.h>#define uint unsigned int
#define uchar unsigned charsbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选void main(){ // main函数自身会循环WE = 1; // 打开位选锁存器P0 = 0XFE;   // 1111 1110  选通第一位数码管
//	P0 = 0X00;  // 0000 0000  表示选通所有位数码管WE = 0; // 锁存位选数据DU = 1;  // 打开段选锁存器P0 = 0X06;  // 0000 0110  显示“1”DU = 0;   // 锁存段选数据while(1){// P0 = 0X01; // 当锁存器中的数值被锁定后,无法直接修改数码管的值,需要打开位选锁存器才能进行修改}	
}

点亮两位数字"2"

#include <reg52.h>
#include <intrins.h>#define uint unsigned int
#define uchar unsigned charsbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选void main(){ // main函数自身会循环WE = 1; // 打开位选锁存器P0 = 0XFC;   // 1111 1100  选通第一位和第二位数码管
//	P0 = 0X00;  // 0000 0000  表示选通所有位数码管WE = 0; // 锁存位选数据DU = 1;  // 打开段选锁存器P0 = 0X5B;  // 0101 1011  显示“2”DU = 0;   // 锁存段选数据while(1){// P0 = 0X01; // 当锁存器中的数值被锁定后,无法直接修改数码管的值,需要打开锁存器才能进行修改}	
}

点亮三位数字"3"

#include <reg52.h>
#include <intrins.h>#define uint unsigned int
#define uchar unsigned charsbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选void main(){ // main函数自身会循环WE = 1; // 打开位选锁存器P0 = 0XF8;   // 1111 1000  选通第一位、第二位和第三位数码管
//	P0 = 0X00;  // 0000 0000  表示选通所有位数码管WE = 0; // 锁存位选数据DU = 1;  // 打开段选锁存器P0 = 0X4F;  // 0100 1111  显示“3”DU = 0;   // 锁存段选数据while(1){// P0 = 0X01; // 当锁存器中的数值被锁定后,无法直接修改数码管的值,需要打开锁存器才能进行修改}	
}

点亮数码管最后一位数字"8"

#include <reg52.h>
#include <intrins.h>#define uint unsigned int
#define uchar unsigned charsbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选void main(){ // main函数自身会循环WE = 1; // 打开位选锁存器P0 = 0X7F;   // 1111 1000  选通第八位数码管
//	P0 = 0X00;  // 0000 0000  表示选通所有位数码管WE = 0; // 锁存位选数据DU = 1;  // 打开段选锁存器P0 = 0X7F;  // 0111 1111  显示“8”DU = 0;   // 锁存段选数据while(1){// P0 = 0X01; // 当锁存器中的数值被锁定后,无法直接修改数码管的值,需要打开锁存器才能进行修改}	
}

使第三个(从左至右)数码管显示数字 6

#include <reg52.h>
#include <intrins.h>#define uint unsigned int
#define uchar unsigned charsbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选void main(){ // main函数自身会循环P0 = 0X00;   //清除断码WE = 1; // 打开位选锁存器P0 = 0X03;   // 0000 0011  选通第3位、第4位、第5位、第6位、第7位、第8位数码管
//	P0 = 0X00;  // 0000 0000  表示选通所有位数码管WE = 0; // 锁存位选数据DU = 1;  // 打开段选锁存器P0 = 0X7D;  // 0111 1101 对应的数码管字母 acdefg  显示“6”DU = 0;   // 锁存段选数据
}

STC89C52单片机 数码管静态显示-编程知识网