用15单片机点亮7段数码管

7段数码管的硬件如下

实例1:在第一个数码管上显示2的代码如下

#include <STC15F2K60S2.h>
void main()
{
	P2=0XA0;P0=0X00;//关闭蜂鸣器
	P2=0X80;P0=0XFF; //关闭继电器
	P2=0XC0;P0=0X01; //第一个P0=0X01对应DS1第一个位置显示数字
	P2=0XFF;P0=0XFF; //把所有的数码管全关闭。
	while(1)
	{
		P0=0xA4; //    显示数字2;
	}
}

实例2:在第一个数码管上显示0-9的代码如下

#include <STC15F2K60S2.h>
#define uchar unsigned char
uchar i;
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};//??0-9
void delay();
void main()
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; 
	P2=0XC0;P0=0X01;P2=0XF0;P0=0XFF;
	while(1)
	{
		 for(i=0;i<10;i++)
		{
			P0=tab[i];
			delay();
		}
	}
}

void delay()
{
	int i,j;
	for(i=0;i<600;i++)
		for(j=0;j<600;j++);
}

实例3:在8个位置显示任意数字,比如20211225

由数码管的工作原理可知,8个数码管必须轮着亮,所以每个位置都在闪烁,只要闪烁的够快,人眼就感觉不出。

#include <STC15F2K60S2.h>
#define uchar unsigned char
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
void disp(long int dat);
void DelaySMG(unsigned int time);
void main()
{
	P2=0XA0;P0=0X00;  
	P2=0X80;P0=0XFF;
	P2=0;
	while(1)
	{
		disp(20211225);
	}
}
void disp(long int  dat)
{
	int i;
	uchar str[8]; //用来存储8个数
	str[0]=dat/10000000%10;  //2
	str[1]=dat/1000000%10;//0
	str[2]=dat/100000%10;//2
	str[3]=dat/10000%10;//1
	str[4]=dat/1000%10;//1
	str[5]=dat/100%10;//2
	str[6]=dat/10%10;//2
	str[7]=dat/1%10;//5
	for( i = 0 ;i <8;i++)
	{
		
		P2 = P2&0x1f|0xc0;  //设置 P2前三位为110,对应数字6
		P0=0X01<<i;   //0x01
		
		P2 = P2&0x1f|0xe0;
		P0=tab[str[i]];
		
		P2 = P2&0x1f;
		DelaySMG(600);
		P2=P2&0x1f|0xc0;P0=0;	
	}
}

void DelaySMG(unsigned int time)
{
    while(time--);
}

思考下有没有更紧凑的写法?

============================找指导老师布置任务吧==============================