/*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; //清中断标志位
}
}
}
}