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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2527|回復: 14
收起左側

求助:中斷函數問題

[復制鏈接]
ID:1059305 發表于 2022-12-28 14:30 | 顯示全部樓層 |閱讀模式
目的:單片機上電后,顯示流水燈,按下按鍵后小燈全亮,然后返回主函數,繼續顯示流水燈。
目前問題:按下按鍵后,小燈全亮,但松開按鍵后小燈還是保持全亮,沒有恢復中斷前的狀態。
請問這是什么原因導致,以下是代碼
#include <reg52.h>
#include <intrins.h>
#define LED P0

sbit K1=P3^2;
int a;

void delay(ms)
{
        int i;
        while(ms--)
        {
                for (i=0;i<100;i++)
                {
                        ;
                }
        }
}

void zhongduan()
{
        EA=1;
        EX0=1;
}

void main()
{
        a=0;
        zhongduan();
        LED=0xfe;
        delay(200);
        while(1)
        {
               
                for(a=0;a<7;a++)
                {
                        LED=_crol_(LED,1);

                        delay(250);
                }
               
                for(a=0;a<7;a++)
                {
                        LED=_cror_(LED,1);

                        delay(250);
                }
      
}
}
void init0() interrupt 0
{
        if(K1==0)
        {
                delay(10);
                if(K1==0)
                {
                        LED=0x00;
                        delay(200);
                }
        }
      
}
回復

使用道具 舉報

ID:213173 發表于 2022-12-28 20:17 | 顯示全部樓層
你在中斷中已經改變LED狀態0x00,出中斷后LED沒有恢復之前狀態,主函數繼續左(右)移0x00能有什么意義?

void init0() interrupt 0
{
        unsigned char num;

        if(K1==0)
        {
                delay(10);
                if(K1==0)
                {
                        num=LED;//保存當前狀態
                        LED=0x00;
                        delay(200);
                        LED=num;//恢復之前狀態
                }
        }
}
回復

使用道具 舉報

ID:1056573 發表于 2022-12-29 05:30 | 顯示全部樓層
void zhongduan()函數里少了個外部中斷觸發方式IT0=1;。
回復

使用道具 舉報

ID:94031 發表于 2022-12-29 07:01 | 顯示全部樓層
中斷處理要求時間越短越好,不要在中斷里延時。
回復

使用道具 舉報

ID:1059305 發表于 2022-12-29 09:31 | 顯示全部樓層
wulin 發表于 2022-12-28 20:17
你在中斷中已經改變LED狀態0x00,出中斷后LED沒有恢復之前狀態,主函數繼續左(右)移0x00能有什么意義?
...

謝謝!!!!我明白了
回復

使用道具 舉報

ID:1059305 發表于 2022-12-29 09:35 | 顯示全部樓層
ytchfp163 發表于 2022-12-29 05:30
void zhongduan()函數里少了個外部中斷觸發方式IT0=1;。

我也試過加上這個IT0=1但還是不行,按照上一樓修改代碼,可以不寫IT0=1也可以實現
回復

使用道具 舉報

ID:1059305 發表于 2022-12-29 09:36 | 顯示全部樓層
xuyaqi 發表于 2022-12-29 07:01
中斷處理要求時間越短越好,不要在中斷里延時。

好的,好的下一步我試試用個定時器代替延時
回復

使用道具 舉報

ID:624769 發表于 2022-12-29 13:34 來自觸屏版 | 顯示全部樓層
了解一下什么叫現場保護,恢復現場,學會push,pop的用法。
回復

使用道具 舉報

ID:1059305 發表于 2022-12-29 14:20 | 顯示全部樓層
188610329 發表于 2022-12-29 13:34
了解一下什么叫現場保護,恢復現場,學會push,pop的用法。

謝謝,我看了一下,好像了解現場保護和恢復現場,但目前我對這堆棧空間的使用理解并不深,比較熟悉的就只是使用指針,但怎么釋放堆的內存我還沒懂,目前打算學一學基礎知識,然后做點小項目,一邊做一邊學,相互印證。
回復

使用道具 舉報

ID:384109 發表于 2022-12-29 14:42 | 顯示全部樓層
需要檢測按鍵的釋放,需要一個變量來保存按鍵按下時LED的狀態
回復

使用道具 舉報

