数字排序 1、矩阵键盘K1~K9对应1~9数字,K10为0; 2、通过键盘任意输入8个数字,实时按照输入顺序依次从左到右在数码管上显示; 3、按下S1,已输入的八个数字按照从大到小的顺序在数码管上显示。 4、按下S2,数码管只显示已输入的数字中最大数,显示位置自拟。
设计思路:1.按键扫描:将按键输入的数字的十进制数确定,并存入num2数组中(存的是十进制数,方便比较大小); 2.显示函数,将数组中的段码,对应输出到数码管, 3.排序函数,将输入数字的十进制数排序(并非段码值排序,本人在这里栽了跟头,导致排序出来0>1等错误) 4.主函数,一开始扫描按键,然后将按键输入的十进制数转换成数码管显示的段码并存入table数组中,然后通过显示函数实时输入table数组中存放的数据,之后接两个if判定,若开关s1和s2按下,分别执行排序和最大值函数内容。
*本程序不足之处在于若最开始输入的数据不够8个,则排序之后不足的位数会用0代替。(并未找到原因,欢迎大佬指正)
下面是原理图和代码:
- #include <reg51.h>
- #define uchar unsigned char
- uchar duantable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段码
- uchar address[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码
- uchar button[]={0xee,0xde,0xbe,0x7e,
- 0xed,0xdd,0xbd,0x7d,
- 0xeb,0xdb}; //按键值
- uchar num2[8];//存放输入的数的十进制数据,方便后面排序
- uchar table[8];//存放输入的数的段码值
- uchar state,i,m,num,j,temp,x=0;
- /******************延时************/
-
- void delay(uchar n)
- {
- for(i=n;i>0;i--)
- for(j=100;j>0;j--)
- ;
- }
- /****************按键扫描*************/
- void buttonscan()
- {
- char a=0;
- P3=0x0f;
- if(P3!=0x0f)
- {
- delay(100);//防抖动
- if(P3!=0x0f)
- {
- state=1;
- temp=P3;
- P3=0xf0;
- temp=temp|P3;
- for(i=0;i<10;i++)
- {
- if(temp==button[i])
- {
- num=i;
- num2[x]=num; //将按键对应的十进制数保存
- x++;
- if(x==8)
- x=0;
- break;}
- }
- while((a<200)&&(P3!=0xf0)) //松手检测
- {
- delay(10000);
- a++;
- }
- a=0;
- }
- }
- }
- /********************显示*****************/
- void digdisplay()
- {
- for(i=0;i<8;i++)
- {
- P2=address[i];
- P0=table[i];
- j=10; //消影
- while(j--);
- P0=0x00;
- }
- }
- /*****************排序*****************/
- void paixu()
- {
- for(i=0;i<7;i++)
- {
- for(j=0;j<7-i;j++)
- {
- if(num2[j]<num2[j+1])
- {
- temp=num2[j];
- num2[j]=num2[j+1];
- num2[j+1]=temp;
- }
- }//冒泡排序
- }
- for(i=0;i<8;i++)
- {
- table[i]=duantable[num2[i]]; //用排序完后的num2数组对table中存放的段码重新赋值,即把段码排序。
- }
- delay(100);
- }
- /********************最大值**************/
- void max()
- {
- paixu();
- for(i=1;i<8;i++)
- table[i]=0;
- delay(100);
- }
- /*******************主函数*****************/
- void main()
- {
- state=0;
- while(1)
- {
- buttonscan();
- if(state==1)
- {
- switch(m)
- {
- case (0):table[0]=duantable[num];break;
- case (1):table[1]=duantable[num];break;
- case (2):table[2]=duantable[num];break;
- case (3):table[3]=duantable[num];break;
- case (4):table[4]=duantable[num];break;
- case (5):table[5]=duantable[num];break;
- case (6):table[6]=duantable[num];break;
- case (7):table[7]=duantable[num];break;
- }
- m++;
- state=0;
- if(m==8)
- m=0;
- delay(50000);
- }
- digdisplay();
- if(P1==0xfe) //开关s1按下则排序
- {
- delay(100);
- if(P1==0xfe)
- {
- paixu();
- }
- }
- if(P1==0xfd) //开关s2按下则显示最大值
- {
- delay(100);
- if(P1==0xfd)
- {
- max();
- }
- }
- }
- }
复制代码
|