搜索
bottom↓
回复: 77

贡献AD做的键盘

[复制链接]

出0入0汤圆

发表于 2006-9-7 11:04:36 | 显示全部楼层 |阅读模式
苦于IO口不够用,或者是为了节省排线,没有办法的情况下,用AD做了人键盘!用起来很用,现在把用AD做键盘的思路理了下,以大家共享!下面是原理图:



应该注意的地方:1 键盘需要速度,所以到地的电容不能大了,电容大了会导致采样出问题,因为电压是缓慢变化的哈,我没有用,其它的硬件接法与普通一样的.2 各级分压应该比较均匀,提高精度哈!做20个键应该没有问题的哈,我做了6个,处理起来感觉很不错!3 程序方面要注意啊!特别是需要等待时间再处理的地方,搞不好就会达不到要求!

下面是程序:



拿一个键来说明下处理方法,其它的就都知道了

//UP/DOWN键按下的情况,进行密码输入

  val=AdcConvert(KEY);       //AD转换

if((val>580)&&(val<630)&&!FLOCK&&FBG)   转换值判断

    {Beep();             //喇叭叫一声

         delay3s();

         delay3s();   //延时

      val=AdcConvert(KEY); //再转换,必要要进行的,不然就会出错,道理很简单啊      

         if((val>580)&&(val<630))    //与 上次一样,

            {FUPDOWN_ON;//数码管56显示0,数码6闪烁  //置标志位

             Nokeytime=0;

                 SMG5=0;SMG6=0;S12_OFF;    //输入密码显示内容

                 Disp_ENTE();

                 K_Counter=0;

             F5s_ON;

                 D5S=0;

                 while((val>580)&&(val<630)){val=AdcConvert(KEY);}//等待键弹起

            }         

        }





/********************************************************

Name:     KEYSCAN();

Function: KEYSCAN

*********************************************************/

void  KEYSCAN(void)

