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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

為什么我的單片機按鍵松手檢測沒有效果?這個代碼我在另外一個項目中是可以用的,...

[復(fù)制鏈接]
回帖獎勵 15 黑幣 回復(fù)本帖可獲得 5 黑幣獎勵! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
ID:602220 發(fā)表于 2020-1-15 17:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg52.h>
#include"key.h"

#define uchar unsigned char
#define uint unsigned int


/*******************************************************************************
* 函 數(shù) 名         : key
* 函數(shù)功能       : 掃描四個獨立按鍵并消抖
* 輸    入         : 無
* 輸    出         : key_can
* 說    明         :
*******************************************************************************/
void key()
{
//key_new 通過消抖后得到的按鍵新值, key_old 按鍵舊值 ,key_value 按鍵標志位,用于消抖
if(key_new ==0) //檢測按鍵是否已經(jīng)松開
{
  if((key_io & 0x0f) == 0x0f)  //如果按鍵全為1,則按鍵與全部松開
   key_value ++;
   else
   key_value = 0;
  if(key_value >=5)
  {
   key_value = 0;
   key_new = 1;
  }
}
else
{
  if((key_io & 0x0f) != 0x0f)    //用于檢測是否有按鍵按下,若消抖后確定存在則key_new 清零等待松手信號
   key_value ++;
  else
   key_value = 0;
  if(key_value >= 5)
  {
   key_value = 0;
   key_new = 0;
  }
}
  key_can = 0;
        if((key_new == 0) && (key_old == 1))//若原本是舊按鍵信號是松手,新按鍵信號是有按鍵按下則判斷是那個鍵被按下
        {
                switch(key_io & 0x0f)
                {
                        case 0x0e: key_can = 1; break;          //得到按鍵值
                        case 0x0d: key_can = 2; break;          //得到按鍵值
                        case 0x0b: key_can = 3; break;   
            case 0x07: key_can = 4; break;//得到按鍵值
                }
        }                        
        key_old = key_new;         
}

********************************************************************************************************

#include<reg52.h>
#include<string.h>
#include"key.h"
#include"LCD1602.h"
#include"main.h"

