找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1663|回复: 0
打印 上一主题 下一主题
收起左侧

普中51单片机数码管矩阵按键计算器代码

[复制链接]
跳转到指定楼层
楼主
ID:886177 发表于 2021-11-2 10:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这里使用的是普中科技的A2开发板,开发板用了一个38译码器来控制数码管,利用数码管动态显示可以实现一个简易计算器的功能。

  1. #include <reg52.h>
  2. #define GPIO_KEY P1
  3. #define u16 unsigned int         
  4. #define u8 unsigned char

  5. sbit LSA=P2^2;
  6. sbit LSB=P2^3;
  7. sbit LSC=P2^4;

  8. u8 b[8]={0,0,0,0,0,0,0,0};

  9. u16 num1,num2,mode;        
  10. int KeyValue;
  11. u8 DisplayData[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};   
  12. u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  
  13. void delay(u16 i)   
  14. {        
  15.         u8 k;
  16.         while(i--)
  17.                 for(k=110;k>0;k--);
  18. }

  19. void KeyDown()   
  20. {
  21.         GPIO_KEY=0x0f;
  22.         if(GPIO_KEY!=0x0f)
  23.         {
  24.                 delay(10);
  25.                 if(GPIO_KEY!=0x0f)
  26.                   {
  27.                            GPIO_KEY=0X0f;
  28.                         switch(GPIO_KEY)
  29.                            {
  30.                             case(0X07): KeyValue=9;break;
  31.                             case(0X0b): KeyValue=8;break;
  32.                             case(0X0d): KeyValue=7;break;
  33.                             case(0X0e): KeyValue=-1;break;
  34.                            }
  35.                            GPIO_KEY=0Xf0;
  36.                            switch(GPIO_KEY)
  37.                            {
  38.                             case(0X70): KeyValue=KeyValue;break;
  39.                             case(0Xb0): KeyValue=KeyValue-3;break;
  40.                             case(0Xd0): KeyValue=KeyValue-6;break;
  41.                             case(0Xe0): KeyValue=KeyValue-9;break;
  42.                            }
  43.            }
  44.            if(KeyValue>=0)                              
  45.            {
  46.                            mode=1;
  47.            }
  48.            else if(KeyValue==-1)   
  49.            {
  50.                            mode=2;
  51.            }
  52.            else if(KeyValue==-4)   
  53.            {
  54.                            mode=3;
  55.            }
  56.            else if(KeyValue==-7)   
  57.            {
  58.                            mode=4;
  59.            }
  60.            else if(KeyValue==-10)   
  61.            {
  62.                            mode=5;
  63.            }
  64.            else if(KeyValue==-2)   
  65.            {
  66.                            mode=6;
  67.            }
  68.            while(GPIO_KEY!=0Xf0)
  69.            {
  70.                            delay(1);
  71.            }
  72.         }               
  73. }

  74. void DigDisplay()  
  75. {
  76.          u8 j;
  77.          for(j=0;j<8;j++)
  78.          {        
  79.                   switch(j)  
  80.                   {
  81.                 case(7):
  82.                                 LSA=1;LSB=1;LSC=1;break;
  83.                         case(6):
  84.                                 LSA=0;LSB=1;LSC=1;break;
  85.                         case(5):
  86.                                 LSA=1;LSB=0;LSC=1;break;
  87.                         case(4):
  88.                                 LSA=0;LSB=0;LSC=1;break;
  89.                         case(3):
  90.                                 LSA=1;LSB=1;LSC=0;break;
  91.                         case(2):
  92.                                 LSA=0;LSB=1;LSC=0;break;
  93.                         case(1):
  94.                                 LSA=1;LSB=0;LSC=0;break;
  95.                         case(0):
  96.                                 LSA=0;LSB=0;LSC=0;break;        
  97.                   }
  98.                   P0=DisplayData[j];
  99.                   delay(1);
  100.                   P0=0x00;
  101.          }
  102. }

  103. void Init_timer0()
  104. {
  105.         TMOD=0x01;
  106.         TH0=0xb8;
  107.         TL0=0x00;
  108.         EA=1;         
  109.         ET0=1;        
  110.         TR0=1;      
  111. }

  112. void output_number(u16*p,u16 t);

  113. void main()
  114. {
  115.         u16 i,f,g=0,d;
  116.         u16 num[8]={0,0,0,0,0,0,0,0};
  117.         Init_timer0();
  118.         while(1)
  119.         {
  120.                 KeyDown();
  121.                 if(mode==1)
  122.                 {
  123.                          for(i=7;i>0;i--)
  124.                         {
  125.                                 b[i]=b[i-1];
  126.                         }
  127.                         b[0]=KeyValue;
  128.                         if(g==0)
  129.                         {
  130.                                 num1=(b[7]*10000000 + b[6]*1000000 + b[5]*100000 + b[4]*10000 + b[3]*1000 + b[2]*100 + b[1]*10 + b[0]);
  131.                         }
  132.                         else
  133.                         {
  134.                                 num2=(b[7]*10000000 + b[6]*1000000 + b[5]*100000 + b[4]*10000 + b[3]*1000 + b[2]*100 + b[1]*10 + b[0]);
  135.                         }
  136.                         for(i=0;i<8;i++)
  137.                         {
  138.                                 if(b[i]!=0)
  139.                                 {
  140.                                         f=i+1;
  141.                                 }
  142.                         }
  143.                         for(i=0;i<f;i++)
  144.                         {
  145.                                 DisplayData[i]=smgduan[b[i]];
  146.                         }
  147.                         mode=0;
  148.                 }
  149.                
  150.                 if(mode==2)
  151.                 {
  152.                         for(i=0;i<8;i++)
  153.                         {
  154.                                 b[i]=0;
  155.                                 DisplayData[i]=0x00;
  156.                         }
  157.                         mode=0;
  158.                         g++;
  159.                         d=1;           
  160.                 }
  161.                 if(mode==3)   
  162.                 {
  163.                         for(i=0;i<8;i++)
  164.                         {
  165.                                 b[i]=0;
  166.                                 DisplayData[i]=0x00;
  167.                         }
  168.                         mode=0;
  169.                         g++;
  170.                         d=2;
  171.                 }
  172.                 if(mode==4)   
  173.                 {
  174.                         for(i=0;i<8;i++)
  175.                         {
  176.                                 b[i]=0;
  177.                                 DisplayData[i]=0x00;
  178.                         }
  179.                         mode=0;
  180.                         g++;
  181.                         d=3;
  182.                 }
  183.                 if(mode==5)  
  184.                 {
  185.                         for(i=0;i<8;i++)
  186.                         {
  187.                                 b[i]=0;
  188.                                 DisplayData[i]=0x00;
  189.                         }
  190.                         mode=0;
  191.                         g++;
  192.                         d=4;
  193.                 }
  194.                 if(mode==6)
  195.                 {
  196.                         if(d==1)
  197.                         {
  198.                                 output_number(num,num1+num2);
  199.                                 for(i=0;i<8;i++)
  200.                                 {
  201.                                         if(num[i]!=0)
  202.                                         {
  203.                                                 f=i+1;
  204.                                         }
  205.                                 }
  206.                                 for(i=0;i<f;i++)
  207.                                 {
  208.                                         DisplayData[i]=smgduan[num[i]];
  209.                                 }
  210.                                 for(i=f;i<8;i++)
  211.                                 {
  212.                                         DisplayData[i]=0x00;
  213.                                 }
  214.                         }
  215.                         if(d==2)               
  216.                         {
  217.                                         output_number(num,num1-num2);
  218.                                         for(i=0;i<8;i++)
  219.                                         {
  220.                                                 if(num[i]!=0)
  221.                                                 {
  222.                                                         f=i+1;
  223.                                                 }
  224.                                         }
  225.                                         for(i=0;i<f;i++)
  226.                                         {
  227.                                                 DisplayData[i]=smgduan[num[i]];
  228.                                         }
  229.                                         for(i=f;i<8;i++)
  230.                                         {
  231.                                                 DisplayData[i]=0x00;
  232.                                         }
  233.                                        
  234.                         }
  235.                         if(d==3)
  236.                         {
  237.                                 output_number(num,num1*num2);
  238.                                 for(i=0;i<8;i++)
  239.                                 {
  240.                                         if(num[i]!=0)
  241.                                         {
  242.                                                 f=i+1;
  243.                                         }
  244.                                 }
  245.                                 for(i=0;i<f;i++)
  246.                                 {
  247.                                         DisplayData[i]=smgduan[num[i]];
  248.                                 }
  249.                                 for(i=f;i<8;i++)
  250.                                 {
  251.                                         DisplayData[i]=0x00;
  252.                                 }        
  253.                         }
  254.                         if(d==4)
  255.                         {
  256.                                 output_number(num,num1/num2);
  257.                                 for(i=0;i<8;i++)
  258.                                 {
  259.                                         if(num[i]!=0)
  260.                                         {
  261.                                                 f=i+1;
  262.                                         }
  263.                                 }
  264.                                 for(i=0;i<f;i++)
  265.                                 {
  266.                                         DisplayData[i]=smgduan[num[i]];
  267.                                 }
  268.                                 for(i=f;i<8;i++)
  269.                                 {
  270.                                         DisplayData[i]=0x00;
  271.                                 }
  272.                         }
  273.                 }

  274.         }
  275. }

  276. void output_number(u16 *p,u16 t)
  277. {
  278.         p[7]=t/10000000;
  279.         p[6]=(t%10000000)/1000000;
  280.         p[5]=((t%10000000)%1000000)/100000;
  281.         p[4]=(((t%10000000)%1000000)%100000)/10000;
  282.         p[3]=(((t%10000000)%1000000)%100000)%10000/1000;
  283.         p[2]=(((t%10000000)%1000000)%100000)%10000%1000/100;
  284.         p[1]=(((t%10000000)%1000000)%100000)%10000%1000%100/10;
  285.         p[0]=(((t%10000000)%1000000)%100000)%10000%1000%100%10;        
  286. }

  287. void timer0() interrupt 1      
  288. {
  289.         TH0=0xb8;         
  290.         TL0=0x00;        
  291.         DigDisplay();
  292.           KeyDown();        
  293. }
复制代码


评分

参与人数 1黑币 +10 收起 理由
admin + 10 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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