搜索
bottom↓
回复: 10

作计数器按键触发中断,每下按键都多加几个数,何解

[复制链接]

出0入0汤圆

发表于 2012-9-21 12:46:48 | 显示全部楼层 |阅读模式
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar shu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9
uchar wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};                         //位选

uchar i=0;
unsigned char b,c,d,j,k,l,m,n,o,p;        //纠正位溢出的变量
unsigned char q,r,s,t,u,v,w,x,y;        //消除计数值的零的变量
int z=-1;

void zhi(void)//最大值的归零
{
j=k=l=m=n=o=p=0;
q=r=s=t=u=v=w=x=y=0;

}

void delay(uint t)//小延时
{
uchar a;
for(;t>0;t--)
for(a=0;a<19;a++);
}


void main()
{ EA=1;                   //按键触发的中断
  EX1=1;
  IT1=1;
while(1)
{
  for(b=0;b<8;b++)
      {if(z+1<i)//本想用if消抖,但发现中断无处不在
        {i=z+1;}
        else
        {z=i;}
           P1=wei[b];//位选
              switch(b)
                   {
                    case   0 :    if(i<10)          //个位加1
                                { P0=shu[i];  
                                 }
                                                        else
                               {i=0;
                                q=1;
                                  j++;
                                  }
                                                 
                                   break;
                        case   1 : if (q==1)                         //十位
                                     {if(j<10)
                                        {
                                                     P0=shu[j];
                                                     }
                                                     else
                                                     {j=0;
                                                         r=1;
                                                     k++;
                                                     }
                                                  }
                                                else
                                                {P0=0x00;}
                                           break;
                        case   2 :   if (r==1)                           //百位
                                     { if(k<10)
                                         {
                                                     P0=shu[k];
                                                     }
                                                     else
                                                     {k=0;
                                                         s=1;
                                                     l++;
                                                      }
                                                  }
                                                 else
                                                  {P0=0x00;}
                                                  break;
                        case   3 :  if (s==1)
                                     {
                                       if(l<10)
                                         {
                                                        P0=shu[l];
                                                      }
                                                      else
                                                      {l=0;
                                                          t=1;
                                                       m++;
                                                       }
                                                   }
                                                 else
                                                  {P0=0x00;}
                                                   break;
                        case   4 :   if (t==1)
                                      {
                                         if(m<10)
                                           {
                                                         P0=shu[m];
                                                           }
                                                        else
                                                        { m=0;
                                                                u=1;
                                                         n++;
                                                         }
                                                   }
                                                 else
                                                  {P0=0x00;}
                                                  break;
                        case   5 :   if (u==1)
                                     {
                                       if(n<10)
                                          {
                                                       P0=shu[n];
                                                        }
                                                       else
                                                       {n=0;
                                                           v=1;
                                                        o++;
                                                        }
                                                                }
                                                 else
                                                  {P0=0x00;}
                                                  break;
                        case   6 :  if (v==1)
                                      {  
                                         if(o<10)
                                           {
                                                         P0=shu[o];
                                                          }
                                                         else
                                                        {o=0;
                                                                w=1;
                                                          p++;
                                                         }
                                                        }
                                                 else
                                                  {P0=0x00;}
                                                   break;
                        case   7 :  if (w==1)
                                      {  
                                        if(p<10)
                                          {
                                                       P0=shu[p];
                                                       }
                                                       else
                                                       {
                                                            zhi();//归零
                                }
                                                           }
                                                        else
                                                        {P0=0x00;}
                                                 break;
                                                                                                 }
                delay(30);
                P0=0x00;
          }
}
}
void into() interrupt 2                 //  按键触发的中断
{
i++;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-9-21 16:07:50 | 显示全部楼层
机械按键由于接触不良,用示波器看的话按下一次会是通断好几次的。你能编程的话就搞个滤波或延时屏蔽程序,收到一个脉冲后延时300毫秒内只能当一次按下就好(当然,200毫秒也可以)。
或者按键触点那接个RC--------------建议用程序啦。

程序的不懂

出0入0汤圆

 楼主| 发表于 2012-9-21 16:52:55 | 显示全部楼层
mercyau 发表于 2012-9-21 16:07
机械按键由于接触不良,用示波器看的话按下一次会是通断好几次的。你能编程的话就搞个滤波或延时屏蔽程序, ...

中断是不容延时的,一旦进入中断就得让CPU停止,而我的程序CPU得一直工作,因为他在扫屏,不扫就会停止屏显,我知道一个成熟的程序员并不是这样来彩取按键的状态,但我是初学的,只能想来这样来控制,用定时器我同样会看到屏会停,但比中断的控制要好,呵还是谢谢你,可能我真的不太会写,

出0入0汤圆

发表于 2012-9-22 08:27:26 | 显示全部楼层
                                                                if((k_jia==0)&&(k_jia_flag==0))         //+
                                {                                  
                                          if(key_time_1ms_ok)  //中断1ms标志
                                          {
                                                   key_time_1ms_ok=0;
                                                  k_jia_press_i++;
                                                  if(k_jia_press_i>50) //50ms
                                                  {
                                                           if(k_jia==0) //确认+按键 按下
                                                           {   
                                                                      k_jia_flag=1; //按下状态
                                                                   count++; //按下次数
                                                                   if(count>9) count=0;
                                                           }
                                                  }                   
                                          }
                                 }
                                 else if(k_jia==1) { k_jia_flag=0;k_jia_press_i=0; }

出0入0汤圆

 楼主| 发表于 2012-9-22 17:10:37 | 显示全部楼层
yao1 发表于 2012-9-22 08:27
if((k_jia==0)&&(k_jia_flag==0))         //+ ...

谢谢,看来我还得深造一断时间

出0入0汤圆

发表于 2012-9-23 14:23:00 | 显示全部楼层
按键何必在中断里去做???

出0入0汤圆

发表于 2012-9-23 14:53:28 | 显示全部楼层
把数码管显示的函数放到定时器中断里去,,主函数里只有扫键盘。然后延时去抖一定要加上去。

出0入0汤圆

 楼主| 发表于 2012-9-23 17:36:49 | 显示全部楼层
试一下,有结果再传上来

出0入0汤圆

 楼主| 发表于 2012-9-23 17:39:28 | 显示全部楼层
lihebb 发表于 2012-9-23 14:23
按键何必在中断里去做???

还是刚学的,会点皮毛,这是我的思路,后来一个朋友介绍来这里的,原来简单的51竟这么强大,

出0入0汤圆

发表于 2012-9-23 17:42:44 | 显示全部楼层
该死的学校,还在教学生用中断做键盘。 都十年+ 了,还没有改。

出0入0汤圆

 楼主| 发表于 2012-9-23 17:57:57 | 显示全部楼层
,,,,,,,,,,,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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