⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 由键盘输入八个四位整数
💻 C
字号:
/*由键盘输入八个四位整数,排序后由LED依次显示出,间隔2.5秒*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint block[8],tt=0;
uchar num,temp;
uchar keyscan();
void delay(uint z);
void input(uchar n);
void display(uint shu);
void display1(uint shu);
void paixu();
/******************************************************************************************************/
                                      //主函数
void main()
{   uchar m;
    while(1)
	{	for(m=0;m<8;m++) 
		{
			input(m);
		}
		paixu();
	    for (m=0;m<8;m++)
	    {
	       display1(block[m]);
	                 
	    }
	    P0=0xFF;
	}	
}

//******************************************************************************************************
                                     //子函数集


//*****************************************
//键盘输入子程序
uchar keyscan()
{
	while(1)
    //********************************			
	{	P2=0xfe;   									//初始化P2口,并且动态扫描第一行
		temp=P2;									
		temp=temp&0xf0;								//屏蔽低位
		while(temp!=0xf0)							//判断是否有按键
			{
				delay(10);							//利用延时子程序,软件消抖
				temp=P2;
				temp=temp&0xf0;
				while(temp!=0xf0)
				{
					temp=P2;
					switch(temp)                        //判断按键,并赋值
						{
							case 0xee:num=1;
								break;
							case 0xde:num=2;
								break;
							case 0xbe:num=3;
								break;
							case 0x7e:num=4;
								break;
						}
				while(temp!=0xf0)                   //利用延时子程序,软件消抖
					{
						temp=P2;
						temp=temp&0xf0;
					}
				}
				P2=0xf0;                            //使P2口的值为无按键状态,为进入display()准备
                return num;
			}
		//***************************
			P2=0xfd;									//初始化P2口,并且动态扫描第二行
			temp=P2;
			temp=temp&0xf0;
			while(temp!=0xf0)
				{
					delay(10);
					temp=P2;
					temp=temp&0xf0;
					while(temp!=0xf0)
					{
						temp=P2;
						switch(temp)
							{
								case 0xed:num=5;
									break;
								case 0xdd:num=6;
									break;
								case 0xbd:num=7;
									break;
								case 0x7d:num=8;
									break;
							}
					while(temp!=0xf0)
						{
							temp=P2;
							temp=temp&0xf0;
						}
					}
					P2=temp;
					return num;
				}
		
		//************************************
			P2=0xfb;									//初始化P2口,并且动态扫描第三行
			temp=P2;
			temp=temp&0xf0;
			while(temp!=0xf0)
				{
					delay(10);
					temp=P2;
					temp=temp&0xf0;
					while(temp!=0xf0)
					{
						temp=P2;
						switch(temp)
							{
								case 0xeb:num=9;
									break;
								case 0xdb:num=0;
									break;
								case 0xbb:num=11;  			 //返回此值时要先判断,是否为11
									break;					 //11--确认输入,进行下一次输入
								
							}
							while(temp!=0xf0)
								{
									temp=P2;
									temp=temp&0xf0;
								}
					}
						P2=temp;
						return num;
				 	}
				}
	

}
//***************************************************
//输入子程序,将输入的小于9999的数存储到block数组中
void input(uchar n)
{   
    uchar wei[4]=0,i=0;                                  //3--个位,2--十位,1--百位,0--千位.....
    uint quan=1;                                         //设定权值初值
	num=keyscan();
	while(num!=11)                                       //判断是否按下确认键
		{ 	 
			wei[i]=num;                                  //将个十百千放入数列中
            block[n]=wei[0]*quan+wei[1]*quan/16+wei[2]*quan/256+wei[3]*quan/4096;
			display(block[n]);                           //同步显示
 			num=keyscan();                               //输入下一位
			quan=quan*16;                                //权值增倍
            i++;
		}                                                  
    P0=0xFF;                                             //关闭数码管
   
}
//**************************************************
//显示子程序
void display(uint shu)
{
	uchar qian,shi,bai,ge;
    qian=shu/4096;										 //分离千位
	bai=shu%4096/256;									 //分离百位
	shi=shu%256/16;										 //分离十位
    ge=shu%16;											 //分离个位
	while((P2&0xf0)==0xf0)                               //无键按下,保持显示状态(动态显示)
		{
			if(qian!=0) P0=qian;                         //判断千位是否为零,不为零并显示
			delay(2);									 
			if((bai!=0)||(qian!=0)) P0=bai+0x10;         //判断百,千位是否为零,不为零并显示
			delay(2);
			if((bai!=0)||(qian!=0)||(shi!=0)) P0=shi+0x20;//判断十,百,千位是否为零,不为零并显示
            delay(2);
            P0=ge+0x30;
            delay(2);
            
 		}
       
}
//*******************************************
//显示子程序
void display1(uint shu)                                 //与display()大体一致,稍有不同
{   uint tt=0;
	uchar qian,shi,bai,ge;
    qian=shu/4096;
	bai=shu%4096/256;
	shi=shu%256/16;
    ge=shu%16;
	while(tt<500)                                     //tt=500,大约保持2秒种
		{
			if(qian!=0) P0=qian;
			delay(2);
			if((bai!=0)||(qian!=0)) P0=bai+0x10;
			delay(2);
			if((bai!=0)||(qian!=0)||(shi!=0)) P0=shi+0x20;
            delay(2);
            P0=ge+0x30;
            delay(2);
			tt++;
            
 		}
     P0=0xff;                                        //关闭数码管500毫秒,以示区分
     delay(1000);                                      
       
}
//**********************************************
//排序子程序
void paixu()
	{
		uint mid,i,j;
        for (i=0;i<8;i++)
			{
				for (j=0;j<7;j++)
					{
						if(block[j]>block[j+1])
								{
									mid=block[j];
									block[j]=block[j+1];
									block[j+1]=mid;
								}
					}
			}
	}
//*******************************************
void delay(uint p)//延迟时间为p*0.5毫秒
{	
	uint rr;
    tt=0;
	TMOD=0XF1;//设置定时器工作模式为1
	TH0=(65536-500)/256;//设置定时器初始值使定时器中断一次时间为0.5毫秒
	TL0=(65536-500)%256;
	EA=1;//开总中断
	ET0=1;//开定时器0中断
	TR0=1;//开启定时器
	rr=p;
	while(1)
    {	if(tt==rr)
	 	{
			 EA=0;
			 TR0=0;
			 ET0=0;
			 tt=0;
		     break;
		}
	}
}
void time0() interrupt 1
{
 	TH0=(65536-500)/256;//设置定时器初始值使定时器中断一次时间为0.5毫秒
	TL0=(65536-500)%256;
    tt++;	  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -