8.独立按键和静态数码管课后练习

1.系统上电LED灯全灭,按下S4全开,按下S5全灭,按下S6奇数亮,按下S7偶数亮

#include<STC15F2K60S2.H>
void KEY_Scan(void);
void Delayms(int ms);

void main(void)
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;   //初始化程序,可实现上电全灭
	while(1)
	{
		KEY_Scan();//判断是哪个按键,执行对应的程序
	}
}

void KEY_Scan(void)
{
	if(P33==0)				//S4,LED全开
	{
		Delayms(5);
		if(P33==0)
		{
			P0=0X00;
		}
		while(!P33);
	}
	else if(P32==0)			//S5,LED全灭
	{
		Delayms(5);
		if(P32==0)
		{
			P0=0XFF;
		}
		while(!P32);
	}
	else if(P31==0)			//S6,LED奇数亮
	{
		Delayms(5);
		if(P31==0)
		{
			P0=0XAA;
		}
		while(!P31);
	}
	else if(P30==0)			//S7,LED偶数亮
	{
		Delayms(5);
		if(P30==0)
		{
			P0=0X55;
		}
		while(!P30);
	}
}
//程序的关键在于对8个LED灯对应的一组端口P0的整体赋值
void Delayms(int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
		for(j=845;j>0;j--);
}

2.系统上电数码管依次显示0,1,A,b,C,d,E,F,L字符,每个字符显示间隔1s

#include<STC15F2K60S2.H>
unsigned int num;

void Delayms(int ms);

void main(void)
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;   //初始化程序
	P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;   //数码管初始化程序,打开第一个数码管
	while(1)
	{
		unsigned char tab[]={0XC0,0XF9,0X88,0X83,0XC6,0XA1,0X86,0X8E,0XC7};//定义一个数组保存数码管显示所需要的值
		for(num=0;num<9;num++)//依次显示,num=9后结束for循环,从头开始循环一次
		{
			P0=tab[num];
			Delayms(1000);
		}
	}
}
//利用了for循环,num每次增1,到9归0,利用数组保存所需数码管的值,进行了P0的循环赋值
void Delayms(int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
		for(j=845;j>0;j--);
}

3.尝试编写数码管9秒倒计时,计时完成L1灯点亮

#include<STC15F2K60S2.H>
unsigned char tab[]={0X90,0X80,0XF8,0X82,0X92,0X99,0XB0,0XA4,0XF9,0XC0};
unsigned char num=0;
void Delayms(int ms);

void main(void)
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;   //初始化程序
	while(1)
	{
		P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;   //数码管初始化程序,打开第一个数码管
		if(num<10)
		{
			P0=tab[num];
			num++;
			if(num==10)
			{
				P2=0X80;P0=0XFF;   //LED初始化程序
				P00=0;
				Delayms(1000);
				P00=1;
				num=0;
			}
			Delayms(1000);
		}
	}
}

void Delayms(int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
		for(j=845;j>0;j--);
}

现象:第一个数码管从9~0倒计时,间隔1s,计时结束LED1亮,然后1s后熄灭,重复此过程。
4.尝试编写矩阵键盘程序,数码管依次显示0~F(可以参考之后的关于矩阵键盘的文章,程序是类似的,此篇不再作太多注释说明)

#include<STC15F2K60S2.H>

unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E};
//定义一个数组,保存数码管显示所需的P0值,0~F

void Delayms(int ms);
void KEY_Scan16(void);

void main(void)
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;   //初始化程序
	P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;   //数码管初始化程序,打开第一个数码管
	while(1)
	{
		KEY_Scan16();
	}
}

void Delayms(int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
		for(j=845;j>0;j--);
}

void KEY_Scan16(void)
{
	unsigned char temp;
	//第一列
	P44=0;P42=1;P3=0X7F;	//0111 1111
	temp=P3;
	temp=temp&0X0F;
	if(temp!=0X0F)
	{
		Delayms(5);
		temp=P3;
		temp=temp&0X0F;
		if(temp!=0X0F)
		{
			temp=P3;
			switch(temp)
			{
				case 0X7E:P0=tab[0];break;		//s7 0
				case 0X7D:P0=tab[1];break;		//s6 1
				case 0X7B:P0=tab[2];break;		//s5 2
				case 0X77:P0=tab[3];break;		//s4 3
			}
		}
		while(temp!=0X0F)
		{
			temp=P3;
			temp=temp&0X0F;
		}
	}
	//第二列
	P44=1;P42=0;P3=0XBF;	//1011 1111
	temp=P3;
	temp=temp&0X0F;
	if(temp!=0X0F)
	{
		Delayms(5);
		temp=P3;
		temp=temp&0X0F;
		if(temp!=0X0F)
		{
			temp=P3;
			switch(temp)
			{
				case 0XBE:P0=tab[4];break;		//s11 4
				case 0XBD:P0=tab[5];break;		//s10 5
				case 0XBB:P0=tab[6];break;		//s9  6
				case 0XB7:P0=tab[7];break;		//s8  7
			}
		}
		while(temp!=0X0F)
		{
			temp=P3;
			temp=temp&0X0F;
		}
	}
	//第三列
	P44=1;P42=1;P3=0XDF;	//1101 1111
	temp=P3;
	temp=temp&0X0F;
	if(temp!=0X0F)
	{
		Delayms(5);
		temp=P3;
		temp=temp&0X0F;
		if(temp!=0X0F)
		{
			temp=P3;
			switch(temp)
			{
				case 0XDE:P0=tab[8];break;		//s15 8
				case 0XDD:P0=tab[9];break;		//s14 9
				case 0XDB:P0=tab[10];break;		//s13 10
				case 0XD7:P0=tab[11];break;		//s12 11
			}
		}
		while(temp!=0X0F)
		{
			temp=P3;
			temp=temp&0X0F;
		}
	}
	//第四列
	P44=1;P42=1;P3=0XEF;	//1110 1111
	temp=P3;
	temp=temp&0X0F;
	if(temp!=0X0F)
	{
		Delayms(5);
		temp=P3;
		temp=temp&0X0F;
		if(temp!=0X0F)
		{
			temp=P3;
			switch(temp)
			{
				case 0XEE:P0=tab[12];break;		//s19 12
				case 0XED:P0=tab[13];break;		//s18 13
				case 0XEB:P0=tab[14];break;		//s17 14
				case 0XE7:P0=tab[15];break;		//s16 15
			}
		}
		while(temp!=0X0F)
		{
			temp=P3;
			temp=temp&0X0F;
		}
	}
}

5.尝试编写数码管99秒倒计时程序(具体请看动态数码管一节博客,此处不再作解释)

#include<STC15F2K60S2.H>
unsigned char num=99;
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
unsigned int i=0;

void Delayms(int ms);

void main(void)
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
	while(1)
	{
		i++;
		if(i==500)
		{
			i=0;
			if(num==0)num=100;
			num--;
		}
		P2=0XC0;P0=0X01;P2=0XE0;
		P0=tab[num/10];						
		Delayms(1);
		
		P2=0XC0;P0=0X02;P2=0XE0;
		P0=tab[num%10];
		Delayms(1);
	}
}

void Delayms(int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
		for(j=845;j>0;j--);
}

猜你喜欢

转载自blog.csdn.net/qq_44628230/article/details/104213418