/* *******************************************
* File name: main.c
* Function: AVR外部中断测试程序
* Description: 通过外部中断控制输出端口电平
* Author & Date: Joshua Chan, 2012/03/23
* *******************************************/
#include
#include
#include
#include
#include
#include "eint_test.h"
/* 利用外部中断控制指定端口输出 */
void main(void)
{
int_init(3, 2); /* 使能中断3, 下降沿触发 */
_SEI(); /* 全局中断使能 */
while (1)
_WDR(); /* 喂狗 */
}
/* *******************************************
* 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 */ }
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』