久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 24987|回復: 1
打印 上一主題 下一主題
收起左側

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代替。(并未找到原因,歡迎大佬指正)

下面是原理圖和代碼:

  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. uchar duantable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段碼
  4. uchar address[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};                                                //位碼
  5. uchar button[]={0xee,0xde,0xbe,0x7e,
  6.                                                                 0xed,0xdd,0xbd,0x7d,
  7.                                                                 0xeb,0xdb};                                                                                                                //按鍵值
  8. uchar num2[8];//存放輸入的數的十進制數據,方便后面排序
  9. uchar table[8];//存放輸入的數的段碼值
  10. uchar state,i,m,num,j,temp,x=0;
  11. /******************延時************/
  12.                                                                
  13. void delay(uchar n)
  14. {
  15.         for(i=n;i>0;i--)
  16.         for(j=100;j>0;j--)
  17.                 ;
  18. }
  19. /****************按鍵掃描*************/
  20. void buttonscan()
  21. {
  22.         char a=0;
  23.         P3=0x0f;
  24.         if(P3!=0x0f)
  25.         {
  26.                 delay(100);//防抖動
  27.                 if(P3!=0x0f)
  28.                 {
  29.                         state=1;
  30.                         temp=P3;
  31.                         P3=0xf0;
  32.                         temp=temp|P3;
  33.                         for(i=0;i<10;i++)
  34.                         {
  35.                                 if(temp==button[i])
  36.                                 {
  37.                                         num=i;
  38.                                         num2[x]=num;   //將按鍵對應的十進制數保存
  39.                                         x++;
  40.                                         if(x==8)
  41.                                                 x=0;
  42.                                         break;}
  43.                         }
  44.                          while((a<200)&&(P3!=0xf0))    //松手檢測
  45.                                 {
  46.                                         delay(10000);
  47.                                         a++;
  48.                                 }
  49.                                 a=0;
  50.                 }
  51.         }
  52. }
  53. /********************顯示*****************/
  54. void digdisplay()
  55. {
  56.         for(i=0;i<8;i++)
  57.         {
  58.                 P2=address[i];
  59.                 P0=table[i];
  60.                 j=10;              //消影
  61.                 while(j--);
  62.                 P0=0x00;               
  63.         }
  64. }
  65. /*****************排序*****************/
  66. void paixu()
  67. {
  68.         for(i=0;i<7;i++)
  69.         {
  70.                 for(j=0;j<7-i;j++)
  71.         {
  72.                 if(num2[j]<num2[j+1])
  73.                 {
  74.                         temp=num2[j];
  75.                   num2[j]=num2[j+1];
  76.                         num2[j+1]=temp;
  77.                 }
  78.         }//冒泡排序
  79.         }
  80.         for(i=0;i<8;i++)
  81.         {
  82.                 table[i]=duantable[num2[i]]; //用排序完后的num2數組對table中存放的段碼重新賦值,即把段碼排序。
  83.         }
  84.         delay(100);
  85. }
  86. /********************最大值**************/
  87. void max()
  88. {
  89.         paixu();
  90.         for(i=1;i<8;i++)
  91.         table[i]=0;
  92.         delay(100);
  93. }
  94. /*******************主函數*****************/
  95. void main()
  96. {
  97.         state=0;
  98.         while(1)
  99.         {
  100.                 buttonscan();
  101.                 if(state==1)
  102.                 {
  103.                         switch(m)
  104.                 {
  105.                         case (0):table[0]=duantable[num];break;
  106.                         case (1):table[1]=duantable[num];break;
  107.                         case (2):table[2]=duantable[num];break;
  108.                         case (3):table[3]=duantable[num];break;
  109.                         case (4):table[4]=duantable[num];break;
  110.                         case (5):table[5]=duantable[num];break;
  111.                         case (6):table[6]=duantable[num];break;
  112.                         case (7):table[7]=duantable[num];break;
  113.                 }
  114.                 m++;
  115.                 state=0;
  116.                 if(m==8)
  117.                         m=0;       
  118.                 delay(50000);
  119.         }
  120.                 digdisplay();
  121.         if(P1==0xfe)  //開關s1按下則排序
  122.         {
  123.                 delay(100);
  124.                 if(P1==0xfe)
  125.                 {
  126.                         paixu();
  127.                 }
  128.         }
  129.         if(P1==0xfd)  //開關s2按下則顯示最大值
  130.         {
  131.                 delay(100);
  132.                 if(P1==0xfd)
  133.                 {
  134.                         max();
  135.                 }
  136.         }
  137.         }
  138. }
復制代碼




1.png (27.36 KB, 下載次數: 58)

1.png

2.png (23.68 KB, 下載次數: 49)

2.png

3.png (26.24 KB, 下載次數: 49)

3.png

4.png (26.73 KB, 下載次數: 48)

4.png

5.png (38.72 KB, 下載次數: 42)

5.png

排序7.rar

64.21 KB, 下載次數: 33, 下載積分: 黑幣 -5

內有proteus原理圖,keil代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:794466 發表于 2020-7-2 14:20 | 只看該作者
你好 我把你的代碼修改了一下 改成每運行一次就顯示一次排序 但是為什么只能換一次呢 后面按了按鍵一直不變  想請教一下
http://www.zg4o1577.cn/bbs/dpj-191772-1.html
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品国产精品国产专区不卡 | 亚洲男人的天堂网站 | 国产福利在线看 | 日韩精品极品视频在线观看免费 | 欧美三级成人理伦 | 日操夜操 | h视频在线播放 | 精品欧美色视频网站在线观看 | 国产视频第一页 | 午夜影视大全 | 日本特黄a级高清免费大片 特黄色一级毛片 | 国产毛片久久久久久久久春天 | 日本午夜视频 | 精品国产视频 | 久久性av| 亚洲成年人免费网站 | 久久久久久久电影 | 久草成人网 | 中文字幕在线观看第一页 | 天天躁人人躁人人躁狂躁 | www.玖玖玖| 一级黄色毛片a | 高清视频一区二区三区 | 中文字幕在线视频观看 | 精品国产乱码久久久久久丨区2区 | 韩日一区二区三区 | 欧美理伦片在线播放 | 亚洲第一色av | 国产成人网 | 欧美一级艳情片免费观看 | 一区二区三区欧美 | 一级黄色片美国 | 亚洲第一成年免费网站 | 欧美精品片 | 久久777| 中文字幕在线一区二区三区 | 国产精品二区三区在线观看 | 精品久久久久久久 | 精品毛片 | 亚洲综合一区二区三区 | 中文字幕在线国产 |