avr 单片机 atmega16 编写程序 用中断来控制 按下一个按钮 一个数码管加1
#include<mega16.h>intshu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};inttim...
#include <mega16.h>
int shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int time=0;
interrupt [EXT_INT0] void ext_int0_isr(void)
{ time++;
}
void main(void)
{ DDRB=0XFF;
GICR|=0x40;
MCUCR=0x02;
MCUCSR=0x00;
GIFR=0x40;
#asm("sei")
while (1)
{
PORTB=shu[time];
};
}
这程序 无法计数 不知道怎么搞的 求大侠指点 展开
int shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int time=0;
interrupt [EXT_INT0] void ext_int0_isr(void)
{ time++;
}
void main(void)
{ DDRB=0XFF;
GICR|=0x40;
MCUCR=0x02;
MCUCSR=0x00;
GIFR=0x40;
#asm("sei")
while (1)
{
PORTB=shu[time];
};
}
这程序 无法计数 不知道怎么搞的 求大侠指点 展开
5个回答
展开全部
你用的是icc还是gcc软件编的程序,icc中断这样写#pragma interrupt ****:数字
******代表子程序名 这是声明中断子程序,下边还要在按一般子程序写法写子程序功能如void *****(){} 数字是中断号,每种中断号的数字不一样(如外部中断和定时中断),要看你是用的单片机手册,中断向量一节
******代表子程序名 这是声明中断子程序,下边还要在按一般子程序写法写子程序功能如void *****(){} 数字是中断号,每种中断号的数字不一样(如外部中断和定时中断),要看你是用的单片机手册,中断向量一节
追问
我用的是 CodeVisionAVR C Compiler 编写的
追答
没用过 按这个写试试,不同的软件写c程序都会有点差别
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
要么看门狗开了,不断复位,要么是中断没设置好(下降沿中断)
更多追问追答
追问
我是用的 下降沿中断的 是向导来做的
追答
我仔细看了一下,初始化是对的,我没用过AVR,但我知道很多单片机的C编译对这个程序是不能正常工作的,原因是你定义的数据类型是16位的,而很多编译器是用高位存储低位数据,用低位存储高位数据,如你的整型time申请了两个空间分别为a和a+1,当time=1时,低位地址a为0,高位地址a+1为1。当你申请数组int shu[]时,长度没指定,但已经初始化为10,所以编译器会编译为最小的类型char ,那么把shu[time]就会把time的低位地址放到偏移量,即变成shu[0].
楼主请把你的现象说一下,以便容易分析,比如说上电是什么现象,按了按键是什么现象,如果按了按键无响应,请继续按,超过255次,看有没有变化,或者把数据类型改为unsigned char 再试,如果还不行,那么请检查你的电路
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
全局中断没有设置:在GIFR=0X40;后面写:SREG|=0X80;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-11-25
展开全部
中断的寄存器设置有问题,仔细看看资料
追问
我是用向导来写的中断 因该不会错吧,那你觉得怎么写 求大虾指点
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
中断函数不是这么写的
追问
我用的向导写的中断 因该不会错吧
追答
你用的什么编译的?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询