下面程序为AVR外部中断操作程序。
由测试程序,功能函数及头文件构成。
/* *******************************************
* File name: main.c
* Function: AVR外部中断测试程序
* Description: 通过外部中断控制输出端口电平
* Author & Date: Joshua Chan, 2012/03/23
* *******************************************/
#include <ioavr.h>
#include
#include
#include
#include
#include "eint_test.h"
/* 利用外部中断控制指定端口输出 */
void main(void)
{
int_init(3, 2); /* 使能中断3, 下降沿触发 */
_SEI(); /* 全局中断使能 */
while (1)
_WDR(); /* 喂狗 */
}</io
/* *******************************************
* File name: eint_test.h
* Function: AVR外部中断测试程序
* Description: 通过外部中断控制输出端口电平
* Author & Date: Joshua Chan, 2012/03/23
* *******************************************/
#ifndef _EINT_TEST_H
#define _EINT_TEST_H
#include
#define CPU_FOSC 16000000L
#define DELAY_S(t) __delay_cycles(CPU_FOSC * (t))
#define DELAY_MS(t) __delay_cycles(CPU_FOSC / 1000 * (t))
#define DELAY_US(t) __delay_cycles(CPU_FOSC / 1000000 * (t))
/* 使能外部中断并设置触发方式
* @intnum: 外部中断号, 取值范围 0~7
* @isc: 触发方式(0:低电平, 1:电平变换, 2:下降沿, 3:上升沿)
*/
extern void int_init(unsigned char intnum, unsigned char isc);
/* 控制PE, PF端口输出
* @num: 端口顺序号
* @stat: 控制端口输出电平
*/
extern void ctl_output(unsigned char num, unsigned char stat);
#endif
/* ******************************************* * File name: eint_test.c * Function: AVR外部中断测试程序 * Description: 通过外部中断控制输出端口电平 * Author & Date: Joshua Chan, 2012/03/23 * *******************************************/#include #include #include #include #include #include "delay.h"#include "eint_test.h"/* 使能外部中断并设置触发方式 * @intnum: 外部中断号, 取值范围 0~7 * @isc: 触发方式(0:低电平, 1:电平变换, 2:下降沿, 3:上升沿) */void int_init(unsigned char intnum, unsigned char isc){ if (intnum<=3 && isc<=3) { EIMSK |= (1 << intnum); EICRA &= ~(3 << (intnum*2)); EICRA |= (isc << (intnum*2)); } else if ((intnum>=4 && intnum<=7) && isc<=3) { EIMSK |= (1 << intnum); EICRB &= ~(3 << (intnum*2)); EICRB |= (isc << (intnum*2)); }}/* 控制PE, PF端口输出 * @num: 端口顺序号 * @stat: 控制端口输出电平 */void ctl_output(unsigned char num, unsigned char stat){ if ((num>=1 && num<=4) && (stat==1 || stat==0)) { DDRF |= (1 << (4-num)); if (stat) PORTF |= (1 << (4-num)); else PORTF &= ~(1 << (4-num)); } else if ((num>=5 && num<=6) && (stat==1 || stat==0)) { DDRE |= (1 << (num-3)); if (stat) PORTE |= (1 << (num-3)); else PORTE &= ~(1 << (num-3)); }}/* 定义中断处理函数 */#pragma vector = INT3_vect__interrupt void int3_isr(void){ ctl_dcmotor(6, 0); /* 启动直流电机6 */ DELAY_MS(100); ctl_dcmotor(6, 1); /* 停止直流电机6 */}
关键字:AVR 外部中断 测试程序 |