int0.c

来自「简单的ATmega16中断编程」· C语言 代码 · 共 61 行

C
61
字号
#include <iom16v.h>
#include <macros.h>

#define uchar unsigned char
#define uint unsigned int
#define F_cpu 3686400

uchar IntCnt;//全局变量	

void USART_Init(long int baud)
{
 uint temp;
 temp=F_cpu/baud/16-1;
 UBRRH=(uchar)(temp>>8); //写波特率寄存器
 UBRRL=(uchar)temp;//uchar为8位,它会截取16位temp数据中的低8位
 
 UCSRB=(1<<RXEN)|(1<<TXEN); //接收发送使能
 UCSRC=(1<<URSEL)|(0<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);  //异步,1个停止位,8个数据位
}
void USART_Transmit(char data)
{
 while(!(UCSRA&(1<<UDRE)));  //等待数据发送完
 UDR=data;
}

#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
 IntCnt++;
 USART_Transmit((IntCnt%10)+'0');
}

void main(void) 
{
 char i;
 /*DDRA=0x0f;
 PORTA=0xf0;//这种定义无法实现中断*/
 DDRB=0xf0;
 PORTB=0x0f;//往相应管脚写1,
 //测试该管脚时都为高电平,不管其方向寄存器定义为输出还是输入,
 DDRD=0x00;//中断输入管脚要定义为输入
 PORTD=0x00;
 USART_Init(9600); //波特率9600 初始化串口
 
 CLI(); 
 GICR=0x40;//开中断0
 MCUCR=0x02;//中断0,下降沿触发 
 GIFR=0xC0;
 IntCnt=0;	
 SEI();
 while(1)
 {
 //USART_Transmit((IntCnt%10)+'0');
 /*DDRA=0xf0;
 PORTA=0x0f;
 asm("nop");//iccavr 里要双引号,而winavr里则单引号
 i=PINA;
  //PORTA=Table[IntCnt%10]; 
 USART_Transmit(i);*/
 }
 }

⌨️ 快捷键说明

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