ID:77589 發表于 2022-12-29 15:07 | 顯示全部樓層
中斷響應后,執行中斷響應程序后,需要清除中斷標志,如果沒有清除中斷標志位,單片機就會一直重復響應中斷,其它代碼就不會執行。
好久沒用51單片機了,不知道說的對不對,但可以試試。
回復

使用道具 舉報

ID:1059305 發表于 2022-12-29 16:42 | 顯示全部樓層
Longan.Wang 發表于 2022-12-29 15:07
中斷響應后,執行中斷響應程序后,需要清除中斷標志,如果沒有清除中斷標志位,單片機就會一直重復響應中斷 ...

我剛剛試了一下,在中斷結束后清除中斷標志位,但還是沒有恢復中斷前狀態,我覺得問題還是在2樓所說的,在中斷時改變了LED的狀態,然后沒有恢復之前的狀態。按照2樓所說的操作,我成功實現中斷后LED恢復原來的狀態。這是我添加的清除中斷標志位,不知道有沒有錯。
  1. void init0() interrupt 0
  2. {

  3.         if(K1==0)
  4.         {
  5.                 delay(10);
  6.                 if(K1==0)
  7.                 {
  8.       LED=0x00;
  9.                         delay(200);
  10.                         IE0=0;
  11.                
  12.                 }
  13.         }
  14.        
  15. }
復制代碼
回復

使用道具 舉報

ID:1059305 發表于 2022-12-29 16:44 | 顯示全部樓層
人中狼 發表于 2022-12-29 14:42
需要檢測按鍵的釋放,需要一個變量來保存按鍵按下時LED的狀態

是的,需要保存中斷前的狀態,然后再恢復狀態
回復

使用道具 舉報

ID:1059578 發表于 2022-12-29 17:37 | 顯示全部樓層
不要在中斷里延時
回復

使用道具 舉報

ID:624769 發表于 2022-12-30 20:52 | 顯示全部樓層
LLL2022 發表于 2022-12-29 14:20
謝謝,我看了一下,好像了解現場保護和恢復現場,但目前我對這堆棧空間的使用理解并不深,比較熟悉的就只 ...

以你的代碼為例, 你要在主函數中 不斷 改變 "LED"    而中斷中又要 “臨時的” 改變“LED”,而退出中斷后又希望恢復“LED”本來的內容。雖然不建議這種中斷中 Delay 的寫法,但是,先不說這個。 這其中的“LED” 就是你需要保護的現場。這個時候一般需要用到  入棧 和 出棧 比如:

void init0() interrupt 0
{
        _push_(LED);          //入棧
        if(K1==0)
        {
                delay(10);
                if(K1==0)
                {
                        LED=0x00;
                        delay(200);
                }
        }
        _pop_(LED);          //出棧      
}

當然,沙發的那個方法也可以,但是,如果有中斷嵌套,多個涉及到 相同的“現場”,就不如 出入棧來的穩妥了。


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线视频免费观看 | 国产一级淫片a直接免费看 免费a网站 | 天天操天天舔 | 蜜臀av日日欢夜夜爽一区 | 成人国产午夜在线观看 | 日本精品视频在线观看 | 久久婷婷色 | 国产欧美视频一区二区 | 亚洲欧美日韩久久久 | 91久久精品一区二区二区 | 超碰在线人人干 | av国产精品| 国产精品69毛片高清亚洲 | 蜜月va乱码一区二区三区 | 久久久999精品 | 成人av资源在线 | 四虎av电影| 欧美久久久久久久久中文字幕 | 午夜精品一区 | 欧美日韩一区在线 | 久久亚洲精品国产精品紫薇 | 岛国毛片| 中文字幕一区在线 | 日日草天天干 | 国产精品永久免费视频 | 日韩一区二区在线视频 | 欧美日韩国产中文字幕 | 国产精品亚洲片在线播放 | 日韩精品一区二区三区视频播放 | 国产伦精品一区二区三区四区视频 | 天天澡天天操 | 国产成人一区二区三区久久久 | 日韩一区av | 亚洲欧美一区二区三区在线 | 99福利视频| 丝袜毛片 | 国产高清在线精品一区二区三区 | 国产成人久久精品一区二区三区 | 欧美欧美欧美 | 久久精品无码一区二区三区 | 午夜精品一区二区三区在线观看 |