打印
[AVR单片机]

今天写程序发现一个令人头疼的问题,求解决

[复制链接]
1916|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
高个书呆子|  楼主 | 2012-3-23 09:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序是这样的,主要实现的功能是在三个数码管上显示数字,利用int0下降沿中断,
PD2按下一次,数字加一,本来给的计数值初值Count=0,只有响应中断后Count++,但是电源上电后数码管上却显示的0 0 1,求解释
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>

#define clear_key_on   (PIND&_BV(PD6))==0x00   //定义清零键按下
const uint8_t CODE8[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};

uint8_t Count=0;                 //计数值
uint8_t Dis_buffer[]={0,0,0};
void Show()          //显示函数
{
Dis_buffer[2]=Count/100;
Dis_buffer[1]=Count%100/10;
Dis_buffer[0]=Count%10;

if(Dis_buffer[2]==0)
{
  Dis_buffer[2]=10;
  if(Dis_buffer[1]==0)
  {
   Dis_buffer[1]=10;
  }
}
PORTA=CODE8[Dis_buffer[2]];
PORTB=CODE8[Dis_buffer[1]];
PORTC=CODE8[Dis_buffer[0]];
}
int main()
{
DDRA=0xFF;PORTA=0xFF;
DDRB=0xFF;PORTB=0xFF;
DDRC=0xFF;PORTC=0xFF;
DDRD=0x00;PORTD=0xFF;
MCUCR=0x02;
GICR=0x40;
SREG=0x80;
while(1)
{
  Show();
  if(clear_key_on)
  {
   Count=0;
  }
}
}


ISR(INT0_vect)     //中断函数
{
Count++;

}

相关帖子

沙发
dqyubsh| | 2012-3-23 10:38 | 只看该作者
看别人的程序是件痛苦的事儿,这次也不例外。
1,变量初始化写在main()函数里,不要相信编译器给变量赋初值,有可能会带来移植问题。
2,分别用不同数据验证show函数的正确性
3,上电初始化过程中禁止中断cli,初始化之后再开中断sei
4,考察中断本身,上电过程是否有中断进入的情况。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
高个书呆子 + 1
板凳
NE5532| | 2012-3-23 12:20 | 只看该作者
程序调试只有靠自己,侃单片机版面里看精华帖“程序调试黑宝书”

使用特权

评论回复
地板
晨星之光| | 2012-3-23 14:17 | 只看该作者
一步步找,找到原因就有解决的办法~:D

使用特权

评论回复
5
高个书呆子|  楼主 | 2012-3-26 15:08 | 只看该作者
谢谢2楼了

使用特权

评论回复
6
高个书呆子|  楼主 | 2012-3-26 15:30 | 只看该作者
我将count=0写道main()中之后就不会出现这个问题了,为什么呀!

使用特权

评论回复
7
hjl2832| | 2012-3-28 13:15 | 只看该作者
程序初始化的问题,AVR比较特殊,有端口寄存器,在初始化端口前,应该先设置PORTx,再设置DDRx,因为AVR器件初始化时,PORTx为0,如果先设DDRx,那么会先输出一个低电平,等你PORTx置高时,已经是下一个时钟周期了,才会输出高电平.

使用特权

评论回复
8
高个书呆子|  楼主 | 2012-4-3 18:56 | 只看该作者
非常感谢呀

使用特权

评论回复
9
高个书呆子|  楼主 | 2012-4-3 19:02 | 只看该作者
我按照7楼的改了,还是不行

使用特权

评论回复
10
alvin_zhou2009| | 2012-4-3 22:44 | 只看该作者
count最大只有255,在中断里还须加上一个条件,另外按键那里须加上延时。我想会不会是有些干扰?

使用特权

评论回复
11
joyme| | 2012-4-5 11:43 | 只看该作者
初始化中断前先关中断,设置好之后再开中断,再一次初始化Count=0; 怀疑是启动的时候中断被触发了一次。
还有用中断检测按键也要做防抖处理,否则可能按一下加好多数
有个疑问:按你得程序设计即使是Count是1,也不应该显示001(百位、十位的零不显示)。难道会是100吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

40

帖子

0

粉丝