{uint val;uchar i=0;

val=AdcConvert(KEY);

val=AdcConvert(KEY);

val=AdcConvert(KEY);

//UP/DOWN键按下的情况,进行密码输入

if((val>580)&&(val<630)&&!FLOCK&&FBG)

    {Beep();

         delay3s();

         delay3s();

         if((val>580)&&(val<630))

            {FUPDOWN_ON;//数码管56显示0,数码6闪烁

             Nokeytime=0;

                 SMG5=0;SMG6=0;S12_OFF;    //输入密码显示内容

                 Disp_ENTE();

                 K_Counter=0;

             F5s_ON;

                 D5S=0;

                 while((val>580)&&(val<630)){val=AdcConvert(KEY);}//等待键弹起

            }         

        }

//SET键的操作:设置密码,设置参数,设置管理参数,修改密码

if((val>220)&&(val<290)&&!FLOCK&&FBG)

{    Beep();

         delay(6000);

         val=AdcConvert(KEY);

         if((val>220)&&(val<290))

            {

             Nokeytime=0;

             FSET_ON;

             Fright1_off;

             F5s_ON;         

             if(FUPDOWN||(Fright&&Fmodi))//UPDOWN标志或密码正确而且要修改密码

                {

                 if(K_Counter<6)  K_Counter++;

             else             K_Counter=1;

             SMG5=K_Counter;

                         S12_OFF;

                 if(K_Counter==1) SMG6=LScode[0];

                 if(K_Counter==2) SMG6=LScode[1];

                 if(K_Counter==3) SMG6=LScode[2];

                 if(K_Counter==4) SMG6=LScode[3];

                 if(K_Counter==5) SMG6=LScode[4];

                 if(K_Counter==6) SMG6=LScode[5];

                } //输入密码          

          

    if(Fright&&!Fmodi)  //UPDOWN标志,密码正确

          {if(K_Counter<5) K_Counter++;else K_Counter=1; SMG5=K_Counter;}//设置密码管理参数                  

  

        if(!FUPDOWN&&!Fright){if(K_Counter<12) K_Counter++;else K_Counter=1;}//正常设置                    

          

        if(K_Counter==1){

                                          if(Fright&&!Fmodi){S12_ON;Disp_CSTS();eprd0cl();}//除霜温度                                                                             

                                          if(!FUPDOWN&&!Fright){S12_ON;Disp_RSTS();DISP_CL(eeprd[5]);}  //热水温度

                                          }

        if(K_Counter==2){

                                          if(Fright&&!Fmodi)//退出除霜温度

                                            {Disp_CSOS();

                                                 F9_OFF;

                                                 S12_ON;

                                                 DISP_CL(eeprd[1]);

                                                }

                                          if(!FUPDOWN&&!Fright)//回差温度

                                                               {Disp_RS__();

                                                                                    DISP_CL(eeprd[6]);

                                                                                        S12_ON;

                                                                                   }  

                                          }

        if(K_Counter==3){

                                          if(Fright&&!Fmodi)

                                            {Disp_HTTS();

                                                 if(eeprd[2]>100){ eeprd[2]&=0X7f;

                                                                   if(eeprd[2]>9){F9_ON;DISP_CL(eeprd[2]);}

                                                                   if(eeprd[2]<10){SMG5=SUBB;SMG6=eeprd[2];F9_OFF;}

                                                                                  }

                                                 else  DISP_CL(eeprd[2]);

                                                 S12_ON;

                                                }//环境温度

                                          if(!FUPDOWN&&!Fright)//来电重启开关

                                             {Disp_ONOF();

                                                  S12_OFF;

                                                  if(Frestar){SMG5=0;SMG6=N;}else  {SMG5=0;SMG6=ZF;S12_OFF;}

                                                 }

                                          }

        if(K_Counter==4){

                                          if(Fright&&!Fmodi)//除霜时间

                                            {Disp_CSTC();

                                                 F9_OFF;

                                                 DISP_CL(eeprd[3]);

                                                 S12_OFF;

                                                }

                                          if(!FUPDOWN&&!Fright){Disp_08__();

                                                                 DISP_CL(hour);

                                                                                         S12_OFF;

                                                                                        } //当前时间小时

                                          }

        if(K_Counter==5){

                                          if(Fright&&!Fmodi) //除霜间隔时间

                                            {Disp_STS8();

                                                 F9_OFF;

                                                 S12_OFF;

                                                 DISP_CL(eeprd[4]);

                                                }

                                          if(!FUPDOWN&&!Fright)//当前时间分钟

                                                                {Disp_10__();

                                                                                         S12_OFF;

                                                                                         DISP_CL(min);}  

                                          }

        if(K_Counter==6){

                                          if(!FUPDOWN&&!Fright&&!Fmodi){//定时开机小时

                                                                        Disp_DONH();

                                                                                                        S12_OFF;

                                                                        DISP_CL(eeprd[9]);                                                                                                       

                                                                                                        }

                                         }

                                         

        if(K_Counter==7){if(!FUPDOWN&&!Fright){//定时开机分钟

                                                 Disp_DONF();

                                                                                         S12_OFF;

                                                                                         DISP_CL(eeprd[10]);

                                                                                        }

                                         }

       

        if(K_Counter==8) //定时开机开关       

                        {Disp_ONOF();

                                         S12_OFF;

                                         if(Fdk) Disp_on();

                                         else    Disp_of();

                                        }

          

        if(K_Counter==9){S12_OFF;Disp_DOFH();DISP_CL(eeprd[12]);}   //定时关机小时

       

        if(K_Counter==10){S12_OFF;Disp_DOFF();DISP_CL(eeprd[13]);}   //定时关机分钟

       

        if(K_Counter==11)//定时关机开关        

                         {Disp_ONOF();

                                          S12_OFF;

                                          if(Fdg) Disp_on();

                                          else    Disp_of();

                                          }

                                          

    if(K_Counter==12){Disp_pb_t();//屏幕保护时间调节

                           DISP_CL(eeprd[16]);

                                          }

          

        D5S=0;

        while((val>220)&&(val<290)){val=AdcConvert(KEY);}

       

        }

}

//UP按键

  if((val>450)&&(val<560)&&!FLOCK&&FBG)

{    Beep();

         F5s_ON;

         delay(60000);

         val=AdcConvert(KEY);

         if((val>450)&&(val<560))

        {

             Nokeytime=0;

             if(!FSET&&!FUPDOWN&&!Fright&&!Fmodi)

                   {

                   if(K_Counter1<4) K_Counter1++;                

                       else             K_Counter1=4;

                           if(K_Counter1==1){FDOWN_OFF;}

                           if(K_Counter1==2)

                                            {FDOWN_ON;

                                                                 Disp_NND();

                                                                 SMG4=2;

                                                                 TEMP_CL(EN_temp,FET_);

                                                                }

                           if(K_Counter1==3)

                                            {FDOWN_ON;

                                                                 Disp_NND();

                                                                 SMG4=3;                                                                 

                                                                 TEMP_CL(PQ_temp,FPQT_);

                                                                }

                           if(K_Counter1==4)

                                            {

                                                                 FDOWN_ON;

                                                                 Disp_NND();

                                                                 SMG4=4;

                                                                 TEMP_CL(LS_temp,FLNT_);

                                                                }

                       }

       

         if(K_Counter==1)

           {

            if(FUPDOWN||(Fright&&Fmodi))//密码加处理

                                            {

                                             if(LScode[0]<9) LScode[0]++;

                                                                         else            LScode[0]=9;

                                                                         SMG6=LScode[0];

                                                                        }

               

                if(Fright&&!Fmodi)//密码管理,除霜温度加处理

                                  {if(eeprd[0]>0) eeprd[0]--;

                                   else           eeprd[0]=0;                                       

                                       eprd0cl();

                                  }

                  

                if(!FUPDOWN&&!Fright&&!Fmodi)//正常参数--热水温度

                                              {if(eeprd[5]<65) eeprd[5]++;

                                                                           else eeprd[5]=65;

                                               DISP_CL(eeprd[5]);

                                              }

           }

          

         if(K_Counter==2)

           {

            if(FUPDOWN||(Fright&&Fmodi))//输入密码

                                            {if(LScode[1]<9) LScode[1]++;

                                                                         else LScode[1]=9;

                                                                         SMG6=LScode[1];

                                                                        }

               

                if(Fright&&!Fmodi)//密码管理,退出温度处理

                                   {if(eeprd[1]<20) eeprd[1]++;

                                                    else eeprd[1]=20;

                                                        DISP_CL(eeprd[1]);

                                                   }       

                  

                if(!FUPDOWN&&!Fright&&!Fmodi)//正常参数--回差温度

                                             {if(eeprd[6]<15) eeprd[6]++;

                                                                          else eeprd[5]=15;

                                              DISP_CL(eeprd[6]);

                                                                         }

           }

          

         if(K_Counter==3)

           {

            if(FUPDOWN||(Fright&&Fmodi))//输入密码

                                            {if(LScode[2]<9) LScode[2]++;

                                                                         else LScode[2]=9;

                                                                         SMG6=LScode[2];

                                                                        }

                if(Fright&&!Fmodi)//密码管理,环境温度处理+1度

                                  {if(HW_counter<20) HW_counter++;

                                   else  HW_counter=20;

                                                   eeprd[2]=EN_TEMP[HW_counter];

                                   HW_dispCL();//调用显示处理程序

                                  }

                if(!FUPDOWN&&!Fright&&!Fmodi)//来电重启开

                                              {

                                               Frestar_ON;

                                                                           Disp_on();

                                                                           eeprd[7]=1;

                                              }   

           }

         if(K_Counter==4)

           {

            if(FUPDOWN||(Fright&&Fmodi))//输入密码

                                             {if(LScode[3]<9) LScode[3]++;

                                                                          else LScode[3]=9;

                                                                          SMG6=LScode[3];

                                                                         }

               

                if(Fright&&!Fmodi)//密码管理,除霜时间加1

                                  {if(eeprd[3]<20) eeprd[3]++;

                                                   else eeprd[3]=20;

                                                   DISP_CL(eeprd[3]);

                                                  }               

                  

                if(!FUPDOWN&&!Fright&&!Fmodi)//当前时间小时

                                              {

                                               if(hour<23) hour++;

                                                                           else hour=23;

                                                                           DISP_CL(hour);

                                              }

               

           }

         if(K_Counter==5)

           {

            if(FUPDOWN||(Fright&&Fmodi))//输入密码

                                             {if(LScode[4]<9) LScode[4]++;

                                                                          else LScode[4]=9;

                                                                          SMG6=LScode[4];

                                                                         }

                  

                if(Fright&&!Fmodi)//密码管理,除霜间隔时间加1

                                  {if(eeprd[4]<60) eeprd[4]++;

                                                   else eeprd[4]=60;

                                                   DISP_CL(eeprd[4]);

                                                  }

                  

                if(!FUPDOWN&&!Fright&&!Fmodi)//当前时间小时

                                              {

                                               if(min<59) min++;

                                                                           else min=59;

                                                                           DISP_CL(min);

                                              }

           }

         if(K_Counter==6)

           {

            if(FUPDOWN||(Fright&&Fmodi))//输入密码

                                             {if(LScode[5]<9) LScode[5]++;

                                                                          else LScode[5]=9;

                                                                          SMG6=LScode[5];

                                                                         }

                if(!FUPDOWN&&!Fright&&!Fmodi)//定时开机小时

                                              {if(eeprd[9]<23) eeprd[9]++;

                                                                           else eeprd[9]=23;

                                                                           DISP_CL(eeprd[9]);

                                                                          }

           }

         if(K_Counter ==7)//定时开机分钟

                          {if(eeprd[10]<59) eeprd[10]++;

                                           else eeprd[10]=59;

                                           DISP_CL(eeprd[10]);

                                          }

          

         if(K_Counter ==8){Fdk_ON;

                            Disp_on();

                                                eeprd[8]=1;

                                           }//定时开机开

         

         if(K_Counter ==9)//定时开机小时

                          {if(eeprd[12]<23) eeprd[12]++;

                                           else eeprd[12]=23;

                                           DISP_CL(eeprd[12]);

                                          }

         if(K_Counter==10)//定时开机分钟

                          {if(eeprd[13]<59) eeprd[13]++;

                                           else             eeprd[13]=59;

                                           DISP_CL(eeprd[13]);

                                          }

          

         if(K_Counter==11)

                          {Fdg_ON;

                                           Disp_on();

                                           eeprd[11]=1;

                                           }//定时关机开

         if(K_Counter==12){       

                        if(eeprd[16]<20) eeprd[16]++;

                        else             eeprd[16]=20;

                                                DISP_CL(eeprd[16]);

                           }

         D5S=0;

         while((val>450)&&(val<560)){val=AdcConvert(KEY);}

        }

}

//DOWN按键

if((val>320)&&(val<380)&&!FLOCK&&FBG)

{    Beep();F5s_ON;

         delay(60000);

         val=AdcConvert(KEY);

         if((val>320)&&(val<380))

        {

               Nokeytime=0;

               if(!FSET&&!FUPDOWN&&!Fright&&!Fmodi)

                   {

                   if(K_Counter1>1) K_Counter1--;                

                       else             K_Counter1=1;

                           if(K_Counter1==1){FDOWN_OFF;}

                           if(K_Counter1==2)

                                            {FDOWN_ON;

                                                                 Disp_NND();

                                                                 SMG4=2;

                                                                 TEMP_CL(EN_temp,FET_);

                                                                }

                           if(K_Counter1==3)

                                            {FDOWN_ON;

                                                                 Disp_NND();

                                                                 SMG4=3;

                                                                 TEMP_CL(PQ_temp,FPQT_);

                                                                }

                           if(K_Counter1==4)

                                            {

                                                                 FDOWN_ON;

                                                                 Disp_NND();

                                                                 SMG4=4;

                                                                 TEMP_CL(LS_temp,FLNT_);

                                                                }

                }



         if(K_Counter==1)

           {

            if(FUPDOWN||(Fright&&Fmodi))//输入密码

                                             {if(LScode[0]>0) LScode[0]--;

                                                                          else             LScode[0]=0;

                                                                          SMG6=LScode[0];

                                                                          }               

                  

                if(Fright&&!Fmodi)//密码管理,除霜温度加处理

                                  {

                                   if(eeprd[0]<15) eeprd[0]++;

                                       else            eeprd[0]=15;       

                                       eprd0cl();

                                  }

                  

                if(!FUPDOWN&&!Fright&&!Fmodi)//正常参数--热水温度

                                              {if(eeprd[5]>10) eeprd[5]--;

                                                                           else             eeprd[5]=10;

                                                                           DISP_CL(eeprd[5]);

                                                                          }

           }

          

         if(K_Counter==2)

           {

            if(FUPDOWN||(Fright&&Fmodi))

                                            {if(LScode[1]>0) LScode[1]--;

                                                                         else            LScode[1]=0;

                                                                         SMG6=LScode[1];

                                                                        }

               

                if(Fright&&!Fmodi)//密码管理,退出温度处理

                                  {if(eeprd[1]>3) eeprd[1]--;

                           else eeprd[1]=3;

                                                   DISP_CL(eeprd[1]);

                                                  }

                  

        if(!FUPDOWN&&!Fright&&!Fmodi)//正常参数--回差温度

                                              {if(eeprd[6]>3) eeprd[6]--;

                                                                           else            eeprd[5]=3;

                                               DISP_CL(eeprd[6]);

                                                                          }

           }

         if(K_Counter==3)

           {

            if(FUPDOWN||(Fright&&Fmodi))

                                            {

                                             if(LScode[2]>0) LScode[2]--;

                                                                         else            LScode[2]=0;

                                                                         SMG6=LScode[2];

                                            }

                if(Fright&&!Fmodi)//密码管理,环境温度处理-1度

                                  {if(HW_counter>0) HW_counter--;

                                   else  HW_counter=0;

                                                   eeprd[2]=EN_TEMP[HW_counter];

                                   HW_dispCL();//调用显示处理程序

                                  }

                if(!FUPDOWN&&!Fright&&!Fmodi)//来电重启开

                                             {

                                              Frestar_OFF;

                                                                          Disp_of();

                                                                          eeprd[7]=0;

                                             }

           }

         if(K_Counter==4)

           {

            if(FUPDOWN||(Fright&&Fmodi))

                                            {if(LScode[3]>0) LScode[3]--;

                                                                         else             LScode[3]=0;

                                                                         SMG6=LScode[3];

                                                                        }

                  

                if(Fright&&!Fmodi)//密码管理,除霜时间加1

                                  {if(eeprd[3]>1) eeprd[3]--;

                                                   else            eeprd[3]=1;

                                                   DISP_CL(eeprd[3]);

                                                  }

               

                if(!FUPDOWN&&!Fright&&!Fmodi)//当前时间小时

                                             {

                                              if(hour>0) hour--;

                                                                          else       hour=0;

                                                                          DISP_CL(hour);

                                             }

           }

         if(K_Counter==5)

           {

            if(FUPDOWN||(Fright&&Fmodi))

                                            {if(LScode[4]>0) LScode[4]--;

                                                                         else             LScode[4]=0;

                                                                         SMG6=LScode[4];

                                                                        }

                  

                if(Fright&&!Fmodi)//密码管理,除霜间隔时间加1

                                  {if(eeprd[4]>5) eeprd[4]--;

                                                   else            eeprd[4]=5;

                                                   DISP_CL(eeprd[4]);

                                                  }

               

                if(!FUPDOWN&&!Fright&&!Fmodi)//当前时间小时

                                             {

                                              if(min>0) min--;

                                                                          else min=0;

                                                                          DISP_CL(min);

                                             }

           }

         if(K_Counter==6)

           {

            if(FUPDOWN||(Fright&&Fmodi))

                                            {if(LScode[5]>0) LScode[5]--;

                                                                         else LScode[5]=0;

                                                                         SMG6=LScode[5];

                                                                        }

               

                if(!FUPDOWN&&!Fright&&!Fmodi)//定时开机小时

                                             {if(eeprd[9]>0) eeprd[9]--;

                                                                          else            eeprd[9]=0;

                                                                          DISP_CL(eeprd[9]);

                                                                         }

           }

          

         if(K_Counter ==7)

                         {if(eeprd[10]>0) eeprd[10]--;

                                          else             eeprd[10]=0;

                                          DISP_CL(eeprd[10]);

                                         }

          

         if(K_Counter ==8)

                          {Fdk_OFF;

                                           Disp_of();

                                           eeprd[8]=0;

                                          }

         

         if(K_Counter ==9)

                          {if(eeprd[12]>0) eeprd[12]--;

                                           else             eeprd[12]=0;

                                           DISP_CL(eeprd[12]);

                                          }

          

         if(K_Counter==10)

                          {if(eeprd[13]>0) eeprd[13]--;

                                           else             eeprd[13]=0;

                                           DISP_CL(eeprd[13]);

                                          }

          

         if(K_Counter==11)

                          {Fdg_OFF;

                                           Disp_of();//56显示"ON"

                                           eeprd[11]=0;

                                          }

         if(K_Counter==12){       

                        if(eeprd[16]>1)  eeprd[16]--;

                        else             eeprd[16]=1;

                                                DISP_CL(eeprd[16]);

                           }

         D5S=0;

         while((val>320)&&(val<380)){val=AdcConvert(KEY);}

        }

}

//POWER键

  if((val>160)&&(val<200)&&FLOCK)

  {delay(6000);

   val=AdcConvert(KEY);

   if((val>160)&&(val<200))

   {for(i=0;i+20<26;i++){write_EEPROM(i+20,0);}

    for(i=0;i<6;i++) {scode=0;}

   }

  }

  

  if((val>160)&&(val<200)&&!FLOCK)

{     delay(6000);

      val=AdcConvert(KEY);

          if((val>160)&&(val<200))

        {

          Nokeytime=0;

      Beep();

          if(FUPDOWN)

             {if(!((scode[0]^LScode[0])||(scode[1]^LScode[1])||(scode[2]^LScode[2])||

              (scode[3]^LScode[3])||(scode[4]^LScode[4])||(scode[5]^LScode[5])))          

                  {

                           Fright_ON;   //密码正确标志置位

                           Fright1_on;

                           FUPDOWN_OFF; //清除UPDOWN标志

                           SMG5=9;

                           SMG6=9;

                           Fsmg6_OFF;

                       K_Counter=0; //计数器清零

                           Ferror_off;

                           D5S=0;

                      }

                  else {SMG5=ZE;SMG6=ZE;Ferror_on;}

                 }

          else  {if(Fsysenable)  systemoff();

                               

                  else            systemon();

                             

                        }

          while((val>160)&&(val<200)){val=AdcConvert(KEY);}

        }

}





if((val>145)&&(val<165)&&!FLOCK&&Fsys&&FBG)//CS强制除霜

{   delay(6000);

        Nokeytime=0;

    val=AdcConvert(KEY);

        if((val>145)&&(val<165))

  {

    Beep();

    delay3s();delay3s();delay3s();delay3s();

    if((val>145)&&(val<165)&&!FLOCK&&Fsys)

                                               {FCS_ON;

                                                while((val>145)&&(val<165)){val=AdcConvert(KEY);}

                                                                                   }

       

  }

}

   

if((val>100)&&(val<144)&&FBG)//LOCK键

{   delay(6000);

    val=AdcConvert(KEY);

        if((val>100)&&(val<144))

   {

    Beep();

        LCDBG_ON;//开背光

        Nokeytime=0;

    if(!Fright){delay3s();delay3s();//按下5s

                     val=AdcConvert(KEY);

                if((val>100)&&(val<144)){if(FLOCK) {FLOCK_OFF;S20_OFF;}

                                                   else      {FLOCK_ON;S20_ON;}           

                                              }

                    }

        else {Fmodi_ON;

              D5S=0;

                  SMG5=0;

                  SMG6=0;

                  } //可以修改密码       

        while((val>100)&&(val<144))  val=AdcConvert(KEY);        

   }

   }

}

