/*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; //清中斷標誌位
}
}
}
}