久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1677|回復: 16
打印 上一主題 下一主題
收起左側(cè)

誰幫我看看這個單片機按鍵處理程序,為什么不靈敏?需要按幾次的

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:72649 發(fā)表于 2024-12-29 09:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
void Test(void)                        //按鍵處理
{
        if( Mode == 0  )                //模式鍵
        {        
                delay_ms(20);                        //延時10ms
                if(Mode==0)
                while(Mode==0);
         if( Run_Flag==0 )                        //Run_Flag==0制冷
                 {
                  SEG0 = 20;            //千位顯示P
                     SEG1 = 22;            //百位顯示-
                  SEG2 = 22;            //十位顯示-
              SEG3 = 12;              //個位顯示C        
                  DspTemp();                      //顯示模式
             }
         else
          {
                 SEG0 = 20;            //顯示P
                 SEG1 = 22;            //顯示-
                 SEG2 = 22;            //顯示-
             SEG3 = 16;              //顯示H        
                 DspTemp();                      //顯示模式         
          }
           delay_ms(10);                        //延時10ms               
          while(  Mode == 0 );                //按鈕按下,并等待按鈕松開                                          
                        if( Run_Flag==0 )                        //Run_Flag==0制冷
                        { //-------默認是制冷模式---------------------               
                                Run_Flag = 1;                        //Run_Flag==1制熱
                                SEG0 = 20;            //千位顯示P
                            SEG1 = 22;            //顯示-
                        SEG2 = 22;            //顯示-
                    SEG3 = 16;              //顯示H
                            DspTemp();                    //顯示模式                                       
                                BEEP = 0;                                //打開蜂鳴
                                delay_ms(20);                        //延時10ms
                                BEEP = 1;                                //關(guān)閉蜂鳴
                        }
           else   //-如果已是制熱模式則轉(zhuǎn)換到制冷模式---------------------        
                        {
                                Run_Flag = 0;         //Run_Flag==0制冷
                                SEG0 = 20;            //顯示P
                            SEG1 = 22;            //顯示-
                        SEG2 = 22;            //顯示-
                    SEG3 = 12;            //顯示C
                                DspTemp();                    //顯示模式        
                                BEEP = 0;                         //打開蜂鳴
                                delay_ms(20);                 //延時10ms
                                BEEP = 1;                        //關(guān)閉蜂鳴               
                        }               
        }
        if( Set == 0 )                //設(shè)置鍵
        {
                delay_ms( 10 );
                if( Set == 0 )
                {
                    BEEP = 0;                                //打開蜂鳴
                        delay_ms(10);                        //延時10ms
                        BEEP = 1;                                //關(guān)閉蜂鳴                        
                        Set_Mode ++;        
                        SEG0 = 20;            //顯示P
                        SEG1 = 22;           //顯示模式
                    SEG2 = 22;            //顯示-
                SEG3 = Set_Mode;      //顯示-
                    DspTemp();                      //顯示模式                                       
                        delay_ms(1000);         
                        //模式選擇
                        if( Set_Mode>3 )                //如果模式>8
                                Set_Mode = 0;                //回到模式1               
                         de=0;
                        while( Set == 0)                //等待松開執(zhí)行了
                        {
                                 de++;
                                 SEG0 = 13;   //顯示d
                                 SEG3 = de/10;   
                                 DspTemp();                    //顯示模式               
              //BEEP = 0;                   //打開蜂鳴
                            delay_ms(100);                        //延時10ms
                          //    BEEP = 1;                                //關(guān)閉蜂鳴                        
                                if(de>=100)                                //按住Set鍵2秒以上保存參數(shù)                        
                            {                        
                  EA=0;
                        //P6 =        0XFE;   P6<<1+1
                                IapErase(SECTOR0);                                        // 擦除第0扇區(qū)                                       
                    IapProgram(SECTOR0+10,ydsx);        // 保存溫度上限
                IapProgram(SECTOR0+12,ydxx);        // 保存溫度下限
                IapProgram(SECTOR0+14,ydjz);        // 保存溫度校準
                        // 在第0扇區(qū),第10字節(jié),寫入ydsx        
                BEEP = 0;                                //打開蜂鳴
                            delay_ms(10);                        //延時10ms
                            BEEP = 1;                                //關(guān)閉蜂鳴                        
               delay_ms(10);        
                BEEP = 0;                                //打開蜂鳴
                            delay_ms(10);                        //延時10ms
                        BEEP = 1;                                //關(guān)閉蜂鳴                        
                        EA=1;        
                    delay_ms(10);                        //延時10ms        
                        de=0;               
                        }                                
                                 delay_ms(10);
                        //de=0;
                        }        
                        de=0;               
                }
        }
   if( Up == 0  )                //增加鍵處理
        {
                SEG0 = 20;            //顯示P
                SEG1 = 22;            //顯示-
            SEG2 = 22;            //顯示-
            SEG3 = Set_Mode;      //顯示模式
            DspTemp();                    //顯示模式               
                BEEP = 0;                                //打開蜂鳴
                delay_ms(50);                        //延時10ms
            BEEP = 1;                                //關(guān)閉蜂鳴        
                delay_ms(50);                        //延時10ms
                while(  Up == 0 )
                {                                
                        switch(Set_Mode)              //選擇設(shè)置參數(shù)                                
                        {
                      case  1:                      //溫度上限設(shè)置                                                      
                            ydsx++;                      //溫度上限加1
                                if( ydsx >= 1200  ) //溫度上限大于120度
                              {
                                    ydsx=-450;        //溫度上限設(shè)置為-45度
                               }
                           
                        if        (ydsx<=0)              //溫度上限小于0時   
                                  {
                                SEG0 = 22;             //數(shù)碼管千位顯示“-”   
                                    ydsxx=abs(ydsx);           //取溫度上限絕對值
                                    SEG1 =ydsxx/100%10;      //百位 計算  
                        SEG2 = ydsxx/10%10;     //十位 計算
                        SEG3 = ydsxx/1%10;      //個位 計算
                            DspTemp();        
                              }                                
                else
                             {        
                           ydsxx=ydsx;        
                               SEG0 = ydsxx/1000%10;     //千位計算
                                   if (SEG0==0)
                                           SEG0=23;              //千位為0時 ,消隱不顯        
                       SEG1 =ydsxx/100%10;       //百位 計算  
                       SEG2 = ydsxx/10%10;       //十位 計算
                       SEG3 = ydsx/1%10;         //個位 計算
                           DspTemp();        
                             }
                                  delay_ms(30);         
                                break;
                          case  2:                           //溫度下限設(shè)置                                             
                            ydxx++;                       //溫度下限加1
                                if( ydxx >= 1200  )        
                              {
                                     ydxx=-450;
                               }
                          
                            if        (ydxx<=0)       //溫度下限小于0時   
                                  {
                                SEG0 = 22;        //數(shù)碼管第一位顯示“-”
                                    ydxxx=abs(ydxx);         //取溫度下限絕對值
                        SEG1 =ydxxx/100%10;       //百位 計算  
                        SEG2 = ydxxx/10%10;    //十位 計算
                        SEG3 = ydxxx/1%10;       //個位 計算
                            DspTemp();        
                              }                                
                else
                             {        
                           ydxxx=ydxx;        
                               SEG0 = ydxxx/1000%10;     //千位計算
                                          if (SEG0==0)
                                           SEG0=23;              //千位為0時 ,消隱不顯                                                  
                       SEG1 =ydxxx/100%10;       //百位 計算
                       SEG2 = ydxxx/10%10;       //十位 計算
                       SEG3 = ydxxx/1%10;      //個位 計算
                           DspTemp();        
                             }
                                  delay_ms(30);         
                                break;  
                  case  3:                           //溫度校準設(shè)置                                                      
                            ydjz++;                       //溫度校準加1
                                if( ydjz>= 100  )        
                              {
                                    ydjz=-100;
                              }
                           
                            if (ydjz<=0)            //溫度校準小于0時         
                                 {
                               SEG0 = 22;                 //為負時數(shù)碼管千位顯示“-”               
                                   ydjzx=abs(ydjz);           //取溫度校準絕對值
                                   SEG1 =ydjzx/100%10;       //百位 計算
                       SEG2 = ydjzx/10%10;      //十位 計算
                       SEG3 = ydjzx/1%10;    //個位 計算
                           DspTemp();        
                             }                                
                else
                             {        
                            ydjzx=ydjz;        
                                SEG0 = ydjzx/1000%10;   //千位計算
                                        if (SEG0==0)
                                           SEG0=23;              //千位為0時 ,消隱不顯      
                        SEG1 =ydjzx/100%10;      //百位 計算
                        SEG2 = ydjzx/10%10;     //十位 計算
                        SEG3 = ydjzx/1%10;    //個位 計算
                            DspTemp();        
                              }
                                  delay_ms(30);         
                                break;                                    
                        default:
                    Set_Mode=0;               
                        }                                
                    delay_ms(50);        
                 }                        
                }
if(Down == 0  )                          //減少鍵處理
        {
                SEG0 = 20;            //顯示P
                SEG1 = 22;            //顯示-
                SEG2 = 22;            //顯示-
            SEG3 = Set_Mode;      //顯示模式
                DspTemp();                      //顯示模式               
            BEEP = 0;                                //打開蜂鳴
                delay_ms(50);                        //延時50ms
            BEEP = 1;                                //關(guān)閉蜂鳴        
                delay_ms(50);                        //延時50ms
                while(Down == 0 )
                {
                  switch(Set_Mode)               //選擇設(shè)置參數(shù)               
                        {
                          case  1:                       //溫度上限設(shè)置            
                             ydsx--;                   //溫度上限減1
                                 if( ydsx <= -450  )        
                               {
                                     ydsx=1200;
                                }
                             delay_ms(10);         
                            if        (ydsx<=0)        //溫度上限小于0時   
                                  {
                                SEG0 = 22;        //數(shù)碼管第一位顯示“-”   
                                    ydsxx=abs(ydsx);         //取溫度上限絕對值
                                    SEG1 =ydsxx/100%10;      //百位 計算
                        SEG2 = ydsxx/10%10;     //十位 計算
                        SEG3 = ydsxx/1%10;       //個位 計算
                            DspTemp();        
                              }                                
                else
                             {        
                           ydsxx=ydsx;        
                               SEG0 = ydsxx/1000%10;   //千位計算
                                        if (SEG0==0)
                                           SEG0=23;              //千位為0時 ,消隱不顯      
                       SEG1 =ydsxx/100%10;      //百位 計算
                       SEG2 = ydsxx/10%10;     //十位 計算
                       SEG3 = ydsx/1%10;       //個位 計算
                           DspTemp();        
                             }
                                break;
                          case  2:                           //溫度下限設(shè)置
                       ydxx--;               //溫度下限減1
                                if( ydxx <= -450 )        
                             {
                                   ydxx=1200;
                              }
                            delay_ms(10);         
                            if        (ydxx<=0)       //溫度下限小于0時   
                                 {
                               SEG0 = 22;        //數(shù)碼管第一位顯示“-”
                                   ydxxx=abs(ydxx);         //取溫度下限絕對值
                       SEG1 =ydxxx/100%10;      //百位 計算
                       SEG2 = ydxxx/10%10;     //十位 計算
                       SEG3 = ydxxx/1%10;       //個位 計算
                           DspTemp();        
                             }                                
                else
                              {        
                           ydxxx=ydxx;        
                               SEG0 = ydxxx/1000%10;   //千位計算
                                        if (SEG0==0)
                                           SEG0=23;              //千位為0時 ,消隱不顯         
                       SEG1 =ydxxx/100%10;      //百位 計算
                       SEG2 = ydxxx/10%10;     //十位 計算
                       SEG3 = ydxxx/1%10;       //個位 計算
                           DspTemp();        
                              }
                                break;  
                  case  3:                           //溫度校準設(shè)置                                                      
                            ydjz--;               //溫度校準減1
                                if( ydjz<= -100  )        
                              {
                                     ydjz=100;
                               }
                            delay_ms(10);         
                            if (ydjz<=0)         //溫度校準小于0時         
                                  {
                                 SEG0 = 22;
                                     ydjzx=abs(ydjz);           //取溫度校準絕對值
                                     SEG1 =ydjzx/100%10;      //百位 計算
                         SEG2 = ydjzx/10%10;     //十位 計算
                         SEG3 = ydjzx/1%10;       //個位 計算
                             DspTemp();        
                              }                                
                else
                             {        
                           ydjzx=ydjz;        
                               SEG0 = ydjzx/1000%10;   //千位計算
                                        if (SEG0==0)
                                           SEG0=23;            //千位為0時 ,消隱不顯        
                       SEG1 =ydjzx/100%10;     //百位 計算
                       SEG2 = ydjzx/10%10;     //十位 計算
                       SEG3 = ydjzx/1%10;      //個位 計算
                           DspTemp();        
                             }
                                break;                                    
                        default:
                    Set_Mode=0;
                }
                  delay_ms(50);        
                }        
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:235200 發(fā)表于 2024-12-29 10:28 | 只看該作者
這種順序判斷的方法一般都會不靈敏,只有采取中斷方式,或定時掃描立即判斷按鍵才會靈敏
回復

使用道具 舉報

板凳
ID:731755 發(fā)表于 2024-12-29 11:57 來自手機 | 只看該作者
我喜歡用中斷來操作按鍵,不然就會出現(xiàn)你的這種情況。
回復

使用道具 舉報

地板
ID:1133081 發(fā)表于 2024-12-29 13:00 | 只看該作者
不要把與按鍵識別與其它功能混在一起,更不要濫用阻滯延時。
回復

使用道具 舉報

5#
ID:332444 發(fā)表于 2024-12-29 13:14 | 只看該作者
阻塞延時通病
回復

使用道具 舉報

6#
ID:71233 發(fā)表于 2024-12-29 13:39 | 只看該作者
太復雜了,我一般是先用一個按鍵函數(shù)返回鍵值,然后再鍵值不同分別做處理
  1. unsigned char key()
  2. {
  3.         if(K1==0)                //檢測按鍵K1是否按下
  4.         {
  5.                 delay_ms(20);        //消除抖動
  6.                 if(K1==0)
  7.                 {
  8.                         while(!K1);
  9.                         return 1;
  10.                 }
  11.         }
  12.         if(K2==0)                //檢測按鍵K1是否按下
  13.         {
  14.                 delay_ms(20);        //消除抖動
  15.                 if(K2==0)
  16.                 {
  17.                         while(!K2);
  18.                         return 2;
  19.                 }
  20.         }        
  21.         return 0;
  22. }
復制代碼



回復

使用道具 舉報

7#
ID:1141869 發(fā)表于 2024-12-29 15:42 | 只看該作者
中斷操作按鍵
回復

使用道具 舉報

8#
ID:1109793 發(fā)表于 2024-12-29 18:44 | 只看該作者
lmn2005 發(fā)表于 2024-12-29 13:39
太復雜了,我一般是先用一個按鍵函數(shù)返回鍵值,然后再鍵值不同分別做處理

你這不是還是用了阻塞延時?還20MS
回復

使用道具 舉報

9#
ID:72649 發(fā)表于 2024-12-30 08:08 | 只看該作者
13872888583 發(fā)表于 2024-12-29 11:57
我喜歡用中斷來操作按鍵,不然就會出現(xiàn)你的這種情況。

能不能幫我修改一下
回復

使用道具 舉報

10#
ID:72649 發(fā)表于 2024-12-30 08:09 | 只看該作者

給點思路
回復

使用道具 舉報

11#
ID:332444 發(fā)表于 2024-12-30 09:19 | 只看該作者

看我帖子
回復

使用道具 舉報

12#
ID:72649 發(fā)表于 2024-12-31 04:48 來自手機 | 只看該作者
xianfajushi 發(fā)表于 2024-12-30 09:19
看我帖子

在哪里可以看到你帖子?
回復

使用道具 舉報

13#
ID:641358 發(fā)表于 2024-12-31 09:56 | 只看該作者
太復雜了,按鍵可用中斷,也可以用按鍵標記的辦法來處理。
回復

使用道具 舉報

14#
ID:23640 發(fā)表于 2024-12-31 10:43 | 只看該作者
不要用那么多延時,不用中斷可以開個定時器,使用狀態(tài)機來做,不過首先樓主應(yīng)該把按鍵和功能先分開來,這樣的程序看著太費勁了
回復

使用道具 舉報

15#
ID:1132182 發(fā)表于 2024-12-31 11:41 | 只看該作者
太臃腫了
回復

使用道具 舉報

16#
ID:1132182 發(fā)表于 2024-12-31 11:42 | 只看該作者
code char smg_short[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,
                                                                                                 0x40,0xf9-0x80,0xa4-0x80,0xb0-0x80,0x99-0x80,0x92-0x80,0x82-0x80,0xf8-0x80,0x80-0x80,0x90-0x80,
                                                                                                0xc6,0x8c,0x88};
       
code char smg_post[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

char smg_cache[8] = {10,10,10,10,10,10,10,10};


void display_Init(void)
{
        P0 = 0xff;Y4;Y0;
        P0 = 0xff;Y5;Y0;
        P0 = 0xff;Y6;Y0;
        P0 = 0xff;Y7;Y0;
}

void smg_while(void)
{
        static char neo;
       
        P0 = 0xff;Y7;Y0;
        P0 = smg_post[neo];Y6;Y0;
        P0 = smg_short[smg_cache[neo]];Y7;Y0;
       
        neo++;
        neo%=8;
}

void smg_display(char t0,t1,t2,t3,t4,t5,t6,t7)
{
        smg_cache[0] = t0;
        smg_cache[1] = t1;
        smg_cache[2] = t2;
        smg_cache[3] = t3;
        smg_cache[4] = t4;              
        smg_cache[5] = t5;
        smg_cache[6] = t6;
        smg_cache[7] = t7;       
}數(shù)碼管顯示,
char Key_Open(void)
{
  unsigned char key;
        P3 &= 0xf0;
        P34=1;P35=1;P42=1;P44=1;
        if(!(P34&P35&P42&P44))
        {
                if(!(P34&P35&P42&P44))
                {
                        if(P34==0) key=1;
                        if(P35==0) key=2;
                        if(P42==0) key=3;
                        if(P44==0) key=4;
                        P3 |= 0x0f;
                        P34=0;P35=0;P42=0;P44=0;
                        if(P30==0) key=key;
                        if(P31==0) key=key+4;
                        if(P32==0) key=key+8;
                        if(P33==0) key=key+12;
                }
                while(P30 == 0 | P31 == 0 | P32  == 0 | P33 == 0);
        }
        return key;
}矩陣按鍵
回復

使用道具 舉報

17#
ID:1132182 發(fā)表于 2024-12-31 11:44 | 只看該作者
這不就是藍橋杯類似的東西,看我帖子,應(yīng)該可以有所收獲
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品1区 | 国产精品1区2区 | 中文精品一区二区 | 成人精品在线观看 | 日韩免费视频一区二区 | 伊人最新网址 | 黄色毛片在线看 | 国产激情视频在线观看 | 天天色图| 亚洲精品一区中文字幕乱码 | 丁香婷婷久久久综合精品国产 | 黄色av网站在线观看 | 亚洲视频三区 | 黄色大片在线视频 | 综合亚洲视频 | 免费午夜电影 | 成年人视频免费在线观看 | 国产目拍亚洲精品99久久精品 | 亚洲福利一区二区 | 亚洲精品一区中文字幕乱码 | 一区二区三区精品视频 | 日日操视频 | 亚洲iv一区二区三区 | 97影院在线午夜 | 欧美亚洲另类在线 | 黄色精品 | 欧美日韩中文字幕在线 | 久久一级大片 | 91精品国产高清久久久久久久久 | 欧美综合一区二区 | 国产一区二区三区久久久久久久久 | 亚洲综合二区 | 国产永久免费 | 亚洲视频免费在线 | 仙人掌旅馆在线观看 | 久久久久国产精品一区二区 | 在线一区二区三区 | 国产成人精品免高潮在线观看 | 男人天堂99 | 精品少妇v888av| 91在线成人 |