知识链接
一、半导体数码管
半导体数码管是一种半导体发光器件,其基本单元是发光二极管,具有工作电压低、体积小、寿命长、工作可靠、响应速度快、亮度高的优点,广泛应用于各种显示电路中。它的主要应用方式是用发光二极管来组成字形显示数字、字符。数码管实物及原理如图4-1-2所示。

图4-1-2 数码管实物和原理图
半导体数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管(多一个小数点显示),其他的基本相同。半导体数码管,把二极管排列成“日”字,通过控制不同二极管的亮灭来显示不同的数字及字符等。
发光二极管按单元连接方式分为共阴数码管和共阳数码管,内部电路结构如图4-1-3所示。

图4-1-3 七段数码管内部结构图
如图4-1-3(a)所示,共阴数码管是指发光二极管的阴极接到一起形成公共阴极的数码管。应用时就将公共极接到地线(GND)上。当某个字段发光二极管的阳极为高电平时,相应字段就被点亮;当某一字段的阳极为低电平时,相应字段就不亮,称为高电平驱动。
如图4-1-3(b)所示,共阳数码管是指发光二极管的阳极接到一起形成公共阳极的数码管。应用时就将公共极接到+5 V电源上。当某个字段发光二极管的阴极为低电平时,相应字段就被点亮;当某一字段的阴极为高电平时,相应字段就不亮,称为低电平驱动。
例如:如果要在数码管上显示数字“0”,共阴数码管和共阳数码管的编码见表4-1-1。
表4-1-1 数码管编码

可以看到共阳数码管和共阴数码管对同一个数字的编码正好相反。数码管显示字符0—f的段编码见表4-1-2。
表4-1-2 数码管显示字符0—f的段编码

二、数码管的显示方式
按照驱动数码管的不同方法,可以将数码管的显示方式分为静态显示和动态显示。
1.静态显示
静态显示就是在数码管工作时,让数码管持续点亮。在每个数码管的段驱动端都要连接一组8位数据线来保持显示字形。静态驱动的优点是编程简单,显示亮度高。缺点是占用I/O端口较多。例如,驱动8位数码管显示8×8=64个端口,在51单片机可用的I/O端口只有32个。实际应用时必须增加译码器才能完成工作,从而增加了电路设计的复杂性和成本。静态显示一般用于显示位数较少的场合。51单片机系列使用静态显示方式驱动数码管的电路图如图4-1-4所示。
2.动态显示
静态显示时数码管的每一位都是常亮的,而动态显示时,数码管是逐位轮流点亮的,对每一位数码管而言,是每隔一段时间才被点亮一次,利用人眼的视觉暂留原理,看起来多个数码管相当于同时显示了,8位数码管的动态显示驱动电路图如图4-1-5所示。
在动态显示中,数码管的所有同名端驱动端都连接在一起,单片机使用一组I/O端口分别驱动这些段码端,而数码管的每一个位驱动端都由另外一个I/O端口驱动。在显示时单片机轮流向各个数码管送出字形的段码和相应的位码,将多个数码管依次点亮。
动态显示的优点:既能节省单片机的I/O端口,又能简化电路降低硬件成本,因此得到了广泛应用;缺点:数码管的显示亮度比静态显示要低,字符显示有闪烁感,但这些缺点可以通过减小限流电阻、提高程序刷新频率的方法来解决。
(https://www.daowen.com)
图4-1-4 数码管静态显示电路图

图4-1-5 8位数码管动态显示电路图
三、C语言的数组
数组是同一类型变量的有序集合。可以这样理解,就像一个学校的学生在操场上排队,每一个年级代表一个数据类型,每个班级为一个数组,每一个学生就是数组中的一个数据。数组中的每个数据都能用唯一的下标来确定其位置,下标是一维或多维的。就如同在学校的方队中要找一个学生,这个学生在I年级H班X组Y号,那么把这个学生看成在I类型的H数组的(X,Y)下标位置中。
1.数组的定义
数组和普通变量一样,要求先定义才能使用,一维数组和多维数组定义的一般形式为:
数据类型 数组名[常量表达式];
数据类型 数组名[常量表达式1][常量表达式2]……[常表达式n];
“数据类型”是指数组中各数据单元的类型,每个数组中的数据单元只能是同一数据类型。“数组名”是整个数组的标识,其命名方式和变量命名方式一样。在编译时系统会根据数组的大小和类型为变量分配空间,数组名可以说就是所分配空间的首地址的标识。“常量表达式”是表示数组的长度和维数,它必须用“[]”括起来,括号里的数不能是变量,只能是常量。例如:
unsigned char shuma[10];//定义无符号整型一维数组,有10个数据单元
unsigned char data[5][8];//定义无符号整型二维数组,有40个数据单元
在C语言中数组的下标是从0开始,而不是从1开始,如一个具有10个数据单元的数组shuma,它的下标就是从shuma[0]到shuma[9],引用单个元素就是数组名加下标,如shuma[1]就是引用shuma数组中的第2个元素。
★注意★
在程序中只能逐个引用数组的元素,不能一次引用整个数组,但是字符型的数组就能一次引用整个数组。
2.数组的赋值
数组中的值,可以在程序运行期间用循环和键盘输入语句进行赋值,但这样做将降低了单片机的工作效率,可以在定义数组的同时,给数组赋初值。
赋初值的方法如下:
数据类型 数组名[常量表达式]={常量表达式};
数据类型 数组名[常量表达式1]……[常量表达式2]={{常量表达式1}……{常量表达式n}};
共阳数码管0-9段码数组unsigned char shuma[10]={ 0xC0, 0xF9, 0xA4, 0xB0,0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};//数组元素之间用逗号隔开
int a[2][3]={{1,3,5},{2,4,6}};//二维数组赋初值
对部分元素赋初值,例如:
unsigned char lsd[2]= {1};//{1,0}
unsigned int a[2][3]= {{1,2},{2}};//{{1,2,0},{2,0,0}}