找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2509|回復(fù): 22
收起左側(cè)

畫了一個(gè)pcb,里面按鍵的部分感覺(jué)不太靈敏

  [復(fù)制鏈接]
ID:1101371 發(fā)表于 2024-3-16 20:05 來(lái)自手機(jī) | 顯示全部樓層 |閱讀模式
就是按按鍵出菜單但是屏幕總是不出來(lái),按半天才出來(lái),想加個(gè)消抖的電路。初步是想加個(gè)電容,但是沒(méi)啥思路,想讓大佬們看看

就是圖片中的key1 key2 key3
IMG_20240316_200509.jpg
回復(fù)

使用道具 舉報(bào)

ID:857072 發(fā)表于 2024-3-16 22:16 來(lái)自手機(jī) | 顯示全部樓層
反應(yīng)慢那肯定是程序的問(wèn)題啊,按鍵可不背這個(gè)鍋
回復(fù)

使用道具 舉報(bào)

ID:857072 發(fā)表于 2024-3-16 22:18 來(lái)自手機(jī) | 顯示全部樓層
話說(shuō)太滿了,也有可能是電路問(wèn)題。反正按鍵不背鍋
回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2024-3-16 22:33 | 顯示全部樓層
反應(yīng)慢就是delay()用多了。
回復(fù)

使用道具 舉報(bào)

ID:1110945 發(fā)表于 2024-3-17 00:43 | 顯示全部樓層
官方例程里好多CPU延時(shí),要改成定時(shí)中斷做延時(shí),這樣CPU才能及時(shí)的處理
你的按鍵。特別是在“大循環(huán)”里,一定要消除delay()延時(shí)。
回復(fù)

使用道具 舉報(bào)

ID:420836 發(fā)表于 2024-3-17 08:42 | 顯示全部樓層
首先確定是否是軟件問(wèn)題。 軟件問(wèn)題更容易解決,因?yàn)槟恍枰薷腜CB設(shè)計(jì)。
回復(fù)

使用道具 舉報(bào)

ID:731755 發(fā)表于 2024-3-17 10:27 來(lái)自手機(jī) | 顯示全部樓層
程序問(wèn)題,我都是中斷寫按鍵,
回復(fù)

使用道具 舉報(bào)

ID:1101371 發(fā)表于 2024-3-17 11:40 來(lái)自手機(jī) | 顯示全部樓層
不想改程序,感覺(jué)還是加個(gè)消抖電路,想了解加個(gè)電容的話需要在原來(lái)的基礎(chǔ)上怎么改
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2024-3-17 12:01 | 顯示全部樓層
Pikachu233 發(fā)表于 2024-3-17 11:40
不想改程序,感覺(jué)還是加個(gè)消抖電路,想了解加個(gè)電容的話需要在原來(lái)的基礎(chǔ)上怎么改

按鍵硬件消抖是很簡(jiǎn)單的事,通常用1K電阻和104電容組成低通濾波器即可。但從樓主描述來(lái)看不像是按鍵延時(shí)消抖所致。而是主程序構(gòu)架有問(wèn)題,掃描按鍵的周期過(guò)長(zhǎng)。把程序貼上來(lái)。
回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2024-3-17 17:49 | 顯示全部樓層
既然已經(jīng)用上了STM32就應(yīng)該上RTOS,里面的ostimedelay()比死等那種delay()方便好用多了。
回復(fù)

使用道具 舉報(bào)

ID:1101371 發(fā)表于 2024-3-18 08:25 來(lái)自手機(jī) | 顯示全部樓層
wulin 發(fā)表于 2024-3-17 12:01
按鍵硬件消抖是很簡(jiǎn)單的事,通常用1K電阻和104電容組成低通濾波器即可。但從樓主描述來(lái)看不像是按鍵延時(shí) ...

void show(){
      OLED_ShowCH(0,0,"");
                        sprintf((char*)buff,":%2d %d",timekaishi,isMan);               
                        OLED_ShowCH(16*6, 0, (u8*)buff);
       
            
            if(isbf==0){
                                OLED_ShowCH(0,2,"··");                       
                        }else{
                          OLED_ShowCH(0,2,"·");
                        }

                               
}
void tip(){
        beep=0;
        delay_mss(500);
        beep=1;
}

