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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2223|回復: 7
收起左側

關于單片機標志位出錯,新手請求指導

[復制鏈接]
ID:601863 發表于 2019-9-17 23:21 | 顯示全部樓層 |閱讀模式
本帖最后由 H方與圓H 于 2019-9-17 23:34 編輯

新手向大家請教一個關于標志位的問題,當直接給P1口賦值時,無任何問題。當使用標志位時出錯,按下按鍵后0xfe與0xf7交替閃爍,再次按按鍵停在0xf7。
單片機源程序如下:
#include<reg52.h>           //頭文件
#define uchar unsigned char //宏定義,定義無符號字符型變量數據
#define uint unsigned int   //宏定義,定義無符號字符型變量數據
uchar a,b,c;
void delay(uint z);         //帶無符號整型變量子函數
void bc();
void key();
void main()
{
    P1=0x7f;                //P1口賦初值
    b=1;                    //標志位賦初值
    c=1;                    //標志位賦初值
    while(1)
    {
        key();
        bc();
    }
}

void delay(uint z)          //帶無符號整型變量延時子函數
{
    uint x,y;               //聲明無符號整型變量
    for(x=z;x>0;x--)        //求解表達式一;求解表達式二,若為真則執行內部
        for(y=110;y>0;y--); //語句,然后求解表達式三,反之則結束跳出
}

void bc()
{
    if(b==0)                 //檢測標志位值
        P1=0xfe;
    if(c==0)                //檢測標志位值
        P1=0xf7;

}

void key()
{
    P3=0xfe;               //P3口賦初值,掃描P3口
    a=P3;                  //聲明,a等于P3,將P3的值賦給a
    a=a&0xf0;              //“與”運算,檢測是否有按鍵按下
    if(a!=0xf0)            //“!=”測試a不等于0xf0,再次測試是否有鍵按下
   {
        delay(5);          //延時五毫秒   
        a=P3;              //將現在的a重新賦給P3
        a=a&0xf0;          //再次與運算,以確認按鍵是否被按下
        if(a!=0xf0)        //檢測是否有鍵按下,若有則執行內部語句若無則結束跳出
        {   
          //P1=0xfe;
          b=0;             //標志位賦值
        }   
        while(a!=0xf0)         //檢測按鍵是否松開
        {                  
             a=P3;              //賦值
             a=a&0xf0;          //與運算                      if(a==0xf0)
            {
                //  P1=0xf7;
                  c=0;         //標志位賦值
             }   
         }         

     }
}  

松開按鍵(P1直接賦值)

松開按鍵(P1直接賦值)

按下按鍵(P1直接賦值)

按下按鍵(P1直接賦值)

進入程序(P1直接賦值)

進入程序(P1直接賦值)
回復

使用道具 舉報

ID:462827 發表于 2019-9-18 09:31 | 顯示全部樓層
把文件全打包了發上來呀,包括仿真文件和項目文件、源碼。
回復

使用道具 舉報

ID:275826 發表于 2019-9-18 11:01 | 顯示全部樓層
你這程序,標志位都沒有復位,當然有問題
回復

使用道具 舉報

ID:601863 發表于 2019-9-18 21:34 | 顯示全部樓層
tyrl800 發表于 2019-9-18 11:01
你這程序,標志位都沒有復位,當然有問題

謝謝指點,但是我現在將標志位復位,依然有問題。
void bc()
{
    if(b==0)                 //檢測標志位值
    {              
        P1=0xfe;
        if(P1==0xfe)       //檢測LED狀態
        {     
             b=1;            //標志位復位
         }
     }
    if(c==0)                //檢測標志位值
    {        
        P1=0xf7;
        if(P1==0xf7)      //檢測LED狀態
        {
            c=1;            //標志位復位
        }
     }   
}
  
我改成這樣之后,開始沒問題,當我按下按鍵無任何反應變化,松開按鍵直接點亮0xf7然后常亮。不論怎么按按鍵都無任何反應變化。
中間按下按鍵這部分看上去是被跳過了,但是我用直接給P1口賦值和把C屏蔽掉測試發現這部分并沒被跳過。但是仿真實際表現是跳過了。
回復

使用道具 舉報

ID:601863 發表于 2019-9-18 21:37 | 顯示全部樓層
hantu 發表于 2019-9-18 09:31
把文件全打包了發上來呀,包括仿真文件和項目文件、源碼。

上傳壓縮包?我沒注意到在哪兒上傳呀?
回復

使用道具 舉報

ID:213173 發表于 2019-9-19 09:28 | 顯示全部樓層
H方與圓H 發表于 2019-9-18 21:34
謝謝指點,但是我現在將標志位復位,依然有問題。
void bc()
{

樓主去掉所有多余語句加標志復位就行了
  1. #include<reg52.h>           
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar a,b,c;

  5. void delay(uint z)
  6. {
  7.     uint x,y;   
  8.     for(x=z;x>0;x--)
  9.         for(y=110;y>0;y--);
  10. }
  11. void key()
  12. {
  13.         P3=0x0f;
  14.         if(P3!=0x0f)
  15.         {
  16.                 delay(5);
  17.                 if(P3!=0x0f)
  18.                 {   
  19.                         if(P3==0x0e)
  20.                                 b=0;
  21.                         if(P3==0x0d)
  22.                                 c=0;
  23.                 }
  24.         }
  25. }
  26. void bc()
  27. {
  28.     if(b==0)
  29.     {              
  30.                 P1=0xfe;
  31.                 b=1;
  32.         }
  33.     if(c==0)
  34.         {        
  35.                 P1=0xf7;
  36.                 c=1;
  37.         }   
  38. }
  39. void main()
  40. {
  41.     P1=0x7f;                //P1口賦初值
  42.     b=1;                    //標志位賦初值
  43.     c=1;                    //標志位賦初值
  44.     while(1)
  45.     {
  46.         key();
  47.         bc();
  48.     }
  49. }
  50.   
復制代碼
回復

使用道具 舉報

ID:601863 發表于 2019-9-19 15:43 | 顯示全部樓層
wulin 發表于 2019-9-19 09:28
樓主去掉所有多余語句加標志復位就行了

非常感謝您的熱心指點,不過您是讓它第二個按鍵按下去亮0xf7,我是想利用標志位讓它松手的時候亮0xf7。謝謝。
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表