pic 中斷4

來源:互聯網
上載者:User

/*MCC18編譯器 熟悉中斷和timer0功能,沒有發生中斷時第,板子上的額第一個數位管RA0亮,
當外部產生中斷(RB0)按下時,數位管顯示暫停,在按RB0數位管迴圈閃
器件:MPLAB軟體8.2以上,MCC18編譯器,mcd—II模擬器,工程板一塊,晶片PIC18F4520
XT振蕩器,看門狗定時關,低電壓編程關*/
#include<p18cxxx.h>
 
const char table[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};   //0-9共陽極設定

void  PIC18F_High_isr(void);  //中斷服務程式
void  PIC18F_Low_isr(void);
void  Inio();         //連接埠初始化程式

void Inio()           //連接埠初始化程式
{
     TRISA = 0Xfe;            //RA0允許為亮
     TRISD = 0X00;            //D連接埠全部設為輸出
     ADCON1 = 0X07;           //設定A口為普通I/O口(模數轉換寄存器)查表吧
     TRISB = 0x01;            //RB0為輸入
  PORTB = 0x01;            //b連接埠初始為高電平,B口低電平有效(按下)
  INTCON2bits.RBPU = 0;     //B口上拉電位
     PORTA = 0X00;
     PORTD = 0XFe;            //開啟第1數位管   低電平有效
}

 //**********************************************
#pragma code high_vector_section = 0x8//#pragma code指定後面的程式在rom的起始地址為0X8,至於0x17
void high_vector()
{
     _asm goto PIC18F_High_isr _endasm  //通過此指令逃到中斷服務程式
}
//**************************************************
#pragma code Low_vector_section = 0x18
void low_vector()
{
     _asm goto PIC18F_Low_isr _endasm   //通過此指令逃到中斷服務程式
}
//****************************************************************
#pragma code  //返回預設的程式碼片段

#pragma interrupt PIC18F_High_isr   //#pragma interrupt 關鍵字 跳轉到高中斷服務程式,下面一定是次程式
void PIC18F_High_isr()   //進階中斷服務程式 記得要清中斷標誌位
{
    int i = 0; i++;    //第一次按下時,執行此語句
   if (PORTBbits.RB0 == 0)   //當再次按下RB0時,清除中斷,回主程式
   {
     INTCONbits.INT0IF = 0;
   }    

#pragma interruptlow PIC18F_High_isr    //跳轉到低中斷服務程式 記得要清楚中斷標誌位
void PIC18F_Low_isr()
{
    // Buzze();         //蜂鳴器響函數
    // INT2IF = 0;      //INTCON3寄存器
}

void main()
{
    char  num;
    Inio();  //連接埠初始化程式
    INTCONbits.GIE = 0;  //關閉全域中斷 INTCON1
 //timer0延時中斷
 T0CON  = 0x45;        //禁止timer0使能,t0為8位定時/延時器 分配預分頻器1:64
 TMR0L =  22;        //3000us延時初始值
     //當延時到時就產生中斷
    INTCONbits.TMR0IF  = 0; //清中斷標誌位,未發聲中斷
    INTCON2bits.TMR0IP  = 1; //高優先順序使能 INTCON2 低等於0
    INTCONbits.TMR0IE  = 1; //允許timer0中斷溢出  
  
    RCONbits.IPEN = 1;    // 使能中斷優先順序 RCON
    INTCON2bits.INTEDG0 = 0; //INTCON2 使能外部中斷觸發邊緣中斷
    INTCON2bits.RBIP = 1;   //B口按鍵為高優先順序
   
    INTCONbits.INT0IF  = 0; //清外部中斷標誌優先位 INTCON3
    INTCONbits.INT0IE  = 1; //使能int0外部中斷使能位
    INTCONbits.GIE     = 1; //開啟全域中斷
 
 T0CONbits.TMR0ON = 1;   //啟動t0定時器
 
    //主程式
    /*總結:中斷模組中,記得三個寄存器:標誌,使能,優先順序,在程式中,先把他們關閉,然後才開啟*/
    while (1)  //迴圈顯示0-9
    {
          for (num=0; num<10; num++)
          {
              PORTD = table[num];
              T0CONbits.TMR0ON = 1;   //啟動t0定時器
              if (INTCONbits.TMR0IF  = 1)  //延時到3000us
              {
          INTCONbits.TMR0IF  = 0; //清中斷標誌位
     }    
          }
    }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.