前言
今天学习了静态数码管显示和动态数码管显示,还有C语言的子函数、数组。
一、基本知识
1、数组:
把相同类型的一系列数据统一编制到某一个组别中,可以通过数组名+索引号简单快捷的操作大量数据。
<1>定义数组:
int x[3]; //定义一组变量,3个
int x[]={1,2,3}; //定义一组变量并初始化(注意:对数组的整体赋值只能在定义的时候进行,x[]括号中不写数字的话会自动计算出变量的个数,这里是x[3])
<2>调用数组:
x[0] //引用数组的第0个变量
x[1] //引用数组的第1个变量
x[2] //引用数组的第2个变量
对于有三个变量的数组,引用x[3]时,数组越界,编译器不会报错,但是读出的数值不确定,应避免这种操作。
2、子函数:
将完成某一种功能的程序代码单独抽取出来形成一个模块,在其他函数中可随时调用此模块,以达到代码的复用和优化程序结构的目的。
函数结构:
返回值类型 函数名 (形参/形参列表)
{
函数体
}
函数分为有无参数、有无返回值等类型。
3、共阴极数码管段码表:

4、数码管动态显示的消影:

本质上是硬件反应速度不同步,也就是本来的LED灭但是还没完全灭,而且P0、P2端口值的读取还没来得及更新就已经开始显示了。
5.数码管驱动方式:
<1>单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间
<2>专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可。如TM1640等
二、示例
1.静态数码管显示
参考代码如下:
#include <REGX52.H>
unsigned char NiXieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x6D,0x7D,0x07,0x7F,0x6F};//共阴极数码管
void NieXie(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break; //位选。P2_4,P2_3,P2_2分别对应译码器的三位二进制输入,有效位输出低电平,实现指定位置的数码管显示
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(1,4);
while(1)
{
}
}
2.数码管动态显示
四位一体数码管的动态显示,仍然是每个位置数码管依次显示数值,只是依次显示的时间间隔极短,利用人眼在短时间内观察的特点—视觉暂留,实现视觉上的同时显示。
参考代码如下:
void NieXie(unsigned char Location,Number)
{
switch(Location)
{
...
}
P0=NiXieTable[Number]; //数码管段选,显示具体数字
Delay(1);//如果这里没有延迟,数码管显示的亮度会变暗
P0=0x00;// 实现P0引脚清零。这样在下一个位选语句出现时,P0引脚就不会受到上次段选赋值的影响,即不会在后一位出现上一位的影子。
}
void main()
{
while(1)
{
NieXie(1,1);
NieXie(2,2);
NieXie(3,3);
}
}
疑问:不明白为什么第四位会有影子?如果不加Delay(1);P0=0x00;这两句的话。

总结
8.8号,学习51单片机的第6天,学习不到两小时。
希望继续坚持。
4693

被折叠的 条评论
为什么被折叠?



