欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 單片機(jī)按鍵控制led流水燈閃程序錯(cuò)誤解決 [打印本頁]

作者: ncml    時(shí)間: 2021-6-17 12:49
標(biāo)題: 單片機(jī)按鍵控制led流水燈閃程序錯(cuò)誤解決
求大佬看看這個(gè)程序的錯(cuò)誤
我想設(shè)計(jì)一個(gè)程序?qū)崿F(xiàn),一個(gè)按鍵控制led流水燈閃,一個(gè)按鍵控制滅。但現(xiàn)在按鍵卻沒有反應(yīng),求大佬看看哪里出了問題
單片機(jī)源程序如下:
#include "reg52.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器
#include<intrins.h>                //因?yàn)橐玫阶笥乙坪瘮?shù),所以加入這個(gè)頭文件

typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;

#define led P2           //將P2口定義為led 后面就可以使用led代替P2口
sbit k1=P3^1; //定義 P31 口是 k1
sbit k2=P3^0;
/*
函 數(shù) 名         : delay
函數(shù)功能                 : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
*/
void delay(u16 i)
{
        while(i--);        
}
函 數(shù) 名         : keypros
函數(shù)功能         : 按鍵處理函數(shù),判斷按鍵 K1 是否按下
*/
void keypros()
{         u8 a=0;
     if(k1==0) //檢測按鍵 K1 是否按下
      {
        delay(1000); //消除抖動(dòng) 一般大約 10ms
        if(k1==0) //再次判斷按鍵是否按下
       {
            a=1;
         
       }
        while(!k1);  //檢測按鍵是否松開               
                }
     if(k2==0) //檢測按鍵 K1 是否按下
      {
        delay(1000); //消除抖動(dòng) 一般大約 10ms
        if(k2==0) //再次判斷按鍵是否按下
       {
            a=0;
         
       }
        while(!k2);  //檢測按鍵是否松開               
                }
}

/*
函 數(shù) 名       : main
函數(shù)功能           : 主函數(shù)
*/

void main()
{  u8 a;
   u8 i=0;
   
   
  while(1)
  {        
    keypros();
    if(a==1)
        {        
        led=0xfe;    //         P2  1111 1110(7654 3210)
        delay(50000); //大約延時(shí)450ms        
        
                        for(i=0;i<7;i++)         //將數(shù)字左移一位,led燈右移
                {
                        led=_crol_(led,1);
                        delay(50000); //大約延時(shí)450ms        
                }
        keypros();        
        
        }        
          else{led=0xff;
        keypros();
        }
        
   }
   

  

}

作者: 累不死的狗    時(shí)間: 2021-6-17 14:32
感覺應(yīng)該是按鍵的延時(shí)時(shí)間太長了

作者: hz_dyg    時(shí)間: 2021-6-17 14:44
兩個(gè)變量a是啥意思?你想表達(dá)什么樣的邏輯?
作者: xuyaqi    時(shí)間: 2021-6-17 14:51
按鍵狀態(tài)不能被及時(shí)檢測造成,最好按鍵狀態(tài)由外部中斷及時(shí)檢測。
作者: ncml    時(shí)間: 2021-6-17 15:27
xuyaqi 發(fā)表于 2021-6-17 14:51
按鍵狀態(tài)不能被及時(shí)檢測造成,最好按鍵狀態(tài)由外部中斷及時(shí)檢測。

那怎么解決啊?求教
作者: 菜鳥yc    時(shí)間: 2021-6-17 15:49
這邊建議你回頭看看C語言。
  1. void keypros()函數(shù)的a,是局部變量。
  2. void main()函數(shù)的a,是局部變量。
  3. 它們是兩個(gè)變量。
  4. 解決方法:取消這兩個(gè)局部變量,開設(shè)一個(gè)新的全局變量a。
復(fù)制代碼

以上。
作者: hz_dyg    時(shí)間: 2021-6-17 16:01
ncml 發(fā)表于 2021-6-17 15:27
那怎么解決?求教