出0入0汤圆

 楼主| 发表于 2006-9-7 12:05:30 | 显示全部楼层
怎么没有人肯定下呢?

出0入0汤圆

 楼主| 发表于 2006-9-7 12:07:40 | 显示全部楼层
处理了多重菜单!

出0入0汤圆

发表于 2006-9-7 13:42:40 | 显示全部楼层
怎么没人顶?!

可能是大部分人对I/O口的数量都不是要求很多吧。

也许不少人做起项目来从来不需要考虑到I/O口的数量,

如果要做一个用到20个按键,30位数码管,20个发光LED,检测外部10个信号高低电平,

楼主的方法就很不错了。可以帮上大忙啊!!!



我也顶了~~~~~

出0入0汤圆

发表于 2006-9-7 14:35:58 | 显示全部楼层
方法不错,手机的线控都是这么干的。



不过如果有数码管扫描,我一般是把按键扫描和数码管放在一起,这样也非常省IO口的。

出0入0汤圆

发表于 2006-9-7 15:00:00 | 显示全部楼层
不错,非常妙啊!!!!我正为M128的IO不够用而发愁呢。液晶、网卡芯片、双RS485、GPRS驱动、AD检测、继电器驱动、流量计脉冲捕捉、水位检测、预留的数字输入口,等一个不能少,用了楼主的办法,我至少能腾出7IO来,呵呵呵,现在看来,一片M128足以组成一超级系统了。



