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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1880|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人99久久亚洲综合精品 | 日本久久精品 | 欧美不卡视频一区发布 | 国产日产欧产精品精品推荐蛮挑 | 国产电影精品久久 | 在线看片福利 | 色综合99 | 久久99精品久久久久久青青日本 | 在线婷婷 | 久久亚洲综合 | 精品一区久久 | 久久精品在线免费视频 | 亚洲成av人影片在线观看 | 精品欧美乱码久久久久久 | 日韩欧美国产精品一区 | 国内精品免费久久久久软件老师 | 国产91精品久久久久久久网曝门 | 免费成人在线网站 | 亚洲综合无码一区二区 | 精品国产一区久久 | 免费一区二区三区 | 亚洲综合色自拍一区 | 丁香久久 | 黄色a三级| 国产欧美一区二区三区在线看 | 国户精品久久久久久久久久久不卡 | 成人在线电影在线观看 | 日韩视频在线观看中文字幕 | 久久久久久久久99 | 亚洲精品一区在线观看 | 色一情一乱一伦一区二区三区 | 精品视频国产 | 精品成人免费视频 | 欧美一级片免费看 | 性色视频 | 中文字幕在线免费观看 | 日韩a级片| 国产欧美一区二区三区日本久久久 | 亚洲欧美国产一区二区三区 | 一区二区三区四区毛片 | 国产精品亚洲视频 |