📄 main.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 + -