pic 中断4

2019-04-15 14:31发布

/*MCC18编译器 熟悉中断和timer0功能,没有发生中断时第,板子上的额第一个数码管RA0亮,
当外部产生中断(RB0)按下时,数码管显示暂停,在按RB0数码管循环闪
器件:MPLAB软件8.2以上,MCC18编译器,mcd—II仿真器,工程板一块,芯片PIC18F4520
XT振荡器,看门狗定时关,低电压编程关*/
#include
 
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; //清中断标志位
     }    
          }
    }
}