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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1999|回復: 7
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 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;         //標志位賦值
             }   
         }         

     }
}  

-3ca6ad3fd30b49b9.jpg (69.32 KB, 下載次數: 42)

松開按鍵(P1直接賦值)

松開按鍵(P1直接賦值)

18f6fbe548c3d299.jpg (85.85 KB, 下載次數: 46)

按下按鍵(P1直接賦值)

按下按鍵(P1直接賦值)

1ecc535b05718c0f.jpg (106.66 KB, 下載次數: 45)

進入程序(P1直接賦值)

進入程序(P1直接賦值)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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屏蔽掉測試發現這部分并沒被跳過。但是仿真實際表現是跳過了。
回復

使用道具 舉報

5#
ID:601863 發表于 2019-9-18 21:37 | 只看該作者
hantu 發表于 2019-9-18 09:31
把文件全打包了發上來呀,包括仿真文件和項目文件、源碼。

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

使用道具 舉報

6#
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.   
復制代碼
回復

使用道具 舉報

7#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕精品一区二区三区精品 | 久久久精品久 | www.国产.com| 午夜影院 | 亚洲欧美一区二区三区国产精品 | 极品销魂美女一区二区 | 欧美激情第一区 | 国产亚洲一区二区三区在线观看 | 亚洲电影第1页 | 亚洲精品一区二三区不卡 | 国产丝袜一区二区三区免费视频 | www午夜视频 | 色视频成人在线观看免 | 少妇黄色 | 亚洲午夜一区二区 | 中文字幕亚洲视频 | 国产伦精品一区二区三区精品视频 | 亚洲精彩免费视频 | 激情久久av一区av二区av三区 | 免费看一区二区三区 | 成人在线视频一区二区三区 | 久久精品一区二区三区四区 | 日韩成人在线播放 | 国产精品区二区三区日本 | 欧美一区二区在线看 | 秋霞国产 | 亚洲第一女人av | 久久青视频 | 国产一区在线免费观看 | 午夜久久久 | 久久在线视频 | 久久亚洲国产 | 国产精品美女在线观看 | 欧美日韩一区二区三区不卡视频 | 天堂色 | 91视频国产一区 | 久久亚洲一区二区 | 色综合色综合网色综合 | 久草中文网| 国产一级免费视频 | 成人免费视频观看视频 |