void main(void)
{
unsigned char  j;
unsigned char  time[4]={'0','0','0','0'};
unsigned char weight[4]={'0','0','X','X'};

LcdInit();
Init_time0();

while(1)
{
  switch(flag_window)
  {
   case 0x00 :
   
   strcpy(first_line,"   Smart   Bin   ");
   strcpy(second_line," Please  Select ");   
   Lcd_first_line(first_line);
   Lcd_second_line(second_line) ;
  
   switch(key_can)
   {
   case 1:  
    flag_window = 0x01;break;
   case 2:
     flag_window = 0x02;break;
   case 3:
    flag_window = 0x03;break;
   case 4:flag_full=1;break;
   default :flag_window = 0x00  ;break;
   }  
   
   break;
   
   case 0x01:
   
   strcpy(first_line,"Open Speed:     ");
   strcpy(second_line,"+  -  Sure  Back");   
   Lcd_first_line(first_line);
   Lcd_second_line(second_line);
   j=1;

   while(j)
   {
    LcdWriteCom(0x8C);
    LcdWriteData(open_v_bf);
   
    switch(key_can)
    {
     case 1:if(open_v_bf<'9')LcdWriteData(++open_v_bf);
      flag_window = 0x01;break;
     case 2:
      if(open_v_bf>'0')LcdWriteData(--open_v_bf);
      flag_window = 0x01;break;
     case 3:
      open_v = (open_v_bf-30);LcdWriteCom(0x8E);LcdWriteData('O');LcdWriteCom(0x8F);LcdWriteData('K');
      flag_window = 0x01;break;
     case 4:flag_window = 0x00;j=0;break;
     default :flag_window = 0x01 ; break;
    }
         
   }
   
   break;
   
    case 0x02:
   strcpy(first_line,"Band up Standard");
    strcpy(second_line," H  T  W   Back ");
   Lcd_first_line(first_line);   
   Lcd_second_line(second_line);
  
   switch(key_can)
  {
   case 1:  
    flag_window = 0x04;break;
   case 2:
    flag_window = 0x05;break;
   case 3:
    flag_window = 0x06;break;
   case 4:flag_window = 0x00;break;
   default :flag_window = 0x02 ; break;         
  }

  
  break;  
  case 0x03 :
  strcpy(first_line,"Envelop Strength");
  strcpy(second_line," H  M  L Back   ");  
  Lcd_first_line(first_line);
  Lcd_second_line(second_line);
  
   switch(key_can)
   {
   case 1:rub_he =10 ;flag_window = 0x03;LcdWriteCom(0xCE);LcdWriteData('O');LcdWriteCom(0xCF);LcdWriteData('K');Delay();
    break;
   case 2:rub_he =20 ;flag_window = 0x03;LcdWriteCom(0xCE);LcdWriteData('O');LcdWriteCom(0xCF);LcdWriteData('K');Delay();
    break;
   case 3:rub_he =30 ;flag_window = 0x03;LcdWriteCom(0xCE);LcdWriteData('O');LcdWriteCom(0xCF);LcdWriteData('K');Delay();
    break;
   case 4:flag_window = 0x00;break;
   default :flag_window = 0x03 ; break;
   }
  
  
  break;
  
   case 0x04 :
  strcpy(first_line,"Garbage Height  ");
  strcpy(second_line,"Max Med Min Back");
  Lcd_first_line(first_line);
  Lcd_second_line(second_line);
  

  switch(key_can)
  {
  case 1:rub_he =10 ;flag_window = 0x04;LcdWriteCom(0x8E);LcdWriteData('O');LcdWriteCom(0x8F);LcdWriteData('K');Delay();
   break;
  case 2:rub_he =20 ;flag_window = 0x04;LcdWriteCom(0x8E);LcdWriteData('O');LcdWriteCom(0x8F);LcdWriteData('K');Delay();
   break;
  case 3:rub_he =30 ;flag_window = 0x04;LcdWriteCom(0x8E);LcdWriteData('O');LcdWriteCom(0x8F);LcdWriteData('K');Delay();
   break;
  case 4:flag_window = 0x02;break;
  default :flag_window = 0x04 ; break;
  }
   
  
  break;
  
  case 0x05 :
  strcpy(first_line,"Hour:  Min:     ");
  strcpy(second_line,"   +  -  OK Back");
  Lcd_first_line(first_line);
  Lcd_second_line(second_line);
  
  for(j=0;j<4&&j>=0;)
  {
   LcdWriteCom(0x85);LcdWriteData(time[0]);
   LcdWriteCom(0x86);LcdWriteData(time[1]);
   LcdWriteCom(0x8B);LcdWriteData(time[2]);
   LcdWriteCom(0x8C);LcdWriteData(time[3]);
   
   switch(j)
   {
    case 0:LcdWriteCom(0x85);break;
    case 1:LcdWriteCom(0x86);break;
    case 2:LcdWriteCom(0x8B);break;
    case 3:LcdWriteCom(0x8C);break;
    default:break;
   }
  
   switch(key_can)
   {
   case 1:
   if(j!=2){if(time[j]<'9')++time[j];}else{if(time[j]<'6')++time[j];}  
   flag_window = 0x05;break;                     
   case 2:if(time[j]>'0')--time[j];
   flag_window = 0x05;break;
   case 3:time_set[j]=time[j];j++;
   flag_window = 0x05;break;
   case 4:j--;
   flag_window = 0x05;break;
   default :flag_window = 0x05; break;
   }
   
  }
   if(j==4)
   {  
    LcdWriteCom(0x8E);LcdWriteData('O');LcdWriteCom(0x8F);LcdWriteData('K');
   }
   else
   {
   LcdWriteCom(0x8E);LcdWriteData('C');LcdWriteCom(0x8F);LcdWriteData('C');
   time_set[0]=time_set[1]=time_set[2]=time_set[3]='0';  
   }
  Delay();
   hour_set =  (time_set[0]-30)*10+(time_set[1]-30);
   min_set =  (time_set[2]-30)*10+(time_set[3]-30);
   flag_window = 0x02; break;
   
  case 0x06:
  strcpy(first_line," . <Weight< .   ");
  strcpy(second_line,"+  -  Sure  Back");   
  Lcd_first_line(first_line);
  Lcd_second_line(second_line);
  
  for(j=0;j<4&&j>=0;)
  {
   LcdWriteCom(0x80);LcdWriteData(weight[0]);
   LcdWriteCom(0x82);LcdWriteData(weight[1]);
   LcdWriteCom(0x8B);LcdWriteData(weight[2]);
   LcdWriteCom(0x8D);LcdWriteData(weight[3]);
   
  switch(j)
  {
   case 0:LcdWriteCom(0x80);break;
   case 1:LcdWriteCom(0x82);break;
   case 2:LcdWriteCom(0x8B);break;
   case 3:LcdWriteCom(0x8D);break;
   default:break;
  }
  
  switch(key_can)
   {
  case 1:if(weight[j]<'9')LcdWriteData(++weight[j]);else LcdWriteData(weight[j]='X');
  flag_window = 0x06;break;                     
  case 2:if(weight[j]>'0'&&weight[j]!='X')LcdWriteData(--weight[j]); if(weight[j]=='X') LcdWriteData(weight[j]='9');
  flag_window = 0x06;break;
  case 3:weight_set[j]=weight[j];j++;
  flag_window = 0x06;break;
  case 4:j--;
  flag_window = 0x06;break;
  default :flag_window = 0x06; break;
  }
   
  }
    if(j==4)
   {  
     LcdWriteCom(0x8E);LcdWriteData('O');LcdWriteCom(0x8F);LcdWriteData('K');
     if(weight_set[0]!='X'&&weight_set[1]!='X')
     weight_min = (weight_set[0]-30)+(weight_set[1]-30)/10;
    else
     weight_min = 10000;
    if(weight_set[2]!='X'&&weight_set[3]!='X')
     weight_max = (weight_set[2]-30)+(weight_set[3]-30)/10;
    else
     weight_max = 10000;
   }
   else
   {
    LcdWriteCom(0x8E);LcdWriteData('C');LcdWriteCom(0x8F);LcdWriteData('C');
    weight_set[0]=weight_set[1] ='0';weight_set[2]=weight_set[3] = 'X';
     weight_min = 0.0;
    weight_max = 10000;
   }
   
  Delay();
   flag_window = 0x02;break;
   default :flag_window = 0x00 ; break;
  }
}
}
void Delay() // 12M晶振1s延時
{
unsigned char h, i, j, k;
for (h = 5; h > 0; h--)
for (i = 4; i > 0; i--)
for (j = 116; j > 0; j--)
for (k = 214; k > 0; k--);
}