按鍵檢測也許是有問題,但也不至于不能用,對(duì)初學(xué)者,這樣的做法也能理解。問題的關(guān)鍵在于你全局變量和局部變量沒有搞清楚,還有函數(shù)返回值也沒有概念。
作者: hz_dyg    時(shí)間: 2021-6-17 16:07
任重而道遠(yuǎn)!還是希望打好基礎(chǔ),做應(yīng)用能做和做好,還是差別很大的!
作者: 280543115    時(shí)間: 2021-6-17 16:30
局部變量 函數(shù)1中的a和函數(shù)2中的a其實(shí)是兩個(gè)不同的a
作者: xuyaqi    時(shí)間: 2021-6-17 16:35
ncml 發(fā)表于 2021-6-17 15:27
那怎么解決啊?求教

在你程序基礎(chǔ)上改了,你試一下。
//k1按下燈循環(huán),k2按下停

#include "reg52.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器
#include<intrins.h>                //因?yàn)橐玫阶笥乙坪瘮?shù),所以加入這個(gè)頭文件

typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;

sbit k1=P3^1; //定義 P31 口是 k1
sbit k2=P3^0;

u8 a;

/*
函 數(shù) 名         : keypros
函數(shù)功能         : 按鍵處理函數(shù),判斷按鍵 K1 是否按下
*/
void keypros()
{         
  if(k1==0) //檢測按鍵 K1 是否按下
        {
               
         if(k1==0) //再次判斷按鍵是否按下
         {
                                a=1;
         }
                while(!k1);  //檢測按鍵是否松開               
        }
  if(k2==0) //檢測按鍵 K1 是否按下
        {
               
                if(k2==0) //再次判斷按鍵是否按下
         {
                                a=0;
                 
         }
                while(!k2);  //檢測按鍵是否松開               
        }
}

/*
函 數(shù) 名         : delay
函數(shù)功能                 : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
*/
void delay(u16 i)
{
        u16 m;
       
  for(m=0;m<i;)//  
        {
                keypros();
                m++;
        }

}

/*
函 數(shù) 名       : main
函數(shù)功能           : 主函數(shù)
*/
void main()
{  
  u8 ii=0;
        u8 led;
       
  while(1)
  {      
    keypros();
    if(a==1)
                {      
                        led=0xfe;    //         P2  1111 1110(7654 3210)
                                         
                        for(ii=0;ii<7;)//將數(shù)字左移一位,led燈右移         
                        {
                                //keypros();
                                led=_crol_(led,1);
                                P2=led;
                                delay(20000); //
        ii++;                               
                        }
                        keypros();      
         
                }      
    led=0xff;    //
                P2=led;
   }
       
         
}
作者: hz_dyg    時(shí)間: 2021-6-17 16:57
xuyaqi 發(fā)表于 2021-6-17 16:35
在你程序基礎(chǔ)上改了,你試一下。
//k1按下燈循環(huán),k2按下停

越改越錯(cuò)啦!按鍵檢測里,必要的延遲還是需要的。
作者: 名字不是重點(diǎn)    時(shí)間: 2021-6-17 18:00
按鍵沒延時(shí),如何去抖動(dòng)?
作者: ncml    時(shí)間: 2021-6-17 19:09
菜鳥yc 發(fā)表于 2021-6-17 15:49
這邊建議你回頭看看C語言。
以上。

我已經(jīng)知道錯(cuò)誤了,感謝
作者: ncml    時(shí)間: 2021-6-17 19:10
hz_dyg 發(fā)表于 2021-6-17 16:01
按鍵檢測也許是有問題,但也不至于不能用,對(duì)初學(xué)者,這樣的做法也能理解。問題的關(guān)鍵在于你全局變量和局 ...

好的,我主要是為了做作業(yè),以后有機(jī)會(huì)會(huì)加深了解的
作者: ncml    時(shí)間: 2021-6-17 19:16
菜鳥yc 發(fā)表于 2021-6-17 15:49
這邊建議你回頭看看C語言。
以上。

請問一下,我現(xiàn)在按樓下修改的添加了全局變量,k1點(diǎn)亮沒問題,但k2必須長按才能熄滅是什么原因?
作者: ncml    時(shí)間: 2021-6-17 19:19
菜鳥yc 發(fā)表于 2021-6-17 15:49
這邊建議你回頭看看C語言。
以上。

