51/52單片機:利用外部中斷實現4位(多位)數碼管動態掃描+1/-1--------計數器

前言
首先此源碼設計知識點少,更容易供路人/初學者參考;
介紹
此源碼實現了利用外部中斷實現多位數碼管加1和**減1**效果(無論是幾位數碼管都可用)
要點講解

1.設置外部中斷初始化.(我放在了一個函數裏用來調用)

void intinit()
{
	IT0 = 1;	//設置外部中斷0的觸發方式爲跳沿觸發。
	EX0 = 1;	//開啓外部中斷0
	IT1 = 1;	//設置外部中斷1的觸發方式爲跳沿觸發。
	EX1 = 1;	//開啓外部中斷1
	EA = 1;		//中斷總開關
}

2.設置按鈕函數

void button(){		
    if(K0==0)		 //按鈕--加
    {
      	delay1ms(10);
      	if(K0==0)
   		{
       	  num++;
          if(num==5000)
          num=0;
          while(!K0);
        }
     }
	 if(K1==0)
	 {				 //按鈕--減
      	delay1ms(10);
      	if(K1==0)
   		{
       	  num--;
          if(num==0)
          num=5000;
          while(!K1);
        }
	 }
}

3.這是全文了比較有意思的一步,也是初學者想不到的地方(重點看)

void wei()			//抓取各位數
{
	qian=num/1000%10;
	bai=num/100%10;
       shi=num/10%10;
       ge=num%10;	
}

***最後是完整源碼,仔細看哦(不要完全照搬)
注意引腳號和共陰共陽;

#include<reg52.h>
unsigned char code segcc[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                            0x7f,0x6f};//共陰段選
unsigned char vcc[]={0x7f,0xbf,0xdf,0xef};//位選
sbit K0=P3^2;
sbit K1=P3^3;
unsigned int i,j,k;
int num;
int ge,shi,bai,qian;
void delay1ms(int k)
{
	for(i=0;i<k;i++)
	{
		for(j=0;j<100;j++)
		{}
	}
}               //延時
void intinit()
{
	IT0 = 1;	//設置外部中斷的觸發方式爲下降沿觸發。
	EX0 = 1;	//開啓外部中斷0
	EA = 1;		//中斷總開關
	IT1 = 1;	
	EX1 = 1;	
	EA = 1;
}

void button(){		
    if(K0==0)		 //按鈕--加
    {
      	delay1ms(10);
      	if(K0==0)
   		{
       	  num++;
          if(num==5000)
          num=0;
          while(!K0);
        }
     }
	 if(K1==0)
	 {				 //按鈕--減
      	delay1ms(10);
      	if(K1==0)
   		{
       	  num--;
          if(num==0)
          num=5000;
          while(!K1);
        }
	 }
}
void wei()			//抓取各位數
{
	qian=num/1000%10;
	bai=num/100%10;
       shi=num/10%10;
       ge=num%10;	
}

main()
{
	intinit();
 	while(1);

}
void int0() 	interrupt 0
{	   
	EX0=0;
               
	while(1)
   {
	button();
	wei();

    P3=0xef;
    P2=segcc[qian];        
    delay1ms(1);
               
    P3=0xdf;
    P2=segcc[bai];        
    delay1ms(1); 

    P3=0xbf;
    P2=segcc[shi];        
    delay1ms(1);
               
    P3=0x7f;
    P2=segcc[ge];        
    delay1ms(1);
	EX0=1;	
	}	
}

void int1() 	interrupt 2
{	   
	EX1=0;
               
	while(1)
   {
	button();
   	wei();

    P3=0xef;
    P2=segcc[qian];        
    delay1ms(1);
               
    P3=0xdf;
    P2=segcc[bai];        
    delay1ms(1); 

    P3=0xbf;
    P2=segcc[shi];        
    delay1ms(1);
               
    P3=0x7f;
    P2=segcc[ge];        
    delay1ms(1);
	EX1=1;	
	}	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章