找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1233|回复: 3
收起左侧

单片机C语言怎么让数码管移位显示?

[复制链接]
ID:902125 发表于 2021-4-15 20:02 | 显示全部楼层 |阅读模式
现在数码管最初状态全为0,我想一开始不显示,按下矩阵按钮显示对应的数,然后再按下矩阵按键前一个数左移后面显示新的数字,需要如何改进。
单片机C语言源程序如下:
  1. #include"reg51.h"
  2. typedef unsigned char u8;        
  3. typedef unsigned int u16;

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

  7. #define GPIO_KEY P1
  8. #define GPIO_DIG P0
  9. u16 a,b,c;
  10. u16 KeyValue;        
  11. u16 keyflag,i;      
  12. u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
  13. u8 dat[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
  14. u16 wei[8]={0};   

  15. void delay(u16 i)
  16. {  
  17.      while(i--);
  18. }

  19. void display()   
  20. {   
  21.      LSA=0; LSB=0; LSC=0; GPIO_DIG=smgduan[wei[0]];delay(50); GPIO_DIG=0x00;
  22.      LSA=1; LSB=0; LSC=0; GPIO_DIG=smgduan[wei[1]];delay(50); GPIO_DIG=0x00;
  23.      LSA=0; LSB=1; LSC=0; GPIO_DIG=smgduan[wei[2]];delay(50); GPIO_DIG=0x00;
  24.      LSA=1; LSB=1; LSC=0; GPIO_DIG=smgduan[wei[3]];delay(50); GPIO_DIG=0x00;
  25.      LSA=0; LSB=0; LSC=1; GPIO_DIG=smgduan[wei[4]];delay(50); GPIO_DIG=0x00;
  26.      LSA=1; LSB=0; LSC=1; GPIO_DIG=smgduan[wei[5]];delay(50); GPIO_DIG=0x00;
  27.      LSA=0; LSB=1; LSC=1; GPIO_DIG=smgduan[wei[6]];delay(50); GPIO_DIG=0x00;
  28.      LSA=1; LSB=1; LSC=1; GPIO_DIG=smgduan[wei[7]];delay(50); GPIO_DIG=0x00;
  29. }
  30. void KeyDown(void)
  31. {
  32.     u16 a=0;
  33.     GPIO_KEY=0x0f;
  34.     if(GPIO_KEY!=0x0f)
  35.     {
  36.         delay(1000);
  37.         if(GPIO_KEY!=0x0f)
  38.         {   
  39.             GPIO_KEY=0x0f;
  40.             switch(GPIO_KEY)
  41.             {
  42.                 case(0X07): KeyValue=9;break;
  43.                 case(0X0b): KeyValue=8;break;
  44.                 case(0X0d): KeyValue=7;break;
  45.                 case(0X0e): KeyValue=20;break;
  46.             }
  47.             GPIO_KEY=0xf0;
  48.             switch(GPIO_KEY)
  49.             {
  50.                 case(0X70): KeyValue=KeyValue;break;
  51.                 case(0Xb0): KeyValue=KeyValue-3;break;
  52.                 case(0Xd0): KeyValue=KeyValue-6;break;
  53.                 case(0Xe0): KeyValue=KeyValue-9;break;
  54.             }
  55.                                                 
  56.             if(KeyValue==0 || KeyValue==1 || KeyValue==2 || KeyValue==3 || KeyValue==4 || KeyValue==5 || KeyValue==6 || KeyValue==7 || KeyValue==8 || KeyValue==9)
  57.             {
  58.                keyflag=1;
  59.             }
  60.              while((a<50)&&(GPIO_KEY!=0xf0))
  61.             {
  62.                 delay(1000);
  63.                 a++;
  64.             }
  65.         }
  66.     }
  67. }
  68. void main()
  69. {  
  70.    u16 a=0,b=0,c=0;

  71.    while(1)
  72.    {   
  73.          display();                  
  74.          KeyDown();               
  75.          if(keyflag==1)  
  76.          {                                 
  77.             for(i=7;i>0;i--)            
  78.             {
  79.                                                    wei[i]=wei[i-1];
  80.                                                 }            
  81.             wei[0]=KeyValue;                           
  82.             keyflag=0;                                 
  83.          }

  84.          else if(KeyValue==-1)
  85.          {
  86.               for(i=0;i<8;i++)
  87.               wei[i]=0;              
  88.               display();
  89.         }

  90.         else if(KeyValue==20)     
  91.          {
  92.              a=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;   
  93.              for(i=0;i<8;i++)
  94.              wei[i]=0;
  95.              while(1)                                
  96.              {
  97.                      display();
  98.                      KeyDown();
  99.                      if(KeyValue==-2) break;
  100.                      if(keyflag==1)
  101.                      {  
  102.                         for(i=7;i>0;i--)
  103.                         {wei[i]=wei[i-1];}
  104.                         wei[0]=KeyValue;
  105.                         keyflag=0;
  106.                      }
  107.               }
  108.               b=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;   
  109.              c=a+b;
  110.              wei[0]=c%10;                  
  111.              wei[1]=c/10%10;
  112.              wei[2]=c/100%10;
  113.              wei[3]=c/1000%10;
  114.              wei[4]=c/10000%10;
  115.              wei[5]=c/100000%10;
  116.              wei[6]=c/1000000%10;
  117.              wei[7]=c/10000000%10;

  118.              display();
  119.         }

  120.         else    if(KeyValue==17)      
  121.          {
  122.              a=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;
  123.              for(i=0;i<8;i++)
  124.              wei[i]=0;
  125.              while(1)
  126.              {                                    
  127.                      display();
  128.                      KeyDown();
  129.                      if(KeyValue==-2) break;
  130.                      if(keyflag==1)
  131.                      {  
  132.                         for(i=7;i>0;i--)
  133.                         {wei[i]=wei[i-1];}
  134.                         wei[0]=KeyValue;
  135.                         keyflag=0;
  136.                      }
  137.              }
  138.              b=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;   
  139.              if(a>=b)
  140.              {
  141.                c=a-b;
  142.                wei[0]=c%10;                 
  143.                wei[1]=c/10%10;
  144.                wei[2]=c/100%10;
  145.                wei[3]=c/1000%10;
  146.                wei[4]=c/10000%10;
  147.                wei[5]=c/100000%10;
  148.                wei[6]=c/1000000%10;
  149.                wei[7]=c/10000000%10;
  150.              }
  151.              if(a<b)
  152.              {
  153.                  u16 e=0;
  154.                  c=b-a;
  155.                 wei[0]=c%10;              
  156.                 wei[1]=c/10%10;
  157.                 if(wei[1]==0)
  158.                {
  159.                 wei[1]=16;
  160.                 e=1;
  161.                }
  162.                wei[2]=c/100%10;
  163.                if(wei[2]==0 && e==0)
  164.                 {
  165.                    wei[2]=16;
  166.                     e=1;
  167.                  }
  168.                  wei[3]=c/1000%10;
  169.                     if(wei[3]==0 && e==0)
  170.                     {
  171.                      wei[3]=16;
  172.                      e=1;
  173.                     }
  174.                                 wei[4]=c/10000%10;
  175.                     if(wei[4]==0 && e==0)
  176.                     {
  177.                      wei[4]=16;
  178.                      e=1;
  179.                     }
  180.                      wei[5]=c/100000%10;
  181.                    if(wei[5]==0 && e==0)
  182.                    {
  183.                          wei[5]=16;
  184.                          e=1;
  185.                    }
  186.                    wei[6]=c/1000000%10;
  187.                     if(wei[6]==0 && e==0)
  188.                     {
  189.                      wei[6]=16;
  190.                      e=1;
  191.                     }
  192.                      wei[7]=c/10000000%10;
  193.                     if(wei[7]==0 && e==0)
  194.                     {
  195.                      wei[7]=16;
  196.                      e=1;
  197.                     }
  198.                  }
  199.                  display();
  200.            }

  201.           else   if(KeyValue==14)     
  202.          {
  203.              a=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;
  204.              for(i=0;i<8;i++)
  205.              wei[i]=0;
  206.              while(1)
  207.              {                                      
  208.                      display();
  209.                      KeyDown();
  210.                      if(KeyValue==-2) break;
  211.                      if(keyflag==1)
  212.                      {  
  213.                         for(i=7;i>0;i--)
  214.                         {wei[i]=wei[i-1];}
  215.                         wei[0]=KeyValue;
  216.                         keyflag=0;
  217.                      }
  218.               }
  219.               b=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;   
  220.              c=a*b;
  221.              wei[0]=c%10;                 
  222.              wei[1]=c/10%10;
  223.              wei[2]=c/100%10;
  224.              wei[3]=c/1000%10;
  225.              wei[4]=c/10000%10;
  226.              wei[5]=c/100000%10;
  227.              wei[6]=c/1000000%10;
  228.              wei[7]=c/10000000%10;
  229.              display();
  230.          }

  231.          else  if(KeyValue==11)      
  232.          {
  233.              a=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;
  234.              for(i=0;i<8;i++)
  235.              wei[i]=0;
  236.              while(1)                                 
  237.              {
  238.                      display();
  239.                      KeyDown();
  240.                      if(KeyValue==-2) break;
  241.                      if(keyflag==1)
  242.                      {  
  243.                         for(i=7;i>0;i--)
  244.                         {wei[i]=wei[i-1];}
  245.                         wei[0]=KeyValue;
  246.                         keyflag=0;
  247.                      }
  248.               }
  249.               b=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;   
  250.              c=a/b;
  251.              wei[0]=c%10;                  
  252.              wei[1]=c/10%10;
  253.              wei[2]=c/100%10;
  254.              wei[3]=c/1000%10;
  255.              wei[4]=c/10000%10;
  256.              wei[5]=c/100000%10;
  257.              wei[6]=c/1000000%10;
  258.              wei[7]=c/10000000%10;
  259.              display();               
  260.          }
  261.      }
  262. }
复制代码
回复

使用道具 举报

ID:377210 发表于 2021-4-15 22:49 | 显示全部楼层
建议看一下有关数码管显示方面的内容,掌握方法了,想怎么显示、怎么移动都可以
回复

使用道具 举报

ID:301978 发表于 2021-4-15 23:59 | 显示全部楼层
建一个数组用于数码管显示,比如4位数码管就【4】{;;;} i++
回复

使用道具 举报

ID:213173 发表于 2021-4-16 06:33 | 显示全部楼层
不用写这么复杂,改这样就能达目的。
  1. #include"reg51.h"
  2. typedef unsigned char u8;        
  3. typedef unsigned int u16;
  4. //sbit LSA=P2^2;  
  5. //sbit LSB=P2^3;
  6. //sbit LSC=P2^4;
  7. //#define GPIO_KEY P1
  8. //#define GPIO_DIG P0
  9. //u16 a,b,c;
  10. u8 KeyValue;        
  11. //u16 keyflag,i;      
  12. u8 code smgduan[]={//共阴数码管段码"0~f-."
  13.                 0x3f,0x06,0x5b,0x4f,
  14.                 0x66,0x6d,0x7d,0x07,
  15.                 0x7f,0x6f,0x77,0x7c,
  16.                 0x39,0x5e,0x79,0x71,0x40,0x80};
  17. u8 dat[9];
  18. //u16 wei[8]={0};   

  19. void delay(u16 i)
  20. {  
  21.      while(i--);
  22. }

  23. void KeyDown(void)
  24. {
  25.         static bit sign=0;
  26.         static u8 count=0;
  27.         u8 i;
  28.         P1=0xf0;       
  29.         if(P1!=0xf0)
  30.         {
  31.                 if(++count>=10 && sign==0)
  32.                 {                       
  33.                         sign=1;
  34.                         switch(P1)
  35.                         {
  36.                                 case(0Xe0):KeyValue = 0;break;
  37.                                 case(0Xd0):KeyValue = 1;break;
  38.                                 case(0Xb0):KeyValue = 2;break;
  39.                                 case(0X70):KeyValue = 3;break;
  40.                         }
  41.                         P1=0x0f;
  42.                         switch(P1)
  43.                         {
  44.                                 case(0X0e):KeyValue+= 0;break;
  45.                                 case(0X0d):KeyValue+= 4;break;
  46.                                 case(0X0b):KeyValue+= 8;break;
  47.                                 case(0X07):KeyValue+=12;break;
  48.                         }
  49.                         dat[8]=smgduan[KeyValue];
  50.                         for(i=0;i<8;i++)
  51.                                 dat[i]=dat[i+1];
  52.                 }
  53.         }
  54.         else
  55.         {
  56.                 sign=0;
  57.                 count=0;
  58.         }
  59. }

  60. void display()   
  61. {   
  62.         static u8 i=0;
  63.         P0=0x00;
  64.         P2&=0xe3;
  65.         P2|=(i*4);
  66.         P0=dat[i];
  67.         i=++i%8;
  68. }

  69. void main()
  70. {  
  71.    while(1)
  72.    {   
  73.                 KeyDown();
  74.                 display();
  75.                 delay(100);
  76.         }
  77. }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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