51课程重新学之数码管学习:
一、基本特性
1、作用:显示器件,用来显示数字的,只能显示简单的字母。
分类:单排(1位),联排(4位 8位)。
优点:数码管显示稳定可靠,不易被干扰,多半用在工业领域。
亮灭原理:内部8颗LED的亮灭
二、分类
共阳极数码管(单片机输0亮)与共阴极数码管(单片机输1亮)。8颗LED是可以单独驱动的。
驱动电流的差异:共阳极的数码管单片机引脚是可以直接控制的。共阴极的数码管单片机的引脚的输出电流是不够驱动数码管显示的。
74HC573驱动大电流。
静态数码管与动态数码管:
数码管的段码:数码管的每一段与二进制数的对应关系。
1.7.3显示数字
获取数字的段码
重要的是方法:硬件平台不确定的情况下,断码表是不确定的。
实验测定断码表的对应关系。
1.7.4 0-f依次显示
void main(void)
{
unsigned char i;
unsigned char varry[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xA1,0x86,0x8e};
for(i=0;i<16;i++)
{
if(i == 15)
{
i = 0;
}
P0 = varry[i];
delay();
}
}
注意图片上的代码与图片之上的代码段中的代码的区别!
有区别,一个循环周期结束之后图片中的代码会跳过0的显示。因为当i==15之后,i = 0; i = 0之后又i++了,此时的i == 1;了,因此循环从数组的下标1开始执行。代码段中的就不一样了。
1.7.5动态数码管
静态数码管的优点:简单,好编程。
静态数码管的缺陷:费单片机的端口。因此出现了动态数码管。
段码就是每一个数码管中的一个LED所对应的一个IO的二进制码。
什么样的数码管是动态数码管?
(1)数码管还是原来的数码管(共阴极或共阳极)
(2)段码一侧还是接单片机的IO口
(3)COM(共极)接单片机的一个IO口,多个联排数码管的COM共同接一个单片机的IO。
(4)数码管有两端:COM端与段码端。
(5)动态数码管的点亮:段码端给一个段码值之后,还有COM端给一个值配合数码管才会亮。而静态数码管是段码端给一个值就会亮。
动态数码管是如何工作的?
(1)在某个特定的时间内,联排数码管中只有一个在工作,其他的均在休息(不工作)
(2)COM端选择哪个数码管工作,段码端输出这个数码管要显示的内容;延时,COM端选择下一个要工作的数码管,同时段码端输出要显示的内容的段码值,延时;……
(3)快速切换工作的数码管,则给人的感觉是所以的数码管都在亮,亮度是比静态数码管低的
(4) 动态数码管利用了人的视觉暂留
搞清楚2点:
第一,宏观上所有的数码管都是同时亮的,所以人以为所有数码管同时工作,所以多个数码管可以合在一起来显示(譬如显示12345678)。
第二,微观上数码管是依次亮的,我们可以给不同的数码管送不同的段码,所以不同的数码管可以显示不同的数字。所以相当于8个数码管的显示是独立的。
1.7.6 动态数码管显示0-F的实现
#include <reg51.h>
//此处的开发板的数码管是共阴的。所以COM端哪一位给0就选中
//那个数码管。
void delay(unsigned char d)
{
unsigned char i,j;
for(i=0; i<d;i++)
for(j=0; j<d; j++);
}
void main(void)
{
unsigned char i;
//段码
//P0端口接的是COM端
//P1端口接的是段码端
unsigned char duanma[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char weima[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
while(1)
{
for(i=0; i<8; i++)
{
P1 = duanma[i];
//P1 = 0x04; //a
//P1 = 0xff;
P0 = weima[i];
delay(10);
P1 = 0x00; //切换状态时用于消影。
}
}
}
1.7.8用三八译码器驱动数码管
74LS138 三个输入8个输出
功能:用三个IO口控制8路输出,节省IO端口。
000 001 010 011 100 101 110 111 (0-7)8种状态。
真值表:
【学会看数据手册:重要的是学方法】