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

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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7951|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)按鍵微分消抖程序(判斷按下前的高電平消抖)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:70941 發(fā)表于 2015-4-19 03:20 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
該消抖方法相當(dāng)于確定了一個(gè)下降沿
1.單按鍵
#include<AT89X51.h>
#define uchar unsigned char
#define uint unsigned int
sbit key=P3^3;
void main(void)
{  
   uint n=0;
   bit flag;
   while(1)
    {
            if(P1_7==0)
                   {
                         n++;
                         if(n>300)
                            {
                               flag=1;                     
                           }
                  }
            else
               n=0;
           if(flag&P1_7==1)
               {
                    flag=0;
                    P3_7=~P3_7;//按鍵要完成的功能,這實(shí)際上是一個(gè)上升沿。不管按鍵按下多久,都只動(dòng)作一次。
               }         
    }
}


================================================================
2.4X4矩陣鍵盤
#include<AT89X51.h>
#define uchar unsigned char
#define uint unsigned int
uint key_H;//高電平計(jì)次
uchar k,n;
bit key_flag; //高電平狀態(tài)標(biāo)志位

unsigned char  code tabca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x00};//共陽(yáng)極
uchar keybd_4x4(void)
{
  P1=0xfe;
  if(P1_4==0) return 1;
  else if(P1_5==0)return 2;
  else if(P1_6==0)return 3;
  else if(P1_7==0)return 4;

  P1=0xfd;
  if(P1_4==0) return 5;
  else if(P1_5==0)return 6;
  else if(P1_6==0)return 7;
  else if(P1_7==0)return 8;

  P1=0xfb;
  if(P1_4==0) return 9;
  else if(P1_5==0)return 10;
  else if(P1_6==0)return 11;
  else if(P1_7==0)return 12;

  P1=0xf7;
  if(P1_4==0) return 13;
  else if(P1_5==0)return 14;
  else if(P1_6==0)return 15;
  else if(P1_7==0)return 16;

  return 0;
}
uchar key_do(void)
{
   uchar tab_data;
   if(k==0)   //計(jì)算沒(méi)按鍵的時(shí)間,如果沒(méi)按下保持高電平,
              if(key_flag==1)
              {
                    if(++key_H>50000)//判斷按鍵高電平次數(shù)(死循環(huán)計(jì)次),說(shuō)明高電平持續(xù)很長(zhǎng)時(shí)間
                    {
                              key_H=0;   //小于設(shè)定次數(shù)時(shí)清
                              key_flag=1;//并將標(biāo)志位置1,這樣,當(dāng)鍵按下后有低電平視為有效
                    }   
              }
              else
                     {
                            key_H=0;
                     }
    else if(k==1) //其他就是key=0
     {
            if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
            {
                    key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                    tab_data=1;
            }
     }
   else if(k==2) //其他就是key=0
     {
            if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                {
                    key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                    tab_data=2;
                }
        }
   else if(k==3) //其他就是key=0
       {
                if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=3;
                    }
         }
   else if(k==4) //其他就是key=0
         {
                if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=4;
                    }            
        }
   else if(k==5) //其他就是key=0
         {
                    if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=5;
                    }
          }
   else if(k==6) //其他就是key=0
         {
                if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=6;
                    }            
        }
   else if(k==7) //其他就是key=0
         {
                    if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=7;
                    }
          }
   else if(k==8) //其他就是key=0
         {
                if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=8;
                    }            
        }
   else if(k==9) //其他就是key=0
         {
                    if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=9;
                    }
          }
  else if(k==10) //其他就是key=0
         {
                if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=0;
                    }            
        }
  /* else if(k==11) //其他就是key=0
         {
                    if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        //功能P0=tabca[k];
                    }
          }
   else if(k==12) //其他就是key=0
         {
                if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        //功能P0=tabca[k];
                    }      
        }*/
return tab_data;
}
void LED_7seg_dis(uchar x,uchar seg_data)
{
  
    P2=1<<x-1;
    P0=tabca[seg_data];  
      
}
void main(void)
{  
   
   
   while(1)
  {   
        k=keybd_4x4();
         n=key_do();
        LED_7seg_dis(1,n);     
      
  }
}
==========================================================

3.復(fù)合按鍵程序
#include<AT89X51.h>
#define uchar unsigned char
#define uint unsigned int
uint key_H;//高電平計(jì)次
uchar k,n,range,temp,TH=20,TL=30;
bit key_flag; //高電平狀態(tài)標(biāo)志位

unsigned char  code tabca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
                             0x82,0xf8,0x80,0x90,0x00,0xbf};//共陽(yáng)極