void Init_time0(void)
{
TMOD &= 0XF0;
TMOD |= 0X01;
TH0 = 0XD8; //5MS定時
TL0 = 0XF0;
TR0 = 1;
ET0 = 1;
EA =  1;
}

void Interrupt_time0(void) interrupt 1
{
TH0 = 0XD8; //5MS定時
TL0 = 0XF0;
key();
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:258566 發(fā)表于 2020-1-15 21:55 | 只看該作者
主程序中的WHILE 1 循環(huán)一圈需要多長時間,如果大于定時器值,注釋掉key_can = 0;
回復(fù)

使用道具 舉報

板凳
ID:275826 發(fā)表于 2020-1-15 22:15 | 只看該作者
你的按鍵掃描程序太復(fù)雜了,一般只要三條語句
回復(fù)

使用道具 舉報

地板
ID:473159 發(fā)表于 2020-1-16 10:57 | 只看該作者
如果同你說在別的芯片上能正常運行,只能說明你這里代碼的時間沒有調(diào)節(jié)好,先將時間調(diào)到相似試試
回復(fù)

使用道具 舉報

5#
ID:602220 發(fā)表于 2020-1-17 09:47 | 只看該作者
好的,謝謝各位了,我試試看,新手上路,一些東西都不懂
回復(fù)

使用道具 舉報

6#
ID:602220 發(fā)表于 2020-1-17 09:49 | 只看該作者
tyrl800 發(fā)表于 2020-1-15 22:15
你的按鍵掃描程序太復(fù)雜了,一般只要三條語句

因為在主程序里面有一些地方在一個窗口內(nèi)需要不斷循環(huán),在不同的窗口時間不一樣,之前使用的延時在不同窗口下靈敏度不同,所以想著用松手檢測可以讓靈敏度相對一致。您有什么好的建議嗎?剛剛學(xué)習(xí),不算很懂
回復(fù)

使用道具 舉報

7#
ID:602220 發(fā)表于 2020-1-17 09:50 | 只看該作者
yoxi 發(fā)表于 2020-1-16 10:57
如果同你說在別的芯片上能正常運行,只能說明你這里代碼的時間沒有調(diào)節(jié)好,先將時間調(diào)到相似試試

好的,謝謝,我試試,剛剛學(xué)習(xí),對時間上把握比較不好
回復(fù)

使用道具 舉報

8#
ID:602220 發(fā)表于 2020-1-17 09:51 | 只看該作者
cccc888 發(fā)表于 2020-1-15 21:55
主程序中的WHILE 1 循環(huán)一圈需要多長時間,如果大于定時器值,注釋掉key_can = 0;

好的,謝謝
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久国 | 岛国av一区二区 | 中文在线一区二区 | www国产亚洲精品久久网站 | 日韩另类视频 | 超碰在线人人 | 午夜av电影院| 国产95在线| 99久久夜色精品国产亚洲96 | 黄色片视频免费 | 龙珠z国语版在线观看 | 91免费版在线观看 | 国产xxxx搡xxxxx搡麻豆 | 精品国产91亚洲一区二区三区www | 在线不卡一区 | 亚洲激精日韩激精欧美精品 | 日韩欧美在线视频一区 | 精品久久中文字幕 | h片在线观看网站 | 亚洲第一av | 一区二区三区福利视频 | 国产精久久久久久久 | 国产高清视频一区 | 国产视频一区二区在线观看 | 亚洲欧美另类在线 | 国产精品视频网 | h片在线看 | 亚洲少妇综合网 | 久久久妇女国产精品影视 | 精品成人在线视频 | 啪视频在线 | 国产精品a免费一区久久电影 | 亚洲一区二区三区视频 | 天堂一区二区三区四区 | 国产三区在线观看视频 | 中日av| 久久毛片| www.亚洲 | 欧美又大粗又爽又黄大片视频 | 国产精品久久久久一区二区三区 | 99久久精品国产毛片 |