谢谢楼主!

出0入0汤圆

发表于 2006-9-7 16:14:55 | 显示全部楼层
AD按键多键确实好,但实现组合键有点困难!

出0入0汤圆

 楼主| 发表于 2006-9-7 17:34:54 | 显示全部楼层
我实现了组合键,很用!实际组合键也是跟单键一样的用法!特别是M8,AD键盘可以解决很多的问题!

出0入0汤圆

发表于 2006-9-7 17:52:04 | 显示全部楼层
AD键盘能不能这样用:

一有按键,马上进入中断,再通过AD转换判断是那个按键?

出0入0汤圆

 楼主| 发表于 2006-9-7 17:56:55 | 显示全部楼层
我没有试,用的是扫描方式!中断多了,会有什么后果,不太清楚,我就觉得定时器用处最大!感觉行!

出0入0汤圆

发表于 2006-9-7 19:44:30 | 显示全部楼层
记下

出0入0汤圆

发表于 2006-9-8 08:52:39 | 显示全部楼层
【楼主位】 gphs

多键同时按下,会是甚么情况.

出0入0汤圆

 楼主| 发表于 2006-9-8 12:20:25 | 显示全部楼层
自己再顶下!

出0入0汤圆

发表于 2006-9-8 14:24:55 | 显示全部楼层
阻值选的再好,也难处理多键同按吧