void delay(uint us)
{
  while(us--);
}
uchar keybd_4x4(void)
{
  P1=0xfe;
  if(P1_4==0) return 1;
  else if(P1_5==0)return 2;
  else if(P1_6==0)return 3;
  else if(P1_7==0)return 4;

  P1=0xfd;
  if(P1_4==0) return 5;
  else if(P1_5==0)return 6;
  else if(P1_6==0)return 7;
  else if(P1_7==0)return 8;

  P1=0xfb;
  if(P1_4==0) return 9;
  else if(P1_5==0)return 10;
  else if(P1_6==0)return 11;
  else if(P1_7==0)return 12;

  P1=0xf7;
  if(P1_4==0) return 13;
  else if(P1_5==0)return 14;
  else if(P1_6==0)return 15;
  else if(P1_7==0)return 16;

  return 0;
}
uchar key_do(void)
{
   uchar tab_data;
   if(k==0)   //計(jì)算沒(méi)按鍵的時(shí)間,如果沒(méi)按下保持高電平,
              if(key_flag==1)
              {
                    if(++key_H>60000)//判斷按鍵高電平次數(shù)(死循環(huán)計(jì)次),說(shuō)明高電平持續(xù)很長(zhǎng)時(shí)間
                    {
                              key_H=0;   //小于設(shè)定次數(shù)時(shí)清
                              key_flag=1;//并將標(biāo)志位置1,這樣,當(dāng)鍵按下后有低電平視為有效
                    }   
              }
              else
                     {
                            key_H=0;
                     }
    else if(k==1) //其他就是key=0
     {
            if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
            {
                    key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                    tab_data=1;
            }
     }
   else if(k==2) //其他就是key=0
     {
            if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                {
                    key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                    tab_data=2;
                }
        }
   else if(k==3) //其他就是key=0
       {
                if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=3;
                    }
         }
   else if(k==4) //其他就是key=0
         {
                if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=4;
                    }            
        }
   else if(k==5) //其他就是key=0
         {
                    if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=5;
                    }
          }
   else if(k==6) //其他就是key=0
         {
                if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=6;
                    }            
        }
   else if(k==7) //其他就是key=0
         {
                    if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=7;
                    }
          }
   else if(k==8) //其他就是key=0
         {
                if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=8;
                    }            
        }
   else if(k==9) //其他就是key=0
         {
                    if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=9;
                    }
          }
  else if(k==10) //其他就是key=0
         {
                if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        tab_data=0;
                    }            
        }
   else if(k==11) //其他就是key=0
         {
                    if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        
      if(range<2)                           
                           range++;
       else
         range=0;
                           
                    }
          }
   /*else if(k==12) //其他就是key=0
         {
                if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
                    {
                        key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
                        //功能P0=tabca[k];
                    }      
        }*/
return tab_data;
}
void LED_7seg_dis(uchar x,uchar seg_data)
{
  
    P2=1<<x-1;
    P0=tabca[seg_data];  
       delay(50);
    P0=0xff;
}
void main(void)
{  
   
   temp=27;
   while(1)
  {     
        LED_7seg_dis(8,11);
  LED_7seg_dis(7,range);
        LED_7seg_dis(6,11);
        k=keybd_4x4();
        n=key_do();                  //按鍵值
        LED_7seg_dis(2,temp/10);
  LED_7seg_dis(1,temp%10);
        
      
  }
}



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

使用道具 舉報(bào)

沙發(fā)
ID:78702 發(fā)表于 2015-6-28 18:03 | 只看該作者
設(shè)計(jì)的不錯(cuò),準(zhǔn)備下載,能不能用
回復(fù)

使用道具 舉報(bào)

板凳
ID:74784 發(fā)表于 2015-7-6 20:53 | 只看該作者
消除按鍵的抖動(dòng)
最簡(jiǎn)單的辦法就是去調(diào)用顯示子程序
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品高清在线 | 日韩中文字幕在线不卡 | 99精品国产一区二区三区 | 国产成人黄色 | 国产一区二区久久 | 国产精品婷婷 | 91av精品| 欧美激情在线精品一区二区三区 | 精品视频免费在线 | 国产日韩一区二区三区 | 国产成人免费视频网站视频社区 | 热久久免费视频 | 久久久久久亚洲精品不卡 | 日日骚av| 午夜电影合集 | 精品视频一区二区三区在线观看 | av黄色在线观看 | 国产在线拍偷自揄拍视频 | 91九色porny首页最多播放 | 日一区二区 | 国产精品一区二区三区在线 | 免费在线观看成人 | 久久宗合色 | 亚洲综合国产 | 久久综合香蕉 | 久久精品一级 | 国产高潮好爽受不了了夜色 | 日韩中文字幕av | 国产精品久久久久久久久久99 | 伊人久久综合 | 亚洲二区在线 | 精品久久精品 | 欧美午夜精品久久久久久浪潮 | 国产视频二区 | 国产精品一区二区视频 | 久久免费精品 | 久久在线精品 | 日韩免费视频 | 中文欧美日韩 | 国产日韩欧美在线 | 在线啊v |