找回密码
 立即注册

QQ登录

只需一步,快速开始

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

回转扫描法取按键值的问题

[复制链接]
跳转到指定楼层
楼主
ID:68618 发表于 2014-11-22 15:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void Key_Check(void)
   {
       Key_Status=Scan_Store_Key();
      if((Key_Status>0)&&(Key_Status<13))
      {
          if(Key_Status==10)//*存包键
           {
                STORE_CLR;
                STORE_OUT;
                Delay_us(50);
                STORE_SET;
                Delay_us(100);
                STORE_CLR;//RISING一次,启动M64 INT6中断
           }  
         else if(Key_Status==12)//#取包键
          {
                Code_Buf_Init();
                Time_Wait=0;//按键间隔时间5秒以上没反应退出
                Code_Buf[0]=0x03;
                SN=1;  
                LED_GREEN_OUT;
                LED_GREEN_ON;   
                while(1)
                 {
                         Key_Status0=Scan_Key();//2ms扫描一次
                        if((Key_Status0>0)&&(Key_Status0<13))
                         {
                               if((Key_Status0==10)||(Key_Status0==12))//*,#,直接退出
                                {
                                       Time_Wait=0;
                                       Code_Buf[SN]=0x41;
                                       //SPI_Send(Code_Buf[SN]);//M64里判断如果有10出现则代表直接退出
                                       SN++;
                                       Code_Buf[SN]=0x06;
                                       //SPI_Send(Code_Buf[SN]);
                                       Check_Sum(&Code_Buf[0],&Check_Buf[0]);
                                      //SPI_Send(Check_Buf[0]);
                                      //SPI_Send(Check_Buf[1]);
                                        LED_RED_OUT;
                                        LED_RED_ON;
                                        Delay_ms(500);
                                        LED_RED_OFF;
                                        LED_GREEN_OFF;
                                        break;
                                    }  
                                  else if(Key_Status0==11)
                                    {
                                         Code_Buf[SN]=0x30;
                                         SN++;
                                         //SPI_Send(0x30);
                                         Time_Wait=0;
                                         if(SN>10)
                                          {
                                               Code_Buf[11]=0x06;//完整10位密码
                                               Check_Sum(&Code_Buf[0],&Check_Buf[0]);
                                               //SPI_Send(Check_Buf[0]);
                                               //SPI_Send(Check_Buf[1]);
                                               LED_RED_OUT;
                                               LED_RED_ON;
                                               Delay_ms(1000);
                                               LED_RED_OFF;
                                               LED_GREEN_OFF;
                                               break;
                                             }
                                        }  
                                      else
                                        {
                                             Code_Buf[SN]=DEC_To_ASCII(Key_Status0);
                                             SN++;
                                             Time_Wait=0;
                                             //SPI_Send(Code_Buf[SN]);
                                             if(SN>10)
                                              {
                                                     Code_Buf[11]=0x06;//完整10位密码
                                                     Check_Sum(&Code_Buf[0],&Check_Buf[0]);
                                                     //SPI_Send(Check_Buf[0]);
                                                     //SPI_Send(Check_Buf[1]);
                                                     LED_RED_OUT;
                                                     LED_RED_ON;
                                                     Delay_ms(1000);
                                                     LED_RED_OFF;
                                                     LED_GREEN_OFF;
                                                     break;
                                                 }
                                            }         
                                      }
                                    else
                                      {
                                             Time_Wait++;
                                      }
                                    if(Time_Wait>2500)
                                     {
                                            Code_Buf[SN]=0x06;//密码输入超时退出,M64判断接收的数据是否有10位即可
                                            //SPI_Send(Code_Buf[SN]);
                                            Check_Sum(&Code_Buf[0],&Check_Buf[0]);
                                            //SPI_Send(Check_Buf[0]);
                                            //SPI_Send(Check_Buf[1]);
                                            LED_RED_OUT;
                                            LED_RED_ON;
                                            Delay_ms(2000);
                                            LED_RED_OFF;
                                            LED_GREEN_OFF;
                                            break;
                                      }         
                              }      
                       }
                     else
                       {
                              /*SPI_Send(0x03);//03,30,30,16,37,39,M64 LCD显示请按存包键后存包,按取包键后手动输入
                                                                   数字密码取包
                             SPI_Send(0x30);
                             SPI_Send(0x30);
                             SPI_Send(0x16);
                             SPI_Send(0x37);
                             SPI_Send(0x39);*/
                        }   
                }
         }         
采用了回转扫描法取按键值,现在测试执行下来,基本功能都很正常,就是郁闷的取包键(#)那个功能,第一次按下去,如果5秒钟没键响应或输入满10个密码数字或按了*或#后都能正常退出WHILE循环,但是第二次再按#后,测试下来发现程序居然直接工作了第一个IF判断后马上退出了WHILE循环,红色LED闪半秒,然后再按#,又正常如初,如果10位密码数字没输入完,按了#中途退出,则再按#进入密码输入状态时无这种现象,郁闷,正在用LED测试大法进行排除,看问题到底是出在哪里?                                                                                             
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:26206 发表于 2014-11-22 18:02 | 只看该作者
学习下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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