1.在后四位数码管上显示0~9999
#include<reg52.h>
unsigned char code duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//共阳极数码管的段码表
unsigned char code weima[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsigned char tempdata[8]; //用于存放4位数码管显示数字的段码
void delay(int ms)
{
unsigned char j;
for(;ms>0;ms--)
for(j=125;j>0;j++);
}
void display(unsigned char first,unsigned char num) //数码管显示的原理:一个状态,数码管从左到右依次点亮一个位,多次扫描,人就会看起来是一起亮的
{
unsigned char i;
for(i=0;i<num;i++)
{
P1=0xff; //此处全灭是为了消除重影
P1=weima[i+first];
P0=tempdata[i];
delay(7);
P1=0xff; //此处全灭是为了防止后续程序执行时间过长而使数码管看起来最后一个最亮,前面几个较暗
}
}
void main()
{
long int num,j;
while(1) //此处while和j的循环是让数码管多扫描几次,这样可以使数字跳跃的时间间隔变长
{
j++;
if(j==50)
{
num++;
j=0;
if(num==10000)
num=0;
}
tempdata[0]=duanma[num/1000]; // 在display()中定义了位码是从tempdata[0]开始扫的,所以tempdata[0]是数码管显示的第一位数字
tempdata[1]=duanma[(num%1000)/100];
tempdata[2]=duanma[(num%100)/10];
tempdata[3]=duanma[num%10];
display(4,4); //display()中第一位表示从哪亮,第二位表示亮几位
}
}
2.使用延时函数粗略显示时分秒
#include<reg52.h>
unsigned char code duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//共阳极数码管的段码表
unsigned char code weima[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsigned char tempdata[8]; //用于存放4位数码管显示数字的段码
void delay(int ms)
{
unsigned char j;
for(;ms>0;ms--)
for(j=125;j>0;j++);
}
void display(unsigned char first,unsigned char num)
{
unsigned char i;
for(i=0;i<num;i++)
{
P1=0xff;
P1=weima[i+first];
P0=tempdata[i];
delay(3);
P1=0xff;
}
}
void main()
{
long int num,j;
while(1)
{
j++;
if(j==50)
{
num++;
j=0;
if(num==86400)
num=0;
}
tempdata[0]=duanma[(num/3600)/10];
tempdata[1]=duanma[(num/3600)%10];
tempdata[2]=0xbf;
tempdata[3]=duanma[((num%3600)/60)/10];
tempdata[4]=duanma[((num%3600)/60)%10];
tempdata[5]=0xbf;
tempdata[6]=duanma[(num%60)/10];
tempdata[7]=duanma[(num%60)%10];
display(0,8);
}
}