详细原理可以看这篇博客:
https://blog.csdn.net/hpu_zhn/article/details/83041306
实验软件: Keil5 + Proteus7
实验元件(主要
):
AT89C51 * 1,
7SEG-MPX8-CC-BLUE * 1,
RESPACK-8 * 1
#include
#include
#define LBIT P0 //位型接P0
#define LNUM P2 //字型接P2
//定义数组存在LED的点阵码
unsigned char code ledTab[]={
0x3F, /*0*/
0x06, /*1*/
0x5B, /*2*/
0x4F, /*3*/
0x66, /*4*/
0x6D, /*5*/
0x7D, /*6*/
0x07, /*7*/
0x7F, /*8*/
0x6F, /*9*/
0x40, /*-*/
0x0f, /*I*/
0x38, /*L*/
0x5c, /*O*/
0x1c, /*V*/
0x79, /*E*/
0x6e, /*Y*/
0x5c, /*O*/
0x3e, /*U*/
};
//存放明显位对应的码对应1~8位
unsigned char code tabIndex[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
unsigned char Num[8]={0}; //存放显示的数据
unsigned char Num0[8]={0x00,0x02,0x05,0x0A,0x04,0x01,0x03,0x01};//"4131-025"
unsigned char Num1[8]={0x12,0x11,0x10,0X0F,0x0E,0x0D,0x0C,0x0B};//"UOYEVOLI"
/***********************************
函数名称:Delay_us
函数功能:延时us
输入参数:要延时的微妙数
输出参数:无
***********************************/
void Delay_us(unsigned int time)
{
while(time--);
}
/********************************************************************
函数名称: dynamicLed
函数功能: 实现LED的循环动态显示
输入参数: Counter表示要点亮的LED的个数,取值1~8
Light 灯的亮度的控制,数值越大灯越亮,取值范围0~255
输出参数:无
*********************************************************************/
void dynamicLed(unsigned char Counter,unsigned char Ligh)
{ unsigned char i;
for(i=0;i<Counter;i++)
{
//实现单个LED灯的点亮
LBIT=tabIndex[i%8];
LNUM=ledTab[Num[i]%20];
Delay_us(Ligh);//实现灯亮度的调整
LNUM=0x00;
}
}
/********************************************************************
函数名称: alterDisplay
函数功能: 更换显示数据
输入参数: alter_Flag为0显示Num[0],为1显示Num[1]
输出参数:无
*********************************************************************/
void alterDisplay(bit alter_Flag)
{
unsigned char i;
if(alter_Flag==1)
{
for(i=0;i<8;i++)
Num[i]=Num1[i];
}
else
{
for(i=0;i<8;i++)
Num[i]=Num0[i];
}
}
/********主函数*********/
void main(void)
{
while(1)
{
alterDisplay(1); //输入0为520-1314,输入1为ILoveYou
dynamicLed(8,100);
}
}
修改alterDisplay()中的参数后重新编译后即可得到不同结果
如果不想搞自己拉仿真图,也可以直接用我这个现成的,祝大家装逼成功
链接:https://pan.baidu.com/s/1gnaec7NCR-PIvlWPm5wTkg?pwd=qh4s
提取码:qh4s