如何在10位LED数码管显示自己的学号

如题所述

第1个回答  2022-02-01
#include <reg51.h>
unsigned char num,num2=0;//num用于计数,刷新数码管,num2用于选择要显示的数字
unsigned char code display[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数码
unsigned char com[]={0x01,0x02,0x04,0x08};//位选地址

void main()
{
TMOD=0x01;//设置定时器0工作方式1
TH0 = (65536-917)/256; //1ms延时初值计算
TL0 = (65536-917)%256;;
EA=1;//开总中断
ET0=1;//定时器0中断
TR0=1;//开始计时
while(1){
if(num==10){ //定时器中断10次,也就是10ms
num=0; //清零
P1=~com[num2];//送入位选信号
P2=0xff;//消影
P2=display[num2];//送入段选信号
num2++; //num2=0~3,四个数码管轮流显示。
if(num2>=4)
num2=0;
}
}
}

void Timer0() interrupt 1 //定时器中断
{
TH0 = (65536-917)/256; //重新赋值
TL0 = (65536-917)%256;;
num++;//
}

然后就是一个使用点的例子,实现59s的计时,电路图和上边是一样的,直接上代码:
#include <reg51.h>
unsigned char code display[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char com[]={0x01,0x02,0x04,0x08};

unsigned char num,num2=0,time[4];
unsigned int num3;

void main()
{
TMOD=0x01;
TH0 = (65536-917)/256;
TL0 = (65536-917)%256;;
EA=1;
ET0=1;
TR0=1;
time[0]=0;
time[1]=0;
time[2]=0;
time[3]=0;
while(1){
if(num==10){
num=0;
P1=~com[num2];
P2=0xff;
P2=display[time[num2]];
num2++;
if(num2>=4)
num2=0;
}

if(num3==1000)//计数1000次,计时1s
{
time[3]++;//更新第四位
if(time[3]>=10)
{
time[3]=0;
time[2]++;//更新第三位
if(time[2]>=6)
time[2]=0;
}
num3=0;
}
}
}

void Timer0() interrupt 1
{
TH0 = (65536-917)/256;
TL0 = (65536-917)%256;;
num++;
num3++;
}

使用上述代码,就可以实现了
相似回答