標題: 利用單片機中斷方式控制按鍵次數(shù)不同時亮燈不同,但按鍵后燈都不亮。哪里錯了? [打印本頁]

作者: 一人心0511    時間: 2018-5-6 16:02
標題: 利用單片機中斷方式控制按鍵次數(shù)不同時亮燈不同,但按鍵后燈都不亮。哪里錯了?
#include "reg51.h"

sbit led1=P2^4;
sbit led2=P2^5;
sbit led3=P2^6;
sbit led4=P2^7;
sbit k1=P2^0;
sbit k2=P2^1;
sbit k4=P3^3;

unsigned char presskeynum=0;

void delay(unsigned int i)   
{
    unsigned int j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}


void key()
{
                 if(presskeynum==1)
        {

                if(k1==0)
                        {
                        delay(30);
                        led1=0;
                                
                        }
                        if(k2==0)
                                {
                                        delay(30);
                                        led2=0;
        }
               
  }               
                if(presskeynum==2)
        {

                if(k1==0)
                        {
                        delay(10);
                        led3=0;
                        }
                        if(k2==0)
                                {
                                        delay(10);
                                        led4=0;
        }
               
        }
        
}

void Int0INit()
{
IT0=1;
EX0=1;
EA=1;
}


        
void main()
{
        
        led1=1;
  led2=1;
        led3=1;
  led4=1;
        Int0INit();



         while(1);
}


void Int0() interrupt 0
{


delay(10);
        if(k4==0)
        {
               
         presskeynum++;
                if(presskeynum==3)
                        presskeynum=0;
                else key();

        }



        

}

作者: 一人心0511    時間: 2018-5-6 17:37
剛發(fā)現(xiàn)k4的引腳寫錯了,應該是P3^2,并不是這的錯
作者: HC6800-ES-V2.0    時間: 2018-5-7 09:19
程序的邏輯有大問題,還有小問題。。。。
第一:邏輯大問題是:中斷服務函數(shù)void Int0() interrupt 0中的那個條件語句
if(presskeynum==3)
       presskeynum=0;
else key();
我們來看看邏輯:你的想法——按下k4,產(chǎn)生中斷,然后去掃描獨立按鍵,產(chǎn)生不同現(xiàn)象!敕▽Γ绦蜻壿嬪e了。。。!
你想啊,按下k4產(chǎn)生中斷后,到掃描獨立按鍵,程序要多少時間?你的操作要用多少時間?——你的程序是連續(xù)執(zhí)行的。
所以,沒有任何反應,很正!獣r間上搞不及嘛!遣皇谴蟠蟮倪壿媶栴}?!

所以,我修改為這樣:中斷服務函數(shù)中的 else key();語句刪除,將 key()放在主循環(huán)中
while(1)//注意,你程序中這里有分號,一定一定要刪除
{
    key();
}

我在我的板子上,已經(jīng)調(diào)試成功!

第二:小問題——你的外部中斷服務函數(shù)中,沒有清除中斷標志——只能按一次k4產(chǎn)生一次中斷,以后就不會再有新的外部中斷產(chǎn)生了——外部中斷服務函數(shù)最后一條語句,一定要加上清除中斷標志語句IE0=0;

好了,程序功能實現(xiàn)了。
你再好好想想嘛!
作者: 一人心0511    時間: 2018-5-7 09:57
HC6800-ES-V2.0 發(fā)表于 2018-5-7 09:19
程序的邏輯有大問題,還有小問題。。。!
第一:邏輯大問題是:中斷服務函數(shù)void Int0() interrupt 0中 ...

非常感謝,主要是剛學這,不太懂




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1