#include <avr/io.h>
#include <avr/interrupt.h>
#include "user.h"
/*端口初始化*/
void Port_init(void)
{
PORTA = 0x00; //输出时,低电平
DDRA = 0xFF; //输出模式
PORTB = 0x00;
DDRB = 0xFF; //输出模式
PORTC = 0x00;
DDRC = 0xFF; //输出模式
PORTD = 0x00;
DDRD = 0xFF; //输出模式
}
/*器件的初始化*/
void init_devices(void)
{
cli(); //禁止所有中断 MCUCR的低4位为INT0(ISC01、ISC00)和INT1(ISC11、ISC10)中断触发类型控制位
/*** SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00 ***/
MCUCR = 0x00; /*** 0 0 0 0 0 0 0 0 ***/
/***MCUCSR寄存器用于提供导致MCU重置的重置源信息 ***/
MCUCSR = 0x80; //禁止JTAG
//通用中断控制寄存器— GICR: INT1 INT0 INT2 — — — IVSEL IVCE
GICR = 0x00; //
Port_init();
timer0_init();
sei(); //开全局中断
}
/*定时器T0初始化*/
void timer0_init(void)
{
TCCR0 = 0x00; //停止定时器
TCNT0 = 0x06; //初始值
OCR0 = 0xFF; //匹配值,未使用
TIMSK |= 0x01; //中断允许
TCCR0 = 0x03; //模式:普通; 匹配时:不与OC0相连接 ;8MHz的64分频 ;启动定时器
}
//T0溢出中断服务程序
//#pragma interrupt_handler timer0_ovf_isr:10
//void timer0_ovf_isr(void)
SIGNAL(TIMER0_OVF_vect) //到2000us
{
static uint flash_count;
TCNT0 = 0x06;
if(++flash_count>=250 ) //若定时到0.5s
{
flash_count=0;
PORTB ^= (1<<PB0); // PB0口取反闪烁
//PORTB^=BIT(0)|BIT(6)|BIT(5);//翻转PB0/PB6/PB5口,实现3个LED灯的0.5s间隔亮灭
}
}
//1ms延时,准确性较高
void delay1ms(unsigned int i)
{
while(i--)
{
unsigned int j;
for(j=1;j<=613;j++)
;
}
}
/* 测试T0 溢出中断 */
#include <avr/io.h>
#include "user.h"
int main(void)
{
init_devices( );
while(1)
{
NOP( );
}
}
|