数码管,其内部含有8个LED,其实是由LED组装而成的。
数码管有单个1位的数码管,也有2位或者4位,甚至更多位在一起的。我们可以通过位选端控制我们希望点亮的数码管,可以通过控制段选端输出我们希望输出的数据。
数码管内部的的连接方式,分共阴极和共阳极两种,它们的编码是不一样的。对于不同的硬件连接,其对应的共阴极编码或者共阳极可能也是不一样的。
实验硬件图
开发板上,使用的是两块4位一体的数码管,采用的是共阴极的连接方式。其位选信号(COM端)已经和38译码器(74HC138)输出相连,可以通过控制P22,P23, P24的高低电平信号选择我们需要显示的一位数码管。
源代码如下:
#include "reg52.h" //先进入工程文件夹寻找REG52.H文件。若没有,则进入软件安装路径内进行查找。
//52系列单片机头文件
#include "intrins.h"
typedef unsigned char u8;
u8 temp; //定义一个全局变量
sbit a = P2^2; //38译码器的输入端
sbit b = P2^3; //38译码器的输入端
sbit c = P2^4; //38译码器的输入端
void delay_xms(unsigned int xms)
{
unsigned int i,j;
for(i = xms; i > 0; i--)
for(j = 110; j > 0; j--);
}
unsigned char code table[] = {0x3f, 0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c,
0x39, 0x5e, 0x79, 0x71 }; //定义一个数组,存储共阴极数码管编码
//这里使用了code关键字,这样我们在定义数组的时候就不会占用内存空间。定义了code,那么直接分配程序空间。就是说,编译后,编码占用的是程序存储空间而非内存空间。
void main(void)
{
a = 1;
b = 1;
c = 0;
while(1)
{
u8 i;
for(i=0; i<16; i++) //16个数循环显示
{
temp = table[i];
P0 = temp; //P0端控制段选信号
delay_xms(500);
}
}
}
实验现象: