今天继续学习。
经过上次的点亮二极管,今天来到点亮数码管,并显示数字
下面是数码管原理图。
数码管显示其实就是里面 有多个发光二极管 组合起来。
每个针脚对应一个 二极管,想如何点亮就给那个二极管对应的针脚 电平。
数码管 分共阴 和共阳 两种, 当时共阴时,跟针脚 高电平 就可以点亮。
数码管静态显示
看下面图,多个数码管 通过第八个针脚 WE* 链接到 U2 这个锁存器上,
其他 针脚 链接到U1Z这个锁存器上。
通过 上面UI,UI2来控制 那个亮 亮什么数字
我的理解
“位选” 指控制 一个数码管上亮那些灯,比如 a bcd 这些。的信号
“段选” 值该使 那个数码管亮
实际 U1 U2 那些“ 数据连接” 都是连接到单片机的P0口,那如何控制 该显示那个呢?
看UI DULA ,U2 WELA ,这个是锁存器的LE口,通过锁存器的功能可以知道,可以通过 这个口的高低电平来控制 Q口的输出,当LE 口 高电平的时候,其他D口传来什么电平 Q口就输出什么电平(并存起来),如果LE口 低电平了,那么 Q口就只会 输出 上次 LE口为高电平时存起来的信号。
看图 UI DULA ,U2 WELA 连上的 是P2口
分别是P2^6 P2^7
我要点亮第二个数码管显示 一个3
分两步
1.需要显示 第二个数码管亮,那么就需要使用段选(U2),第二个 因为 数据位有8位 (D0~07),按高到低排列 第二个就是 (因为使用的数码管是共阴的,段选接的是GND那根 所以这里需要给个低电平才能点着,)那么二进制就是:
11111101
转成十六进制
0xFD
这个就相当于数据,然而U2的D 口,链接的是单片机的P0口,所以
//声明针脚
sbit U2LE = P2^7
//打开锁存器
U2LE = 1;
//把值赋予U2
P0=0xFD
//关闭 锁存器
U2LE = 0;
这个时候 U2 Q端 就会输出 0xFD 这个信号给数码管的段选
2. 显示什么样的数字,
上面只是确定了那个数码管显示而已,还没有真正的显示出数字,下面来给 这个数码管输出数字
之前看到 数码管的数字都是由 它的针脚的电平决定 abcd 什么鬼的,引申到U1 后就是 UI1的Q口,对应的U1这个锁存器,LE口和D端来控制 Q端的输出
要显示3,a b c d g 这5个发光二极管需要点亮,那么对应的 U1的D端是 D0 D1 D2 D3 D6 ,这几个口,来排一下,
由于 这个是共阴数码管 ,这个 位选的 需要 给高电平才能亮
所以 上面 亮3这个数字
11110010 分别对应上面说的额 D0 D1 D2 D3 D6
转成十六进制
0xF2
跟上面的很像去操作 U1这个锁存器
//声明针脚
sbit U1LE = P2^6
//打开锁存器
U1LE = 1;
//把值赋予U1
P0=0xF2
//关闭 锁存器
U1LE = 0;
但是实际上 出现一个问题,妈的蛋点亮后,其他数码管 出现残影?????
后来发现 需要在main 方法最后 用while(1);来执行一个死循环就可以,但是不明白为什么