出0入0汤圆

发表于 2006-9-8 14:52:56 | 显示全部楼层
1)难处理多键同按,

2)按钮用久了,接触电阻会出问题的。

出0入0汤圆

发表于 2006-9-8 15:25:29 | 显示全部楼层
楼主应该回答问题,而不仅仅自己再顶下.

出0入0汤圆

发表于 2006-9-8 16:11:37 | 显示全部楼层
按钮用久了,接触电阻会出问题的。

我觉得可以使用较大的电阻值,这样一来按键的电阻变化影响就不大了

一路AD扩展几个按键的电压值的容闲是很大的,可靠性上比较好过关

出0入0汤圆

发表于 2006-9-8 17:39:25 | 显示全部楼层
学习了,谢谢!

出0入0汤圆

 楼主| 发表于 2006-9-9 18:16:29 | 显示全部楼层
按键都会存在用久了接触不好的问题!但他的阻值不会影响到AD值,因为在编程进给了很大的容错范围!

出0入0汤圆

 楼主| 发表于 2006-9-9 18:46:58 | 显示全部楼层
多键同时按下的情况,实际是等于几只电阻并联的情况,可以当成多出的一个键处理!不知道我说清楚没有?在设计时,注意电阻值间距

出0入0汤圆

发表于 2006-9-9 20:23:30 | 显示全部楼层
顶一下,很多线控的按键,都是用这种方式.两条线就可以了.方便.