void fasong(){
       
}
void set_mima(u8 a,u8 b){
        u8 j;
        OLED_ShowCH(0,0,"");
        sprintf((char*)buff,"%d",a);       
        OLED_ShowCH(0, 2, (u8*)buff);
       
        for (j = 0; j < b; j++) {
                OLED_ShowCH(16*j,4,"*");
        }
       
       
       
}
void passwords(){
        u8 key,i;
  u8 indexs=0,n=1;
  u8 values=0,result=0;
  static char mima[6];
  static char mima_a[]={1,2,3,4,5,7};
        while(n){
                key=KEY_Scan(0);
                if(key){
    switch(key){
     case 1:
      
      mima[indexs]=values;
      indexs++;
      if(indexs>=6){
        //
        for (i = 0; i < 6; i++) {
         if(mima!=mima_a){
          result=1;
          break;
         }
        }
        n=0;
                                OLED_Clear();
        if(result){
          //§°
                                       
                                        OLED_ShowCH(0,0,"§°");
          tip();
        }else{
                                        OLED_ShowCH(0,0,"");
                                        weizhi();
                                        delay_mss(2000);
        }
                                OLED_Clear();
        break;
      }
     break;
     case 2:
      if(values<9)values++;
     break;
     case 3:
      if(values!=0)values--;
     break;
     default:
     break;
    }
  }
        if(n)set_mima(values,indexs);        
               
       
       
        }
       
}
void panduan(){
        if(timekaishi==21 && isMan && isbf){
                //±¨
                isbaojing=1;
        }else{
       
          isbaojing=0;
        }
}
void IC_test ( void )
{
        u8 ensure,n,key,statuess,t;
        char cStr [ 30 ];
  uint8_t ucArray_ID [ 4 ];   /*ó·IC¨àUID(IC¨ò)*/                                                                                          
        uint8_t ucStatusReturn;     /*·× */                                                                                       
  static uint8_t ucLineCount = 0;
        char *strx;
       
  while ( 1 )
  {
             
                if(hongwai==1)
                {
                        gTime=0;                                                                // ìò°20±
                }
                if(gTime>5*2){   //gTime20
                        gTime=5*2;  //ò°gTime20±ó
                        isMan=0; // 10ì
                }
                if(gTime<5*2){
                        isMan=1; //
                }
               
               
                key=KEY_Scan(0);
                switch(key){
                        case 3:
                                //
                          
                                break;
                                 
                                case 1:
                                 if(isbf){
                                   isbf=0;
                                 }else{
                                   isbf=1;
                                 }
                                break;
                               
                                case 2:
                                OLED_Clear();
                                //
                                passwords();
                                break;
                               
                }
               
               
                show();
               
          panduan();
                       
               
                       
                       
                       
                       
    /*°¨*/
                if ( ( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ) ) != MI_OK )  
       /*§°°¨*/
                        ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID );                                                               

                if ( ucStatusReturn == MI_OK  )
                {
      /*·×¨±à¨÷×÷·§±·úá×÷*/
                        if ( PcdAnticoll ( ucArray_ID ) == MI_OK )                                                                  
                        {
                                sprintf ( cStr, "The Card ID is: %02X%02X%02X%02X",
                  ucArray_ID [ 0 ],
                  ucArray_ID [ 1 ],
                  ucArray_ID [ 2 ],
                  ucArray_ID [ 3 ] );
                                                               
                               
                                sprintf(buffid,"CardID:%02X%02X%02X%02X",ucArray_ID [ 0 ],ucArray_ID [ 1 ],ucArray_ID [ 2 ],ucArray_ID [ 3 ]);
        OLED_Clear();
                                OLED_ShowCH(0, 2, (u8*)buffid);
                                delay_mss(2000);
                               
                                sprintf(buffid,"%02X%02X%02X%02X",ucArray_ID [ 0 ],ucArray_ID [ 1 ],ucArray_ID [ 2 ],ucArray_ID [ 3 ]);
                               
                                strx=strstr((const char*)buffid,(const char*)"83FA6C9D");//·CSQ
        OLED_Clear();
                                if(strx){
                                        OLED_ShowCH(0,4,"±");
                                        weizhi();
                                       
                                        delay_mss(1000);
                                       
                                }else{
                                       
                                  OLED_ShowCH(0,4,"±§°");
                                        tip();
                                }
                                delay_mss(1000);
                                OLED_Clear();
                               
                               
                               
                       
                               
                                                       
                        }               
                }
               
               
  }               
}


