前言
在嵌入式系统或微控制器项目中,我们经常需要控制数码管来显示数字或字符。本文的目标是实现在八个七段数码管(共阳极类型)上循环显示数字12345678。接下来,我将详细讲解实现的思路。
正文
首先,我们需要明确功能。下面是具体将要实现的功能:
现在,让我们打开仿真软件和编程软件。再次明确我们的目标,即实现数字在数码管上的循环显示。然后,我们可以根据目标画出相应的仿真图,确保硬件连接和软件编程的正确性。
接下来就可以准备编程了。
首先,我们需要通过xdata关键字定义一些与硬件直接映射的变量,这些变量分别对应8255芯片的控制端口和三个数据端口。8255芯片在这里用作I/O扩展,以控制数码管的各个段和选择当前要显示的数码管。
#include <reg52.h>
#include <stdio.h>
xdata unsigned char COM8255 _at_ 0x8006;
xdata unsigned char PA8255 _at_ 0x8000;
xdata unsigned char PB8255 _at_ 0x8002;
xdata unsigned char PC8255 _at_ 0x8004;
接着,再定义两个关键的数组。tab[]数组存储数字0到F(十六进制)在七段数码管上的编码。这些编码是根据数码管的引脚连接和共阳极特性来确定的,用于控制数码管的各个段是否亮起,从而显示出对应的数字。buff[]数组则用于存储当前要显示的数字序列,初始化为12345678。
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};//0-f
unsigned char buff[8]={1,2,3,4,5,6,7,8} ;
为了控制显示的持续时间,我们还需要实现一个delay()函数。这个函数通过两层循环来产生延迟,外层循环控制延迟的总体长度,内层循环则提供具体的延迟时间。参数z用于控制外层循环的次数,从而控制延迟的长度。
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=255;y>0;y--);
}
为了实现数字序列的循环滚动,需要定义dataFlow()函数。这个函数接收一个字符c作为参数,并将其添加到buff[]数组的末尾,同时将数组中的其他数字向前移动一位。这样,每次调用dataFlow()函数时,buff[]数组中的数字序列都会更新。
void dataFlow(unsigned char c)
{
unsigned char h,s;
h=buff[0];
for(s=0;s<7;s++)
{
buff[s]=buff[s+1];
}
buff[7]=c;
}
display()函数则负责将buff[]数组中的数据显示到数码管上。它通过循环依次将每个数字对应的编码发送到PA8255数据端口,同时控制PB8255数据端口来选择当前要显示的数码管。在每个数码管上显示数字时,都会调用delay()函数来控制显示时间。
void display()
{
unsigned char site=0x01,d;
for(d=0;d<8;d++)
{
PA8255=tab[buff[d]];
PB8255=site;
delay(300);
site<<=1;
}
}
最后,在main()函数中,首先设置COM8255控制端口为0x80,以初始化8255芯片的工作模式。然后,代码进入一个无限循环,在这个循环中,通过dataFlow()和display()函数的配合,实现数字序列12345678在数码管上的循环显示。外层循环控制数字序列的整体更新(从0到9循环),而内层循环则控制每个数字的显示时间。
void main(void)
{
unsigned char j;
COM8255=0x80;
while(1)
{
for(i=0;i<10;i++)
{
for(j=0;j<8;j++)
display();
dataFlow(i);
}
}
}
结语
这样,我们通过精确地控制8255芯片的数据端口和控制端口,以及合理地安排延迟和时间循环,最终实现了在八个七段数码管上循环显示数字12345678的功能。希望这个讲解能帮到你,如果你有任何疑问,欢迎留言!