出0入0汤圆

发表于 2006-9-9 23:36:50 | 显示全部楼层
理论上, 10个按键需要2^10的电阻值组合。以10位AD来说,最多只可以分辨10个键。

实际应用上还要考虑电阻的选择以及准确度。
-----此内容被billip于2006-09-09,23:46:19编辑过

出0入0汤圆

 楼主| 发表于 2006-9-11 09:02:48 | 显示全部楼层
这个结论是不是下得有点早!

出0入0汤圆

发表于 2006-9-11 17:25:33 | 显示全部楼层
delay3s();

这个延时时间是多少呢?程序在那儿主要做些什么?是空循环还是调用别的子程序?

感觉这样去抖动不好哦!呵

出0入0汤圆

 楼主| 发表于 2006-9-13 08:33:09 | 显示全部楼层
delay3s();  是用于按键按下几秒钟才进行处理!

出0入0汤圆

发表于 2006-9-13 14:54:14 | 显示全部楼层
关键就是电阻值 比较难选吧,键少点 还好.(就像你上面那个电阻值可行吗?). 模拟的总没数字电平容错性好.不到万不得已还是不考虑这个.

出0入0汤圆

发表于 2006-9-13 21:43:49 | 显示全部楼层
还行,我做了8个键的项目好用。不过对于组合键确实会差一些

