首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

编程点滴:AVR外部中断测试程序

编程点滴:AVR外部中断测试程序

下面程序为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  外部中断  测试程序
返回列表