打印

按键检测不到了?

[复制链接]
2815|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
victor3l|  楼主 | 2012-7-20 08:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我这样安排函数。在主循环中
while(1)
{
      KeyScan();
      if(keyVal == 4)
      {
               keyVAl = 0;
               SaveZero();
      }
      CalcWght();//计算总重
      WghtDisp();总重显示
}


当调用计算总重的函数后就不能检测按键了,这是为什么?计算总重的函数里面没有死循环,不过它里面都是浮点乘法,是不是他需要的时间久一些,检测不到我按下的键啊?

相关帖子

沙发
shell.albert| | 2012-7-20 08:39 | 只看该作者
CalcWght()该函数肯定很费时间,你使用的单片机没有符点运算功能。
由于你的程序是串行执行的,且使用扫描的方式对按键响应,所以执行CalcWght()时就会丢失对按健的响应。
必须要优化程序结构,使用中断方式对按键进行响应。

使用特权

评论回复
板凳
ayb_ice| | 2012-7-20 08:40 | 只看该作者
按久一点应该可以吧
只能说明程序不够好,受外部事件影响大,构架不好

使用特权

评论回复
地板
victor3l|  楼主 | 2012-7-20 08:43 | 只看该作者
2# shell.albert
我应该用定时器定20Ms,然后等到了时间在中端中检测按键吗?
还有麻烦您指点一下,我这种情况怎么优化程序的结构啊?谢谢

使用特权

评论回复
5
wukunshan| | 2012-7-20 11:08 | 只看该作者
计算总量需要较长时间。按键扫描和耗时程序不能放在一起的。应该把按键扫描和显示重量放在主循环里,把计算总量函数放在定时中断里。注意,定时中断的时间要大于计算重量函数执行的时间。

使用特权

评论回复
6
hopewise| | 2012-7-20 17:30 | 只看该作者
//***************主程序区*******************
void  main()
{
      AUXR=0X00;              //定时器0,1和UART都采用传统的12分频,不用1T功能.
      CLK_DIV=0;               //外接24MHZ晶振,不用分频
      TMOD = 0x02;           //t0方式2:8位自动装载
      TH0 = 0x06;             //t0:(256-6)*1/2us=125us中断一次
      TL0= 6;
      IE = 0x82;                  //10000010:EA&T0
      TR0 = 1;
      //buz_set(1,25);
      //TL1=0xd5;
      //TH1=0x97;
      SCON=0x90;                     //串口工作方式2,并允许串行口接收
      PS=1;                              //串行口中断优先
      PCON=PCON&0x7f;            //串口通信方式的波特率加倍
      EA=1;                              //打开总中断开关
      ET0=1;                            //允许定时器0中断
      //ET1=1;                         //允许定时器1中断
      //TR1=1;
      led1=0x00;
      led2=0x00;
      led3=0x00;
      led4=0x00;
  while(1)
  {
        while(t_us >= 80)                //10ms
        {
              t_us = 0;
              key_scan();                   //按键扫描
              send595(led1,led2,led3,led4);
              key_deal();                   //按键处理
              time_man();                 //时间管理
              dis_man();                   //显示管理
              buz_man();                  //蜂鸣器管理
      }      
  }
}

//*************定时器中断****************
void t0_isr(void) interrupt 1  
{
       t_us ++;
       .......其它内容
}

使用特权

评论回复
7
victor3l|  楼主 | 2012-7-20 19:56 | 只看该作者
6# hopewise

我也想基于时间片轮来做,只是我要做的事情,比较多:要对6路模拟信号进行处理,每路的读,滤波,转换成实际电压,我都写了各自的函数,我还是不能只写一个读函数,一个滤波函数,来分别把六路的做了,所以想您这种方法,我觉得还不会用。

使用特权

评论回复
8
hopewise| | 2012-7-20 20:16 | 只看该作者
之前我一直用汇编的,只是近来换了新工作(要查很多表),现开始学用C来写了。下面是我以前工作的程序结构,内容比较多,大约3500条汇编指令.


;****************主程序区*************
;*************************************
main:   
      mov      a,t_125us
      sub       a,40
      snz       c                            ;到了5mS吗   
      jmp      main                       ;没到,则跳到main
main1:
     clr         t_125us                   ;到了,则清t_125us变量
     snz       halt_b                      ;halt_b 等于1则进入睡眠状态
     jmp       $+2                         ;为0则正常执行指令
     jmp       sleep_man                ;睡眠管理
     clr         wdt                          ;喂狗
     call        IC_TM1637_driver_man      ;IC_TM1637驱动管理         
     call        key_scan_man              ;按键扫描管理
     call       led_out_man                  ;按键led灯输出管理   
     call       open_inspection_man      ;马达开门行程开关检测管理  
     call       close_inspection_man      ;马达关门行程开关检测管理
     call       voltage_chk                    ;电池电压检测管理
     call      time_man                        ;时间管理
     call      motor_man                 ;马达驱动管理(开门)                                 
     call      buz_work                    ;蜂鸣器管理
     call      baojing_man               ;报警输出管理
     call      HM_inspect_man          ;换码开关管理
     call      shuiyin_man               ;水银开关检测管理
     call      key_deal_man             ;按键处理管理  
     call      disp_man                    ;显示管理
     call     door_man                    ;门行程开关管理
     call     auto_man                    ;自动锁门管理(关门)
     jmp    main

使用特权

评论回复
9
cjseng| | 2012-7-21 01:27 | 只看该作者
程序架构不合理吧,我一个51负责动态扫描35位数码管,12个LED指示灯,检测30个按键,再加上和七个变频器modbus通讯,也没有问题啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

308

帖子

5

粉丝