出0入0汤圆

发表于 2006-9-13 22:39:44 | 显示全部楼层
如果只是识别单个按键, 十多个键是完全没有问题的, 但要识别多个键, 那就不好办了!

出0入0汤圆

发表于 2006-9-13 23:00:35 | 显示全部楼层
作单键用还是比较有创意的.

出0入0汤圆

 楼主| 发表于 2006-9-15 10:17:35 | 显示全部楼层
当然是可靠的!我测试了良长时间了,没有问题啊!不管选电阻一定要把阻值分开!另外最重要的一点就是:做程序时,做一个比较合适的容错范围,还有就是AD的次数最好是多次,确保检测到的是你需要的值!

出0入0汤圆

发表于 2006-9-15 18:14:13 | 显示全部楼层
我记得有个用一个AD口做4*4键盘的,很好的创意!

出0入0汤圆

 楼主| 发表于 2006-9-17 10:49:47 | 显示全部楼层
不要对可行性进行怀疑,已经做成产品用了!

出0入0汤圆

发表于 2006-9-17 14:28:08 | 显示全部楼层
没有对可行性怀疑,原理上是可行.



【22楼】 billip

理论上, 10个按键需要2^10的电阻值组合。以10位AD来说,最多只可以分辨10个键。

实际应用上还要考虑电阻的选择以及准确度。



这个意见不错.AD容错+ - 8 ,就能检出2^7组合. 不过容错还是小了点,那楼主的5个键没问题了,阻值再选好点的话.

出0入0汤圆

 楼主| 发表于 2006-9-17 20:24:27 | 显示全部楼层
程序的编写也很重要!要让转换出来的值是"键被按下来时的值"!

出0入0汤圆

 楼主| 发表于 2006-9-18 17:36:01 | 显示全部楼层
自己顶起来!

出0入0汤圆

 楼主| 发表于 2007-3-2 17:18:52 | 显示全部楼层
怎么没有要顶?

出0入0汤圆

发表于 2007-3-2 17:31:56 | 显示全部楼层
现在有专用的SPI键盘&LED处理芯片,无论从成本,可靠性,I/O资源占用量,程序的代码量都有绝对优势,楼主还用费这个力吗?

出0入0汤圆

发表于 2007-3-21 11:47:42 | 显示全部楼层
如果是中断里读ADC值,延时处理可以这样:



//……

key_before=1;//读取的按键值

//……

if(key_now==key_before)

{

    keyvalue=key_now;

    //A_FLAG……

}

else key_now=key_before;

//……

只有连续两次以上读取的值一样才会处理,在A_FLAG出还可以判断次数以达到延时效果;

在实时性高的地方,使用 delay3s();  这样的延时是不可取的。

出0入0汤圆

发表于 2007-3-21 11:59:41 | 显示全部楼层
好方法!

顶楼主!

出0入0汤圆

发表于 2007-3-21 20:03:51 | 显示全部楼层
第一次见,受益匪浅

出0入0汤圆

发表于 2007-3-22 12:39:05 | 显示全部楼层
家电里面很多都是AD键,都用了多少年了,肯定是可靠的.

组合键的话,2个以上的AD口就能解决,

