找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 23218|回复: 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, 下载次数: 44)

1.png

2.png (23.68 KB, 下载次数: 36)

2.png

3.png (26.24 KB, 下载次数: 41)

3.png

4.png (26.73 KB, 下载次数: 37)

4.png

5.png (38.72 KB, 下载次数: 36)

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.51hei.com/bbs/dpj-191772-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表