⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 C
字号:
/*
实验六:
	外部中断实验。
	1、按键中断实验。INT4-INT7 4路中断触发方式,并以PB4-PB7电平
		翻转显示其状态。
	2、内部1 M晶振,程序采用全中断触发方式工作。
	3、进行此实验请插上LED短路块。
	4、此实验以简单的方式对中断的4种触发方式进行了实验,
		让大家对中断有个全面的认识。

	AVR  mega128学习板
	www.iccavr.com 阿发
	1:15 2007-10-11
*/

#include "iom128v.h"
#include <macros.h>

void int_init(void);

/*延时函数*/
void delay_ms(unsigned char i) {

	unsigned char a, b;
	for (a = 0; a < i; a++) {
		for (b = 1; b; b++);
		}
}

/*IO口初始化函数*/
void io_init(void) {

	DDRA = 0x00;										/*方向输入*/
	PORTA = 0xFF;										/*打开上拉*/
	DDRB = 0xFF;										/*方向输出*/
	PORTB = 0xFF;										/*输出高电平*/
	DDRC = 0x00;										/*不用的IO口建议设置为输入带上拉*/
	PORTC = 0xFF;
	DDRD = 0x00;
	PORTD = 0xFF;
	DDRE = 0x00;
	PORTE = 0xFF;
	DDRF = 0x00;
	PORTF = 0xFF;
	DDRG = 0x00;
	PORTG = 0xFF;
}

void main(void) {

	io_init();											/*IO口状态初始化*/
	int_init();											/*中断初始化*/

	while (1) {
		delay_ms(200);
		PORTB ^= (1 << 0);								/*PB0电平取反,闲着没事干,意思意思*/
		}
}

/*中断初始化函数*/
void int_init(void) {
	CLI();												/*关全局中断*/
	EIMSK = 0x00;										/*屏蔽所有外部中断*/
	EICRA = 0x00;										/*INT0-INT3设置为低电平触发*/
	EICRB = 0x00;										/*INT4-INT7设置为低电平触发*/
	EICRB |= (1 << ISC50);								/*INT5设置为任意电平变化触发*/
	EICRB |= (1 << ISC61);								/*INT6设置为下降沿触发*/
	EICRB |= (1 << ISC71) | (1 << ISC70);				/*INT6设置为下降沿触发*/
	EIFR = 0xFF;										/*清除中断标志,请见中文手册P84*/
	EIMSK = 0xF0;										/*INT4-INT7中断允许*/
	SEI();												/*全局中断允许*/
}

/*外部中断INT4,低电平触发*/
#pragma interrupt_handler Int4: 6
void Int4(void) {
	unsigned int i;

	i = 1000;											/*防按键颤动代码*/
	while (i --) {
		if ((PINE & (1 << PE4)) != 0) {					/*按键是否为低电平*/
			return ;
			}
		}

	PORTB ^= (1 << PB4);								/*PB1电平取反*/
	while ((PINE & (1 << PE4)) == 0);					/*等待按键松开*/
}

/*外部中断INT5,任意电平变化触发*/
#pragma interrupt_handler Int5: 7
void Int5(void) {
	PORTB ^= (1 << PB5);								/*PB1电平取反*/
}

/*外部中断INT4,下降沿触发*/
#pragma interrupt_handler Int6: 8
void Int6(void) {
	unsigned int i;

	i = 1000;											/*防按键颤动代码*/
	while (i --) {
		if ((PINE & (1 << PE6)) != 0) {					/*按键是否为低电平*/
			return ;
			}
		}

	PORTB ^= (1 << PB6);								/*PB1电平取反*/
}

/*外部中断INT4,上升沿触发*/
#pragma interrupt_handler Int7: 9
void Int7(void) {
	unsigned int i;

	i = 1000;											/*防按键颤动代码*/
	while (i --) {
		if ((PINE & (1 << PE7)) == 0) {					/*按键是否为高电平*/
			return ;
			}
		}

	PORTB ^= (1 << PB7);								/*PB1电平取反*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -