找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1734|回复: 6
收起左侧

数码管只显示四位0,而且按键无反应,应该是单片机程序逻辑上的问题

[复制链接]
ID:447891 发表于 2019-5-29 23:53 | 显示全部楼层 |阅读模式
下面是原程序
  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.                 if(key_temp==(P1&0x0f))
  24.                 {
  25.                   if(P1^0==0)
  26.                                 key=1;
  27.                         if(P1^1==0)
  28.                                 key=2;
  29.                         if(P1^2==0)
  30.                                 key=3;
  31.                         if(P1^3==0)
  32.                                 key=4;
  33.                 }
  34.                 state_key=2;
  35.                 }
  36.                   
  37.                   else
  38.                         state_key=0;
  39.                         break;        
  40.                
  41.         case 2:
  42.                 if(key_temp==(P1&0x0f))
  43.                 {
  44.                 state_key=0;
  45.                 break;
  46.                 }
  47.                 key=0;//default:break;
  48. }

  49. }

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


  92. void display0()
  93. {

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



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



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




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

  141.         }
  142. }
复制代码


数码管只显示四位0,而且按键无反应,应该是逻辑上的问题,实在找不到,求大神!
回复

使用道具 举报

ID:96682 发表于 2019-5-30 06:52 | 显示全部楼层
这源程序明显被阉割过
回复

使用道具 举报

ID:56665 发表于 2019-5-30 08:22 | 显示全部楼层
定时器及中断好像没问题,按键和显示程序认真检查一下,这两者其中一个出问题都会导致显示0而没有其它动作。
回复

使用道具 举报

ID:447891 发表于 2019-5-30 08:27 | 显示全部楼层
wc86110 发表于 2019-5-30 06:52
这源程序明显被阉割过

这是我自己写的程序,通过3位按钮使用计算器
回复

使用道具 举报

ID:319023 发表于 2019-5-30 11:20 | 显示全部楼层
可以自己调试一下, main函数里先把数码管用延时的方式都显示一遍,没有问题再调试按键。刚开始还要多看别人的代码
回复

使用道具 举报

ID:517466 发表于 2019-5-30 14:13 | 显示全部楼层
1、keyaction()函数中
case 2:i=0;
                     i++;
               if(i>9)
               break;
        case 3:j=0;
                                 if(j<=3)
                                        j++;
这样的处理逻辑,每次主函数进入这个函数后,P1^1或者P1^2在按下时,走case 2或case 3的分支,i和j永远都是从0开始,加一次变成1,永远不会有2以后的数字出现?你确定是需要做成这样的逻辑?
2、display()函数中case 1:P2=table[b][b];break;,这个table[b][b]是什么意思?
3、keyscan函数中
case 0:
         key_temp=(P1&0x0f);
         if(key_temp!=0x0f)
         t=0;
         state_key=1;
的处理,无论是否有按钮按下,state_key=1;都会被执行,下次进入case 1的分支,你确定这个逻辑正确?不是应该有按钮按下了,下次才进入case 1,判断是那个按钮按下吗?是不是改成
if(key_temp!=0x0f) {
         t=0;
         state_key=1;
}更合理一些?
按照你现在的扫描逻辑,即使没有按钮按下,case 0,case 1,case 2也会按照顺序全都走一遍!

另外自己的程序,无论是变量的声明,还是代码,都没有注释,即使现在你能看懂。过段时间你再看未必能明白。既然编程,一定要养成写注释的良好习惯。
回复

使用道具 举报

ID:213173 发表于 2019-5-30 14:46 | 显示全部楼层
楼上都是乱猜的,这种最基础最基础的东西都是错的怎么帮你???
                case 1:
                        if(t>=10)
                        {
                                if(key_temp==(P1&0x0f))
                                {
                                        if(P1^0==0)??????????
                                                key=1;
                                        if(P1^1==0)??????????
                                                key=2;
                                        if(P1^2==0)?????????
                                                key=3;
                                        if(P1^3==0)?????????
                                                key=4;
                                }
                                state_key=2;
                        }
                        else
                        state_key=0;
                        break;        
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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