數字排序 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();
- }
- }
- }
- }
復制代碼
|