出0入18汤圆

发表于 2009-4-8 23:21:24 | 显示全部楼层
不错的哇!

出0入90汤圆

发表于 2009-4-8 23:31:18 | 显示全部楼层
楼主的思路不错啊!我正愁扩展IO口呢!呵呵,现在马上就可以用上了!

出0入0汤圆

发表于 2009-4-9 00:13:11 | 显示全部楼层
别一个劲的叫好,当SB5和SB6同时按下时,其效果几乎与单独按下SB3一样,两都之间的电压仅仅相差1.7%,普通电阻的误差都大于此值。AD键不宜做得过多,否则可靠性难以保证。

出0入0汤圆

发表于 2009-4-9 00:18:22 | 显示全部楼层
有想法~~

出0入0汤圆

发表于 2009-4-10 14:35:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-4-10 18:02:52 | 显示全部楼层
好方法mark

出0入0汤圆

发表于 2009-8-7 00:31:45 | 显示全部楼层
强啊。学习

出0入0汤圆

发表于 2009-8-7 10:49:38 | 显示全部楼层
正想用此方法试验。。。。

出0入0汤圆

发表于 2009-8-7 13:11:19 | 显示全部楼层
用数据和图表分析楼主电路对组合键支持的可行性:

把电路中的6个电阻导入EXCEL中自动生成各种组合键按下的电压,
每个电阻下对应1表示按下,0表示释放,
计算出与10K下拉电阻分压后的电压值按大小排序,
从数据或图表都看出大部分电压非常接近,
第二个图表于相邻电压的差异,
最接近的几个只相差4mV,10位AD也不行。


(原文件名:未命名.PNG)

出0入4汤圆

发表于 2009-8-8 00:01:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-8 14:08:45 | 显示全部楼层
赞一个

出0入0汤圆

发表于 2009-8-8 23:44:22 | 显示全部楼层
正在学习这个,,,了解了...不会就找楼主教教了...嘻嘻

出0入0汤圆

发表于 2009-8-9 10:33:42 | 显示全部楼层
好方法!

出0入0汤圆

发表于 2009-8-9 20:40:48 | 显示全部楼层
不错

出0入0汤圆

发表于 2009-8-10 12:06:00 | 显示全部楼层
支持【52楼】 cowboy
6个键,64种组合,即使完美排列也就1024/64=16,允差+/-8,即+/-0.78%(8/1024 )
电阻都得用+/-0.1%的,还得考虑【15楼】 wrjmancn 提出的问题。

--估计楼主还没有试过三键和三键以上的组合。

另:考虑到电源纹波,VCC应该和ADC使用同一基准源。

出0入0汤圆

发表于 2009-8-12 19:30:43 | 显示全部楼层
等有时间研究。写了

出0入8汤圆

发表于 2009-8-13 10:17:02 | 显示全部楼层
顶一个,我最近做的一个充电器就是用的ADC键盘,六个按键的,见此贴:http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=3504991&bbs_page_no=2&bbs_id=1000

出0入0汤圆

发表于 2010-6-19 11:58:48 | 显示全部楼层
mark
头像被屏蔽

出0入0汤圆

发表于 2010-6-19 16:15:59 | 显示全部楼层
我倒是怀疑了,你用AVR的AD口,你要是开AD,那个那8个口全是用来做AD转换的,根本就不能用来做普通的IO口了,这样不浪费吗?

出0入0汤圆

发表于 2010-6-19 16:30:40 | 显示全部楼层
支持楼主

出0入0汤圆

发表于 2010-6-19 18:04:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-19 18:38:44 | 显示全部楼层
ddddddddddd

出0入0汤圆

发表于 2010-6-29 18:04:26 | 显示全部楼层
回复【12楼】ml07077
-----------------------------------------------------------------------

哎!
你看一下电路和程序就知道了!多键同时按的话,电压肯定和其中一个有冲突!肯定不能判断出来!
以后这样的问题,自己认真想想后再问!别什么一张口就出来了,让人笑话!

出0入0汤圆

发表于 2010-6-29 18:17:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-29 19:04:59 | 显示全部楼层
mark。学习了。
多谢分享!

出0入0汤圆

发表于 2010-6-30 09:55:19 | 显示全部楼层
mark!~~~

出0入0汤圆

发表于 2010-7-18 20:48:59 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-7-25 21:48:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-15 20:08:06 | 显示全部楼层
这个一定mark

出0入0汤圆

发表于 2011-1-16 14:37:22 | 显示全部楼层
mark,现在用不到,以后有用到的时候在看

出0入0汤圆

发表于 2011-1-16 17:00:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-16 18:10:56 | 显示全部楼层
AD按键做出来的键盘,键越多,可靠性越差

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-6 15:53

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

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