找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数码管只显示0,按键无反应,求帮忙

[复制链接]
跳转到指定楼层
楼主
ID:447891 发表于 2019-5-30 09:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5黑币
  1. #include"math.h"
  2. #include "reg51.h"
  3. #define uchar unsigned char
  4. uchar key_temp,key=0,i,j,k,t=0;
  5. uchar a=0,b=0,c=0,d=0;
  6. unsigned long qian,hou;
  7. uchar table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  8. static unsigned char state_key=0;
  9. static unsigned char state_dis=0;


  10. void keyscan()
  11. {
  12.         switch(state_key)
  13. {
  14.         case 0:
  15.          key_temp=(P1&0x0f);
  16.          if(key_temp!=0x0f)
  17.          t=0;
  18.          state_key=1;
  19.    break;
  20.         case 1:
  21.                 if(t>=10)
  22.                 {
  23.                 t=0;
  24.                 if(key_temp==(P1&0x0f))
  25.                 {
  26.                   if(P1^0==0)
  27.                                 key=1;
  28.                         if(P1^1==0)
  29.                                 key=2;
  30.                         if(P1^2==0)
  31.                                 key=3;
  32.                         if(P1^3==0)
  33.                                 key=4;
  34.                 }
  35.                 state_key=2;
  36.                 }
  37.                   
  38.                   else
  39.                         state_key=0;
  40.                         break;        
  41.                
  42.         case 2:
  43.                 if(P1&0x0f==0x0f)
  44.                 {
  45.                 state_key=0;
  46.                 break;
  47.                 }
  48.                 key=0;//default:break;
  49. }

  50. }

  51. void keyaction()
  52. {
  53. switch(key)
  54. {
  55.         case 1:break;
  56.         case 2:i=0;
  57.                      i++;
  58.                if(i>9)
  59.                break;
  60.         case 3:j=0;
  61.                                  if(j<=3)
  62.                                         j++;
  63.                                  switch(j)
  64.                                          {
  65.                                                  case 0:P3=0xfe;i++;break;
  66.                                                  case 1:P3=0xfd;i++;break;
  67.                                                  case 2:P3=0xfb;i++;break;
  68.                                                  case 3:P3=0xf7;i++;break;
  69.                                          }
  70.                                          break;
  71.         case 4: k=0;
  72.                       k++;
  73.                                         if(k==1)
  74.                                         hou=hou+qian;
  75.           qian=0;
  76.           if(k==2)
  77.           hou=hou+qian;
  78.           qian=0;
  79.           k=0;
  80.                                         break;                                       
  81. }
  82. }
  83. void display()
  84. {
  85. switch(j)
  86. {
  87.         case 0:P2=table[a];break;
  88.         case 1:P2=table[b];break;
  89.         case 2:P2=table[c];break;
  90.         case 3:P2=table[d];break;
  91. }
  92. }


  93. void display0()
  94. {

  95.         switch(state_dis)
  96. {
  97.         case 0:a=i;b=0;c=0;d=0;break;
  98.         case 1:b=i;c=0;d=0;break;
  99.         case 2:c=i;d=0;break;
  100.         case 3:d=i;break;
  101. }
  102. display();
  103. }



  104. void time0init()
  105. {
  106. TMOD=0x01;
  107.         TH0=-50000/256;
  108.          TL0=-50000%256;
  109.           EA=1;
  110.            ET0=1;
  111.             TR0=1;
  112. }



  113. void time0()interrupt 1
  114. {
  115. TH0=-50000/256;
  116. TL0=-50000%256;
  117. t++;
  118.                 if(state_dis<=3)
  119.                         state_dis++;
  120.                 else
  121.                   state_dis=0;
  122. if(t<10)
  123. t++;
  124. }




  125. void main()
  126. {
  127.         time0init();
  128.   while(1)
  129.         {
  130.          keyscan();
  131.          keyaction();
  132.          display0();
  133.          switch(j)
  134.          {
  135.                  case 0:qian=a;break;
  136.                  case 1:qian=a+b*10;break;
  137.                  case 2:qian=a+b*10+c*100;break;
  138.                  case 3:qian=a+b*10+c*100+d*1000;break;
  139.          }
  140.         a=0;
  141.         b=0;
  142.         c=0;
  143.         d=0;

  144.         }
复制代码

数码管只显示0,按键无反应,求帮忙

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

使用道具 举报

沙发
ID:542241 发表于 2019-5-30 11:30 | 只看该作者
原理图得提供啊,至少框图有吧,怎么接线的
回复

使用道具 举报

板凳
ID:517466 发表于 2019-5-30 14:35 | 只看该作者
求助之前,自己先别急,静下心来,仔细检查代码有没有错误;程序处理逻辑有没有问题。必要的话,各变量随着处理流程的值变化,列成清单。如果程序是你写的,对于if判断后的处理代码,是不是忘了{}而导致处理流程出问题,一定要检查仔细。我看你的代码,没有注释,不敢肯定有没有问题,但是case中初始化为0,再判断范围,然后加1,这样的处理逻辑很不正常,会导致每次都从0开始计数,if判断后加1.每次都这样,永远不会有2以上的值。
回复

使用道具 举报

地板
ID:80221 发表于 2019-5-30 19:46 | 只看该作者
不要这么用全局变量去传递参数,用函数返回值或者指针。这么写自己看不乱么?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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