简单实现了Timer0和Timer1的定时器中断,让LED一秒钟闪一下。
- #include & lt; xc.h & gt;
- #include “timer.h”
- /*
- * void timer0_init()
- * {
- * T0CS = 0; // inside clock
- * T0SE = 1; // down edge count
- * PSA = 0; // Prescaler is assigned to the Timer0 module
- * PS2 = 0; // 1:16
- * PS1 = 1;
- * PS0 = 1;
- * //TMR0IF = 0;
- * INTCONbits.TMR0IF = 0;
- * GIE = 1; // enable global interrupt
- * INTCONbits.TMR0IE = 0; // timer0 interrupt enable
- * TMR0 = 8; // initialized value
- * }
- *
- * void interrupt Timer0()// 1ms
- * {
- * TMR0 = 9; // initialize value = 256-16×10^6/(4X16X1000)+2
- * if(INTCONbits.TMR0IF)
- * {
- * INTCONbits.TMR0IF = 0; // clear flag
- * //PORTBbits.RB5 = ~PORTBbits.RB5;
- * ms_count++;
- * }
- * }
- */
- void timer1_init()
- {
- T1CONbits.TMR1CS = 0; /* Internal clock (FOSC/4) */
- T1CONbits.T1CKPS1 = 1; /* 1:4 prescale value */
- T1CONbits.T1CKPS0 = 0;
- TMR1L = 0xd8; /* initialized value */
- TMR1H = 0xf0;
- PIR1bits.TMR1IF = 0; /* clear TMR1 register voerflowed */
- GIE = 1;
- PEIE = 1; /* enable outside interrupt */
- T1CONbits.TMR1ON = 1; /* enable timer1 */
- TMR1IE = 1; /* enable timer1 interrupt */
- }
- void interrupt Timer1() /* 10ms Timer1, the name whatever you like */
- {
- TMR1L = 0xf0;
- TMR1H = 0xd8;
- if ( PIR1bits.TMR1IF )
- {
- PIR1bits.TMR1IF = 0; /* clear flag */
- /* PORTBbits.RB5 = ~PORTBbits.RB5; */
- ms_count++;
- }
- }
timer0和timer1的初始化还是有点儿区别的。
有两个问题,Timer1需要开外部中断,PEIE = 1; 不然不会进入中断函数,而timer0就不需要;
中断名称好像可以随便取的样子,我用Timer1和ISR都能成功运行中断。
说点儿题外话,PIC的头文件很好用,但是有个很大的问题是不知道怎么用,没有一个说明文件,每次调用的时候我都是先查寄存器,然后到头文件里找寄存器对应的定义,相比STC就差远了,有专门的库函数说明文档,想怎么用该怎么用一目了然。没有说明,使用库文件还不如直接用寄存器定义,但是为了与之前的习惯统一,暂时先这么着了,希望是有说明文件只是我还没发现而已。