[AVR单片机] 今天写程序发现一个令人头疼的问题,求解决

[复制链接]
2651|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
 楼主| 高个书呆子 发表于 2012-3-26 15:08 | 显示全部楼层
谢谢2楼了
 楼主| 高个书呆子 发表于 2012-3-26 15:30 | 显示全部楼层
我将count=0写道main()中之后就不会出现这个问题了,为什么呀!
hjl2832 发表于 2012-3-28 13:15 | 显示全部楼层
程序初始化的问题,AVR比较特殊,有端口寄存器,在初始化端口前,应该先设置PORTx,再设置DDRx,因为AVR器件初始化时,PORTx为0,如果先设DDRx,那么会先输出一个低电平,等你PORTx置高时,已经是下一个时钟周期了,才会输出高电平.
 楼主| 高个书呆子 发表于 2012-4-3 18:56 | 显示全部楼层
非常感谢呀
 楼主| 高个书呆子 发表于 2012-4-3 19:02 | 显示全部楼层
我按照7楼的改了,还是不行
alvin_zhou2009 发表于 2012-4-3 22:44 | 显示全部楼层
count最大只有255,在中断里还须加上一个条件,另外按键那里须加上延时。我想会不会是有些干扰?
joyme 发表于 2012-4-5 11:43 | 显示全部楼层
初始化中断前先关中断,设置好之后再开中断,再一次初始化Count=0; 怀疑是启动的时候中断被触发了一次。
还有用中断检测按键也要做防抖处理,否则可能按一下加好多数
有个疑问:按你得程序设计即使是Count是1,也不应该显示001(百位、十位的零不显示)。难道会是100吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

40

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部