数码管介绍
LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件。
数码管引脚定义
一个数码管
四位一体数码管:
138译码器
作用:使用3个io口控制8个输出端。
C是高位B是中间A是低位
数码管原理图
com公共端:
共阴极
- 给阳码:1亮0灭
共阳极
- 给阴码:1灭0亮
点亮数码管思路:
- 控制3个io口使某一个数码管选中。
- 给P0口断码数据
C语言知识点
- 数组:把相同类型的一系列数据统一编制到某一个组别中,可以通过数组名+索引号简单快捷的操作大量数据。
int x[3]; //定义一组变量(3个)
int x[]={1,2,3}; //定义一组变量并初始化
x[0] //引用数组的第0个变量
x[1] //引用数组的第1个变量
x[2] //引用数组的第2个变量
引用x[3]时,数组越界,读出的数值不确定,应避免这种操作
- 子函数:将完成某一种功能的程序代码单独抽取出来形成一个模块,在其它函数中可随时调用此模块,以达到代码的复用和优化程序结构的目的。
void Function(unsigned char x, y)
{
}
返回值 函数名(形参)
{
函数体
}
静态数码管显示
#include <REGX52.H>
unsigned char Nixietable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数组断码表
void Nixie(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}//数码管位置
P0=Nixietable[Number];//引用断码
}
void main()
{
Nixie(7,4);//第7个数码管显示4
while(1)
{
}
}
数码管断码表
0 1 2 3 4 5 6 7 8 9
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,
A B C D E F 空
0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x00,
动态数码管显示
#include <REGX52.H>
unsigned char Nixietable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数组断码表
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void Nixie(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}//数码管位置
P0=Nixietable[Number];//引用断码
Delay(1);
P0=0x00;//清零防止显示数据串位
}
void main()
{
while(1)
{
Nixie(1,1);
//Delay(20);
Nixie(2,2);
//Delay(20);
Nixie(3,3);
//Delay(20);
}
}
重点:
- 重影和消影问题
- 因为位选P2口和段选P0口并不是在同一时间赋值导致存在时差,量的累积最后达到质变(看见重影)
所以需要通过代码 P0=0x00; 将段选清零(无显示)
位选 段选 (清零)位选 段选 (清零)位选 段选
- 从一次实验结果可以看出实际上只要有代码Delay(1); 延时一毫秒实验就可以成功,亮度也很亮,但实际上这个位选和段选依然存在时差
- 这个也有量的累积最后达到质变,但是相对于延时显示的1ms来说太短了,人眼无法捕捉
所以没得重影
数码管驱动方式