任务:八个数码管分别单独显示0~9的值,然后所有数码管一起显示0~F的值,反复执行。
效果如下:(不能上传视频大概就是这个效果然后循环显示)
![](https://img-blog.csdnimg.cn/img_convert/2ea158a60f44c6bda82f040be30b58c2.jpeg)
原理图:
![](https://img-blog.csdnimg.cn/img_convert/ebe76905ebd39bd4141d2cfd85c778ef.jpeg)
数码管:
![](https://img-blog.csdnimg.cn/img_convert/2720f8fda870657ec51cedd689ae18a8.png)
按发光二极管单元连接方式可分为共阳极数码管和 共阴极数码管 。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
1️⃣位选:简单来说就是选择8个数码管中的哪一个来显示数字。当对应的com口输出高电平时就选中了这个数码管来显示。
2️⃣段选:在图中可以看到每一个数码管实际上是由八个小的发光二极管组成,当不同的二极管亮起时数码管就可以显示不同的数字或者字母。而段选的意思就是选择哪几个发光二极管亮哪几个熄灭,从而控制数码管显示不同的数字。
其中由于数码管有共阴共阳之分,想要控制二极管的亮灭需要注意相应引脚电平的输入。
![](https://img-blog.csdnimg.cn/img_convert/79a57f20a3e9c6f3b9053ae07bc8cb97.jpeg)
图中可以看出,共阴数码管的阴极连到一起,当相应的引脚输出高电平时二极管亮起,同理,共阳极数码管则需要相应引脚输出低电平二极管才能亮。
3️⃣段码:上面说了如何使数码管显示数字,但是如果逐个二极管去推它的状态的话未免也太麻烦了,所以就有了段码,方便我们编程时直接使用。
说了这么多那么怎么来实现这个任务呢:
第一步,通过三八译码器选择Y6,Y7来控制数码管的段选和位选。
第二步,将提前准备好的段码写入打开的数码管中。
.........
具体看代码部分。
代码实现:
#include"reg51.h"
sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;
unsigned char duanxuan[16] =
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e
};
void Delay(unsigned int t)
{
while(t--);
}
void ChooseHC138(unsigned int n)
{
switch(n)
{
case 4:
HC138_C = 1;
HC138_B = 0;
HC138_A = 0;//使Y4输出高电平
break;
case 5:
HC138_C = 1;
HC138_B = 0;
HC138_A = 1;//使Y5输出高电平
break;
case 6:
HC138_C = 1;
HC138_B = 1;
HC138_A = 0;//使Y6输出高电平
break;
case 7:
HC138_C = 1;
HC138_B = 1;
HC138_A = 1;//使Y7输出高电平
break;
}
}
void showSEG(unsigned char all,unsigned int num)
{
ChooseHC138(6);//位选
P0 = 0x01 << all;
ChooseHC138(7);//段选
P0 = num;
}
void displaySEG()
{
unsigned int i,j;
for(i = 0; i < 8; i++)
{
for(j = 0; j < 10; j++)
{
showSEG(i,duanxuan[j]);
Delay(60000);
Delay(60000);
}
}
for(j = 0; j < 16; j++)
{
ChooseHC138(6);//位选
P0 = 0xff;
ChooseHC138(7);//段选
P0 = duanxuan[j];
Delay(60000);
Delay(60000);
}
}
int main()
{
while(1)
{
displaySEG();
}
}
好了,以上就是代码实现部分,虽然没用什么高级的东西,但看起来还是比较容易理解的。