提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
单片机控制多个数码管显示数字的时候。我们会采用静态显示和动态显示。如果是初学者的话,这篇文章一定会对你有所帮助。
静态显示
多位数码管依然可以静态显示,但是显示时要么只显示一位数码管,否则一体的多位同时显示必须时显示相同内容。当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为它们的段选是连接在一起的,所以送入所有数码管的段选的信号都是相同的,那么他们显示的数字必定一样。(换言之,你可以通过位选控制那个数码管亮,但是亮的同时显示的数字必定相同)
动态显示
位选控制亮不亮,而段选控制显示数字,那怎样显示不同的数字呢?这就利用了人体肉眼观察的能力。
举个例子,假设段选1控制第一位数码管数字显示1,那么在显示第二个数码管是段选控制数码管显示2,而位选控制灯第二位数码管亮,第一位数码管灭。但是给人的感受是第一位数码管并没有灭(实际已经灭了),因为时间太短人体肉眼无法识别。这样就会发现数码管动态显示是向左或向右一位一位点亮。
占用CPU时间不同
1、静态显示:静态显示占用CPU时间少,显示稳定可靠。
2、动态显示:动态显示占用CPU时间长,只要不执行显示程序,就立刻停止显示。
占用 I/O不同
1、静态显示:当静态显示的显示位数较多时,占用I/O较多。
2、动态显示:动态显示使用硬件少,占用 I/O较少。
代码如下(示例):
/**
* @brief :动态显示0到99的数字
* @param :无
* @retval :无
* @author :嘤嘤嘤
* @date :2022-06-22
* */
#include"REGX52.H"
typedef unsigned int uint;
uint SegCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳码表
void DelayMs(uint ms)
{
uint i;
while(ms--)
for(i=0;i<113;i++);
}
void main()
{
uint Count=0;//计数
uint a[2];
while(1)
{
a[0]=Count/10;//显示十位
a[1]=Count%10;//显示个位
P2=SegCode[a[0]];
P3=SegCode[a[1]];
Count++;
if(Count>99)//显示到99就重新开始计数
Count=0;
DelayMs(200);//防止程序运行太快。
}
}
代码如下(示例):
初级版
/**
* @brief :动态显示0到999的数字
* @param :无
* @retval :无
* @author :嘤嘤嘤
* @date :2022-06-22
* */
#include"REGX52.H"
#include
typedef unsigned int uint;
uint dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳码表
void DelayMs(uint ms)
{
uint i;
while(ms--)
for(i=113;i>0;i--);
}
void main()
{
uint i,temp,t=0;
uint a[3];
while(1)
{
a[0]=t/100;//显示百位
a[1]=(t%100)/10;//显示十位
a[2]=t%10;//显示个位
temp=0x80;//控制选通
for(i=0;i<3;i++)
{
P3=_crol_(temp,1);//选通LE
P2=dispcode[a[i]];//显示
DelayMs(5);//延时函数
//根据仿真结果,你可以调节这个时间,会得到一些有趣的结果。家人们可以自行仿真调试。
temp=_crol_(temp,1);
}
t++;
if(t>999)//显示到999就重新开始计数
t=0;
}
}
/**
* @brief :显示76543210
* @param :无
* @retval :无
* @author :嘤嘤嘤
* @date :2022-06-22
* */
#include"reg51.h"
#include
typedef unsigned int uint;
void DelayMs(uint ms)
{
uint i;
while(ms--)
for(i=0;i<113;i++);
}
void main()
{
uint array[]={0x00,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};//控制显示的数字
uint temp=0xfe,i;
while(1)
{
P0=temp; //位码 控制要显示的数字在数码管那个位置显示
for(i=8;array[i]!=0;i--)
{
P2=array[i];//段码 控制显示的数字
DelayMs(5);//可以延长这里的时间,那么就会流动显示。
temp=_crol_(temp,1);
P0=temp;
}
temp=0xfe;
}
}
实验时候,一定要注意观察数码管是共阳还是共阴。只有选对,才会得到正确的结果。并且写代码和画原理图一定要及时保存。不然就会和我一样,重新再来。最后,我为家人们提供了我自己总结的小资料,希望可以减少家人们的学习困难。家人要是感觉资料食用口感还行,可以帮我点个赞。有什么不对的地方,欢迎大家留言指正。
CC:代表共阴 位码0点亮 段码1点亮
CA:代表共阳 位码1点亮 段码0点亮
共阴数码管
1.共阴不带小数点0-F段码为:{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
2.共阴带小数点0-F段码为:{0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};
共阳数码管
1.共阳不带小数点0-F段码为:{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
2.共阳带小数点0-F段码为:{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};