03数码管
数码管
静态显示
根据开发板原理图 数码管由两个锁存器共同控制

型号为74HC573, 接下来看锁存器说明

带上划线的OE, 表示低电平有效
所以看表当OE为高电平时,不论LE D 如何 输出都是高阻态(用Z表示)
当OE为底电平时,LE为低电平时, 此时就锁住了输出值(用Q0 表示) 当OE为底电平时,LE为高电平时, 此时输出随D口变化而变化也就是连通状态
回到我们的锁存器电路图,OE均接地,所以已经是低电平有效。所以我们要控制的就是LE 让她为高电平就变化锁存器里面的值。之后改成低电平来锁住值。
我们的单片机数码管是8位共阴极数码管
U8锁存器是作为位选,U9 锁存器是段选
段选是表示 数码管要显示什么数字 位选(位置选择)是表示 一个8段数码管(每一个8. 作为一段)那些需要点亮
例如我们要显示 从右侧开始 1357段数码管显示数字5
#include <reg52.h>
#include <intrins.h>
void delay(unsigned int z);
sbit DULA = P2^6; // 段选LE控制
sbit WELA = P2^7; // 位选LE控制
unsigned char code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F //"9"
};
void main() {
DULA = 1;
P0 = leddata[5];
DULA = 0;
delay(10);
WELA = 1;
P0 = 0x55;
WELA = 0;
while(1);
}
void delay(unsigned int z) {
unsigned int x,y;
for(x = z; x > 0; x--)
for(y=0; y<125; y++);
}
另一个例子 从0-9 循环显示 每次间隔1s
#include <reg52.h>
#include <intrins.h>
void delay(unsigned int z);
sbit DULA = P2^6;
sbit WELA = P2^7;
unsigned char code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F //"9"
};
void main() {
unsigned int i;
delay(10);
WELA = 1;
P0 = 0x00;
WELA = 0;
while(1){
for(i = 0; i <= 9; i++) {
DULA = 1;
P0 = leddata[i];
DULA = 0;
delay(1000);
}
}
}
void delay(unsigned int z) {
unsigned int x,y;
for(x = z; x > 0; x--)
for(y=0; y<125; y++);
}
动态显示
所谓的动态显示就是利用人眼的视觉 延时误差来让数码管看起来保持不变 例如我们要让左侧 第一个显示1 第二个显示2 在数码管实例图中 WE1 口对应Q0, Q0对应D0,所以将位选的D0 置为0(二进制(大端表示)表示1111 1110),段选设置为1 WE2 对应Q1 Q1对应D1,所以将位选的D1 置为1(二进制(大端表示)表示 1111 1101),段选设置为2 如此快速的往复,即可实现数码管显示1和2。代码如下
#include <reg52.h>
#include <intrins.h>
void delay(unsigned int z);
sbit DULA = P2^6;
sbit WELA = P2^7;
unsigned char code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F //"9"
};
void main() {
while(1){
WELA = 1;
P0 = 0xFE;
WELA = 0;
DULA = 1;
P0 = leddata[1];
DULA = 0;
delay(5);
WELA = 1;
P0 = 0xFD;
WELA = 0;
DULA = 1;
P0 = leddata[2];
DULA = 0;
delay(5);
}
}
void delay(unsigned int z) {
unsigned int x,y;
for(x = z; x > 0; x--)
for(y=0; y<125; y++);
}
下一个例子, 在八个数码管从左到右 一次显示 1 2 3 4 5 6 7 8
#include <reg52.h>
#include <intrins.h>
void delay(unsigned int z);
sbit DULA = P2^6;
sbit WELA = P2^7;
unsigned char code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义
};
unsigned char code dudata[] = {
0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F
};
void main() {
unsigned char i = 0;
while(1){
WELA = 1;
P0 = dudata[i];
WELA = 0;
DULA = 1;
P0 = leddata[i+1];
DULA = 0;
i++;
delay(1);
if (i == 8) {
i = 0;
}
}
}
void delay(unsigned int z) {
unsigned int x,y;
for(x = z; x > 0; x--)
for(y=0; y<125; y++);
}