不用了,我懂了,我必須在led流水燈的流程結(jié)束的一瞬間執(zhí)行按鍵函數(shù)的時(shí)候按k2才能執(zhí)行函數(shù)使led熄滅。
作者: xuyaqi    時(shí)間: 2021-6-17 19:38
hz_dyg 發(fā)表于 2021-6-17 16:57
越改越錯(cuò)啦!按鍵檢測里,必要的延遲還是需要的。

為了按鍵的及時(shí)性沒有延時(shí)也是可以的,不要太教條,不要延時(shí)會(huì)產(chǎn)生什么問題?
作者: xuyaqi    時(shí)間: 2021-6-17 19:41
名字不是重點(diǎn) 發(fā)表于 2021-6-17 18:00
按鍵沒延時(shí),如何去抖動(dòng)?

在這個(gè)程序里不去抖動(dòng)會(huì)出什么問題,不要太教條。
作者: xuyaqi    時(shí)間: 2021-6-17 19:46
ncml 發(fā)表于 2021-6-17 19:16
請問一下,我現(xiàn)在按樓下修改的添加了全局變量,k1點(diǎn)亮沒問題,但k2必須長按才能熄滅是什么原因?

還是按鍵響應(yīng)不及時(shí)問題。
作者: hz_dyg    時(shí)間: 2021-6-18 09:19
xuyaqi 發(fā)表于 2021-6-17 19:41
在這個(gè)程序里不去抖動(dòng)會(huì)出什么問題,不要太教條。

。? 不去抖,按鍵按下瞬間,很多次跳變,你的程序還能按邏輯運(yùn)行嗎? 這不是教條不教條的問題,沒有技術(shù)能原諒,但誤人子弟不能原諒!
作者: xuyaqi    時(shí)間: 2021-6-18 09:25
hz_dyg 發(fā)表于 2021-6-18 09:19
。? 不去抖,按鍵按下瞬間,很多次跳變,你的程序還能按邏輯運(yùn)行嗎? 這不是教條不教條的問題,沒有技 ...

跳變次數(shù)再多也是 a=1,會(huì)出問題嗎?
作者: 開心就好hhhh    時(shí)間: 2021-6-18 11:04
ncml 發(fā)表于 2021-6-17 19:19
不用了,我懂了,我必須在led流水燈的流程結(jié)束的一瞬間執(zhí)行按鍵函數(shù)的時(shí)候按k2才能執(zhí)行函數(shù)使led熄滅。

你如果想隨時(shí)滅掉流水燈,最好設(shè)置外部中斷,這樣就可以隨時(shí)滅燈了,非常方便
作者: 名字不是重點(diǎn)    時(shí)間: 2021-6-18 16:40
xuyaqi 發(fā)表于 2021-6-17 19:41
在這個(gè)程序里不去抖動(dòng)會(huì)出什么問題,不要太教條。

這不是教條不教條, 是關(guān)乎軟件代碼的強(qiáng)壯!不延時(shí)不怕誤觸發(fā)?不怕干擾?誰家代碼的按鍵不做去抖?
如同進(jìn)餐館吃飯,有人要燙一下碗筷,而有些人覺得麻煩不燙,一樣的道理。
玩玩可以,真要做產(chǎn)品只能呵呵了。萬分之一的BUG機(jī)率,對(duì)客戶來說就是100%的出錯(cuò)。
作者: 名字不是重點(diǎn)    時(shí)間: 2021-6-18 16:44
沒有去抖,可能邊上一個(gè)小車啟動(dòng)一下、大功率電器一個(gè)開關(guān)、、、你需要的狀態(tài)就不復(fù)存在 了。。。
作者: lishengaha    時(shí)間: 2021-6-20 12:02
你最后檢測松開的代碼應(yīng)該放在第二次檢測按下的括號(hào)里,因?yàn)槟闶羌恿讼堆訒r(shí)的,如果是抖動(dòng)帶來的低電平,延時(shí)之后進(jìn)入了高電平,這樣你的程序就卡在了檢測是否松開,  雖然你把延時(shí)消了能解決這個(gè)問題。但是消抖的功能也就沒了




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1