int main(void)
{
        u8 t;
  extern const u8 BMP1[];
        HZ= GB16_NUM();
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //èNVIC·×é2:22ì
        delay_init();                     //±          

        USART2_Init_Config(9600);  //wifi
  TIM3_Int_Init(4999,7199);
  LED_Init();
        KEY_Init();
       
       
        OLED_Init();                                //OLED
        OLED_Clear();                                //OLED
        delay_ms(10);
       
        OLED_Init();                                //OLED
        OLED_Clear();                                //OLED
        OLED_ShowCH(0,4,"init..");
        RC522_Init ();
        PcdReset ();
       
  /*è¤×÷·*/   
        M500PcdConfigISOType ( 'A' );
        OLED_Clear();
        while(1)

        {
               
                 /*IC¨ì        */   
    IC_test ();   
        }
}
//ù×
short CharArrayToNumber( char *p_pBuff, int p_iSize )
{
        u8 i;
  if ( NULL != p_pBuff && p_iSize > 0 && p_iSize <= 8 )
  {
    short ulRet = 0;
    p_iSize -= 1;
    for ( i = 0; i <= p_iSize; ++i)
    {
      ulRet |= ((short)(p_pBuff)) << ((p_iSize - i) << 2);
    }
    return ulRet;
  }
  else
  {
    return 0;
  }
}
void USART2_IRQHandler(void)                        //1·ò
        {
        u8 Res,ss;
                        char datas[2];

        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
                {
                Res =USART_ReceiveData(USART2);        //
          
                USART_ClearFlag(USART2,USART_FLAG_RXNE);
                if(Res=='1'){
                        weizhi();
                }
                }
       
        }
//¨±÷3·ò
void TIM3_IRQHandler(void)   //TIM3
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //ìéTIM3ü·ú·
                {
                        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //TIMxü±ê
                        count++;
                        gTime++;
                        if(count==2){
                                count=0;                       
                                if(timekaishi!=21){
                                        timekaishi++;
                                }
                                if(isbaojing){
                                        beep=~beep;
                                }else{
                                  beep=1;
                                }
                        }
                }
}
回復(fù)

使用道具 舉報(bào)

ID:1101371 發(fā)表于 2024-3-18 08:26 來(lái)自手機(jī) | 顯示全部樓層
wulin 發(fā)表于 2024-3-17 12:01
按鍵硬件消抖是很簡(jiǎn)單的事,通常用1K電阻和104電容組成低通濾波器即可。但從樓主描述來(lái)看不像是按鍵延時(shí) ...

這個(gè)是主程序
回復(fù)

使用道具 舉報(bào)

ID:1101371 發(fā)表于 2024-3-18 08:27 來(lái)自手機(jī) | 顯示全部樓層
wulin 發(fā)表于 2024-3-17 12:01
按鍵硬件消抖是很簡(jiǎn)單的事,通常用1K電阻和104電容組成低通濾波器即可。但從樓主描述來(lái)看不像是按鍵延時(shí) ...

這個(gè)是按鍵函數(shù)
include "stm32f10x.h"
#include "key.h"
#include "sys.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////         
//
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////  
                                                                    
//°ü
void KEY_Init(void) //IO
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB,ENABLE);//PORTB,PORTE±

        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//KEY0-KEY2
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //è
        GPIO_Init(GPIOC, &GPIO_InitStructure);//
       
  GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_14;//KEY0-KEY2
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //è
        GPIO_Init(GPIOB, &GPIO_InitStructure);//

}
//°üí
//·°ü
//mode:0,§°;1,§°;
//0°ü°
//1KEY0°
//2KEY1°
//×ì,KEY0>KEY1!!
u8 KEY_Scan(u8 mode)
{         
        static u8 key_up=1;//°ü°±ê
        if(mode)key_up=1;  //§°                  
        if(key_up&&(KEY0==0||KEY1==0||KEY2==0))
        {
                delay_ms(10);//
                key_up=0;
                if(KEY0==0)return KEY0_PRES;
                else if(KEY1==0)return KEY1_PRES;
                else if(KEY2==0)return KEY2_PRES;
        }else if(KEY0==1&&KEY1==1&&KEY2==1)key_up=1;             
        return 0;// °ü°
}
回復(fù)

