今天是第三天,进行数码管显示
138译码器:74LS138译码器可以用于数码管显示驱动电路。通过将二进制代码输入到译码器的输入端,根据译码器的输出状态来控制显示的数字或字符。这样可以简化驱动电路的设计,并提高显示的灵活性和可靠性。
数码管灯链接是共阴极的,,因此需要给其高电平。
通过控制138译码器来选中LED灯,再控制P0口的电平来实现数字。了解了原理,实现这就很简单了
实现这个功能我们可以通过写一个函数来完成,让其变得更方便 我就不啰嗦了,直接上代码,看懂代码基本就弄会原理了
#include
#include
unsigned char Number[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void display(unsigned char lamb,unsigned char number)
{
switch(lamb)//这里就是列举,挺无脑的
{
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=Number[number];//用一个数组表示更方便一点
}
void main()
{
display(6,6);//直接引用函数了,特别爽
while(1)
{
}
}
根据数码管显示的原理,多位数码管显示不同数据其实不是同时显示的,是以扫描的方式显示的,例如上面的原理图我想显示12这个数字,理论上我需要先让第一个显示数字1,第二个显示数字2,这样来回不停的显示并且刷新频率上去的话,利用人眼的视觉暂留效应就可以得到一个显示着12的数码管了。
根据单片机工作原理位选 -->段选-->位选-->段选-->位选 ,位选要比段选快的,所以位选结束了,段选还在上次,
举个例子:我先开控制第一个数码管亮位选信号1,然后送数字1的段选信号,这个时候第一个数码管就成功的显示了数字1了,这个时候我关掉第一个数码管的位选信号,打开第二位的位选信号2,在这一瞬间,2号数码管等于收到了位选信号2和段选信号1,由于段选信号没有更新,所以短暂的亮了一下数字1,接下来段选信号刷新,更新为段选信号2,数码管改显示2。
这里提供两个消影方法,
void main()
{
while(1)
{
display(6,6);
Delay(1);
display(5,7);
Delay(1);
display(4,5);
Delay(1);
}
}
通过加入延时代码,来实现消影,就是利用人眼的缺陷。
这是单独用延时函数
就是用完之后直接消除这段函数
#include
#include "Delay.H"
unsigned char Number[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void display(unsigned char lamb,unsigned char number)
{
switch(lamb)
{
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=Number[number];//取位
Delay(1);
P0=0x00;//清除
}
这也是一种方法;
这是用重置代码
哪个好用不用说了吧 !!!!!
下面就是代码了
#include
#include
void Delay( int x)//延时函数
{
unsigned char data i, j;
while(x)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
x--;
}
}
unsigned char Number[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数组表示数字
void display(unsigned char lamb,unsigned char number)//函数确定管位置(从左到右)和数字
{
switch(lamb)
{
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=Number[number];
Delay(1);
P0=0x00;//消影
}
void main()
{
while(1)
{
display(6,6);
Delay(1);
display(5,7);
Delay(1);
display(4,5);
Delay(1);
}
}
烧录后得到结果如下图
看着很舒服,然后今天就大功告成了!!!!
就用一段歌词共勉吧!!!