找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5138|回復(fù): 9
收起左側(cè)

請教一個問題:51單片機(jī)用外部中斷通過矩陣按鍵控制led的亮滅

[復(fù)制鏈接]
ID:789846 發(fā)表于 2020-6-25 23:03 | 顯示全部樓層 |閱讀模式
請教一個問題:51單片機(jī)用外部中斷通過矩陣按鍵控制led的亮滅。想要達(dá)到目的:每一次按鍵被觸發(fā),LED的狀態(tài)翻轉(zhuǎn)一次。
單片機(jī)電路圖如下:

我自己寫的程序如下:下載后單片機(jī)的效果是按下按鍵led小燈點亮,一直保持著點亮的狀態(tài)。請問怎樣修改或者怎樣優(yōu)化程序?讓它變成每按一次,led的狀態(tài)翻轉(zhuǎn)一次。

#include <reg52.h>
sbit LED = P0^0;
sbit wai = P3^2;
sbit key = P2^7;


void main(void)
{
        int i;
        P2 = 0XF7;        //矩陣按鍵變?yōu)楠毩存I
        P0 = 0x00;        //熄滅led
        IT0 = 1;                //下降沿觸發(fā)
        EX0 = 1;                //開啟INT0中斷
        EA = 1;                        //開啟總中斷        
        if(key == 0)
        {
                for(i=0;i<1000;i++);      //按鍵消抖
                if(key==0)
                {
               
                        wai = 0;                //令P3^2引腳電平為0,下降沿出發(fā)外部中斷
                        while(1);
                          
                }
          }
         
}


void int0_process() interrupt 0
{        
        unsigned int i;
        if(key == 0)
        {
        for(i=0;i<1000;i++);
        LED = ~LED;                        
        }
        key = 0;
}



%DMS%3`NF_JA[FLQ0JV(`OV.png
C5$EXTE~AEARDAK]4BN50PP.png
BYN31J)G6$0KQ][RD(0V}4B.png
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2020-6-26 07:49 | 顯示全部樓層
中斷函數(shù)內(nèi)多余代碼去掉,保留LED取反試看,按鍵代碼無限循環(huán)去掉。
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2020-6-26 07:55 | 顯示全部樓層
按鍵代碼要包含在無限循環(huán)中,不是無限循環(huán)被按鍵代碼包含。
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2020-6-26 09:12 | 顯示全部樓層
  1. #include <reg52.h>
  2. sbit LED = P0^0;
  3. sbit wai = P3^2;
  4. sbit key = P1^7;
  5. void main()
  6. {
  7.         int i;
  8.         P1 = 0XF7;        //矩陣按鍵變?yōu)楠毩存I
  9.         P0 = 0x00;        //熄滅led
  10.         IT0 = 1;                //下降沿觸發(fā)
  11.         EX0 = 1;                //開啟INT0中斷
  12.         EA = 1;                        //開啟總中斷  

  13.         while(1)
  14.         {
  15.         if(key == 0)
  16.         {
  17.                 for(i=0;i<1000;i++);      //按鍵消抖
  18.                 if(key==0)wai = 0;                //令P3^2引腳電平為0,下降沿出發(fā)外部中斷
  19.                                 }
  20.         wai = 1;
  21.         }
  22. }
  23. void int0_process() interrupt 0
  24. {        
  25.         unsigned int i;
  26.         for(i=0;i<1000;i++);
  27.         LED = ~LED;                        
  28. }
復(fù)制代碼
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2020-6-26 09:16 | 顯示全部樓層
代碼按我的電路修改了,僅供參考。
回復(fù)

使用道具 舉報

ID:789846 發(fā)表于 2020-6-26 12:25 | 顯示全部樓層
xianfajushi 發(fā)表于 2020-6-26 09:16
代碼按我的電路修改了,僅供參考。

可以了,現(xiàn)在明白了,謝謝你
回復(fù)

使用道具 舉報

ID:789846 發(fā)表于 2020-6-26 12:34 | 顯示全部樓層

感謝你了,我一直困在循環(huán)這里搞不明白,自己摸索了兩天都搞不明白,現(xiàn)在懂了,看了代碼后恍然大悟
回復(fù)

使用道具 舉報

ID:789846 發(fā)表于 2020-6-26 12:36 | 顯示全部樓層
void int0_process() interrupt 0
{        
        unsigned int i;
        for(i=0;i<1000;i++);
        LED = ~LED;
                     
}
回復(fù)

使用道具 舉報

ID:1064915 發(fā)表于 2023-3-9 17:30 | 顯示全部樓層
for(i=0;i<1000;i++);
延時時間怎么計算?
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2023-3-9 21:10 | 顯示全部樓層
15818463972 發(fā)表于 2020-6-26 12:34
感謝你了,我一直困在循環(huán)這里搞不明白,自己摸索了兩天都搞不明白,現(xiàn)在懂了,看了代碼后恍然大悟

不過不管如何都不建議在中斷里面使用循環(huán),為了說明問題,勉強(qiáng)修改,中斷里面可以使用變量累加判斷。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表