使用道具 舉報(bào)

ID:236035 發(fā)表于 2024-3-18 08:39 | 顯示全部樓層
硬件不太會(huì)有問(wèn)題,還是要改程序。
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2024-3-18 09:18 | 顯示全部樓層
while(1)內(nèi)有while(1)內(nèi)有while(n)
回復(fù)

使用道具 舉報(bào)

ID:359272 發(fā)表于 2024-3-18 09:22 | 顯示全部樓層
按鍵處理函數(shù)里面又有按鍵掃描,這樣不好吧。。。
回復(fù)

使用道具 舉報(bào)

ID:712493 發(fā)表于 2024-3-18 10:16 | 顯示全部樓層
這個(gè)按鍵手感不太好!會(huì)不會(huì)沒(méi)按到位感覺(jué)按下了
回復(fù)

使用道具 舉報(bào)

ID:149759 發(fā)表于 2024-3-18 10:33 | 顯示全部樓層
這個(gè)程序?qū)懙貌恍,按鍵在你按下去的時(shí)候都沒(méi)有掃描到。建議還是先優(yōu)化下軟件吧,加電容沒(méi)什么用的
回復(fù)

使用道具 舉報(bào)

ID:403593 發(fā)表于 2024-3-18 10:44 | 顯示全部樓層
OLED屏刷新也是需要時(shí)間的,顯示的越復(fù)雜刷新需要的時(shí)間也越多,有時(shí)候按鍵反應(yīng)慢就是因?yàn)槠聊凰⑿抡加脮r(shí)間太多。樓上幾位大神說(shuō)得對(duì),最好使用定時(shí)器來(lái)做延時(shí)。如果按鍵按下以后執(zhí)行程序很正常,只是按鍵反應(yīng)慢,也不想動(dòng)電路也不想大改程序,那還有一個(gè)簡(jiǎn)單粗暴的辦法,那就是修改運(yùn)行頻率,只需要把主頻提高一倍,瞬間就能體驗(yàn)到如絲般順滑的按鍵手感。
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2024-3-18 13:05 | 顯示全部樓層

你主函數(shù)只有一條IC_test();,也就是其他子函數(shù)都在里面一鍋粥。如15樓指出的“while(1)內(nèi)有while(1)內(nèi)有while(n)”甚至還有多處1000ms到2000ms的阻滯延時(shí)。明顯是程序構(gòu)架不當(dāng),時(shí)空混亂,主次不分。建議在本壇搜索成熟案例參考。
回復(fù)

使用道具 舉報(bào)

ID:996496 發(fā)表于 2024-3-18 19:51 | 顯示全部樓層
選個(gè)合適的電容就行,幾納法到幾十微法都可以。電容小的響應(yīng)快,但對(duì)噪聲敏感;電容大的濾波好,但響應(yīng)慢點(diǎn)?茨阈枰。 把電容連在按鍵輸入和地之間就好。按鍵按下,電容就充電;按鍵松開,電容就放電。 這樣電容能濾波,讓按鍵信號(hào)更穩(wěn)定,就不會(huì)有那些瞬間的抖動(dòng)和干擾啦。
回復(fù)

使用道具 舉報(bào)

ID:619259 發(fā)表于 2024-3-30 21:12 | 顯示全部樓層
a185980800 發(fā)表于 2024-3-16 22:18
話說(shuō)太滿了,也有可能是電路問(wèn)題。反正按鍵不背鍋

電路也不背這個(gè)鍋
回復(fù)

使用道具 舉報(bào)

ID:195496 發(fā)表于 2024-4-2 22:36 | 顯示全部樓層
完全是程序的問(wèn)題,要優(yōu)化才能改變響應(yīng)程度。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表