標題: 51單片機實現8位數碼管實時動態顯示輸入的8位數,并進行排序。 [打印本頁]
作者: 冷瞳啊 時間: 2019-3-25 11:13
標題: 51單片機實現8位數碼管實時動態顯示輸入的8位數,并進行排序。
數字排序
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();
- }
- }
- }
- }
復制代碼
-
1.png
(27.36 KB, 下載次數: 58)
下載附件
2019-3-25 11:05 上傳
-
2.png
(23.68 KB, 下載次數: 49)
下載附件
2019-3-25 11:05 上傳
-
3.png
(26.24 KB, 下載次數: 49)
下載附件
2019-3-25 11:05 上傳
-
4.png
(26.73 KB, 下載次數: 48)
下載附件
2019-3-25 11:05 上傳
-
5.png
(38.72 KB, 下載次數: 42)
下載附件
2019-3-25 11:05 上傳
-
-
排序7.rar
2019-3-25 11:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
64.21 KB, 下載次數: 33, 下載積分: 黑幣 -5
內有proteus原理圖,keil代碼
作者: OKIIKO 時間: 2020-7-2 14:20
你好 我把你的代碼修改了一下 改成每運行一次就顯示一次排序 但是為什么只能換一次呢 后面按了按鍵一直不變 想請教一下
http://www.raoushi.com/bbs/dpj-191772-1.html
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |