此推文为学习笔记,如果错误麻烦大佬指出更正。
学习内容:学会数码管静态显示,以及学会如何看数据手册,方便以后写代码
数码管其实是LED显示器。分静态和动态显示
静态显示
静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
我的理解:静态显示只能让所有数码管同时显示一个内容
动态显示
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
我的理解:动态显示其实由于人眼分辨率和刷新频率有限,通过一个数码管显示后在他消失前立刻显示下一位,然后循环刷新来达到人眼看过去像是多个数码管同时显示不同内容的目的,但其实每个数码管显示的时间都不一样,只是刷新速度快于我们人眼刷新速度罢了。
数码管的内部结构
由图可见默认情况下共阴极电平为0,想让灯亮就让电平为1。共阳则相反。
下面代码用的是共阴。
数码管锁存芯片74hc573数据
注意此OE上面一横代表低电平有效
锁存芯片数据功能表
此处L——low,低电平。H——high,高电平。X——无论高低电平。
Z——高阻态,既不是高电平也不是低电平。Q0——上次输出状态。
由图可知
当OE引脚为低电平且LE引脚为高电平时,D引脚输出高电平则数码管对应输出引脚Q输出高电平,反之则为低电平。
当OE引脚和LE引脚都为低电平时,无论D引脚输出什么电平,输出引脚Q都保留上一次输出的状态(Q0)
当OE引脚为高电平时,输出引脚Q为高阻态(Z),即高低电平都不是。
锁存芯片在数码管应用
一个芯片负责位选(选择点亮的位置),一个芯片负责段选(选择点亮的数)
通过LE引脚可以看出上边芯片负责位选,下面芯片负责段选
写程序
思路:位选控制位置,段选控制内容
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^7; //位选,注意这里其实是LE引脚
sbit du = P2^6; //段选,注意这里其实是LE引脚,OE接地为低电平使能
uchar 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 //自定义
};
void main()
{
du = 1; //打开段选
P0 = leddata[10]; //内容为“9”
du = 0; //关闭段选,锁存住段选,以防其他数写入导致出错。不会就看回功能表
delay(10);
we = 1; //打开位选,这里是第一位(第一位是首位)
P0 = 0; //参考LED点亮方法,低电平点亮
we = 0; //关闭位选,锁存住位选
while(1);
}