51的数码管点亮跟发光二级管有相似之处,都是给特殊位送高低电平来控制数码管的显示。数码管的发光原理如下所示:
数码管有共阴极跟共阳极两种,我的板子采用的是共阴极,所以,如果我想让哪个发光管点亮,就给特殊位送高电平1,所以,按照上图,我们可以得知,如果想让显示1,我们就让b,c送高电平,其他均为低电平,所以,显示1的话,按照图上所示,dp~a即为:00000110 b,换算为16进制为:0x06,同理,我们可以得到2,3,4...下面是所得到的1~6的对应发光数:
uchar code duantable[] = { 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d };
6个数码管通过位选去控制哪个数码管亮,通过段选控制数码管的某段亮。
下面的一个程序,让板子上的六个数码管每间隔1ms分别显示1,2,3,4,5,6根据人眼看东西的滞留效应,人眼就看到全部显示的是123456,其实是每个数码管在轮流的闪烁着。
#include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit dula = P2 ^ 6; sbit wela = P2 ^ 7; uchar num = 0; //段选控制,让数码管显示1,2,3,4,5,6 uchar code duantable[] = { 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d }; //位选控制,分别控制第1个,第2个,第3个...亮 uchar code weitable[] = { 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf }; //延时函数 void delay(uint time) { uint x, y; for (x = time; x > 0; x--) for (y = 110; y > 0; y--); } void main() { while (1) { for (; num < 6; num++) { wela = 1; P0 = weitable[num]; wela = 0; dula = 1; P0 = duantable[num]; dula = 0; delay(10); } num = 0; } }
以上程序在板子上测试通过,如有不正,请拍砖。
文章的脚注信息由WordPress的wp-posturl插件自动生成