数码管
数码管概述
共阴极&共阳极(判断用万能表)
限流电阻,控制亮度
共阴极数码码表
74HC573
Z:高阻态;
输出口Q要想输出高低电平OE脚必须接GND;
LE脚为高时,输出端Q随输入端D的数据而变化;
LE脚为低时,输出端Q数据保持不变,输入端D数据变化不会改变Q的数据;
数码管静态显示代码
LED显示器工作方式有两种:静态显示方式和动态显示方式。静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6; //换个名字,不认识^这个符号呢
sbit WE = P2^7;
//void delay(uint z)
//{
// uint x,y;
// for(x = z; x > 0; x--)
// for(y = 114; y > 0 ; y--);
//}
void main()
{
WE = 1;//打开位选锁存器
P0 = 0xfe; //1111 1110 对应WE8~WE1 选中第一个数码管
WE = 0;//锁存位选数据 数据已经送过去了 输入输出之间断开
DU = 1;//打开段选锁存器
P0 = 0x06; //0000 0110
DU = 0;//锁存
while(1)
{
P0 = 0x01;//显示仍为1 不会改变 因为已经锁存
}
}
数码管动态显示代码
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6; //换个名字,不认识^这个符号呢
sbit WE = P2^7;
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void main()
{
while(1)
{
P0 = 0xff;//清楚断码
WE = 1;//打开位选锁存器
P0 = 0xfe; //1111 1110 对应WE8~WE1 选中第一个数码管
WE = 0;//锁存位选数据 数据已经送过去了 输入输出之间断开
DU = 1;//打开段选锁存器
P0 = 0x06; //0000 0110
DU = 0;//锁存段选数据
delay(5);
P0 = 0xff;//清楚断码
WE = 1;//打开位选锁存器
P0 = 0xfd; //1111 1101
WE = 0;//锁存位选数据
DU = 1;//打开段选锁存器
P0 = 0x5b; //0101 1011
DU = 0;//锁存
delay(5);
P0 = 0xff;//清楚断码
WE = 1;//打开位选锁存器
P0 = 0xfb; //1111 1011
WE = 0;//锁存位选数据
DU = 1;//打开段选锁存器
P0 = 0x4f;
DU = 0;//锁存
delay(5);
}
}
函数 数码管显示任意三位数值代码
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6;
sbit WE = P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管段选表0~9,用于给P0口赋值时进制转换
//code表示存放rom区(容量大),table不能重新赋值,不加code的话在ram区,可重新赋值
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void display(uchar i)//0~255 显示函数
{
uchar bai,shi,ge;
bai = i / 100;
shi = i % 100 / 10;
ge = i % 10;
//第一位数码管
P0 = 0xff;//清楚断码
WE = 1;//打开位选锁存器
P0 = 0xfe; //1111 1110
WE = 0;//锁存位选数据
DU = 1;//打开段选锁存器
P0 = table[bai];
DU = 0;//锁存段选数据
delay(5);
//第二位数码管
P0 = 0xff;//清楚断码
WE = 1;//打开位选锁存器
P0 = 0xfd; //1111 1101
WE = 0;//锁存位选数据
DU = 1;//打开段选锁存器
P0 = table[shi]; //0101 1011
DU = 0;//锁存
delay(5);
P0 = 0xff;//清楚断码
WE = 1;//打开位选锁存器
P0 = 0xfb; //1111 1011
WE = 0;//锁存位选数据
DU = 1;//打开段选锁存器
P0 = table[ge];
DU = 0;//锁存
delay(5);
}
void main()
{
while(1)
{
display(211);//改变此处数值即可改变数码管显示的数值
}
}