中科因仑“3+1”工程特种兵精英论坛
标题:
AVR外部中断怎么消抖?求大神支招!!!
[打印本页]
作者:
jerryzhai
时间:
2014-7-24 13:34
标题:
AVR外部中断怎么消抖?求大神支招!!!
/*******************************************************
* 程序功能:外部中断触发
* 接线说明:核心板JP2 PA0-PA7连接到系统底板静态数码管显示电路JP71,PD2,PD3接到JP74上的DK0,DK1
* 实验现象:按下DK0数码管加1,按下DK1数码管减1
* 日 期 : 2014/7/24
* 作 者 : 翟志刚
*******************************************************/
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
uchar led_7[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//数码管从0显示到F
uchar counter = 0,FLAG = 0,FLAG1 = 0;
void delay_1ms(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<100;j++)
;
}
}
// INT0中断服务程序
#pragma interrupt_handler int0:2
void int0(void)
{
delay_1ms(30); FLAG = 1;
}
// INT1中断服务程序
#pragma interrupt_handler int1:3
void int1(void)
{
DDRD = 0x00;delay_1ms(30);FLAG1 = 1;
}
void main(void)
{
PORTA=0xFF; //初始化
DDRA=0xFF;
SREG=0x80; // 全局中断允许
GICR|=0xC0; // 允许INT0、INT1中断
MCUCR=0x0A; // INT0、INT1下降沿触发
GIFR=0xC0; // 清除INT0、INT1中断标志位
counter = 0; // 计数单元初始化为0
while (1)
{
if(FLAG == 1)
{
FLAG = 0;
counter++;
if(counter >= 16)counter = 0;
}
if(FLAG1 == 1)
{
//delay_1ms(2);
FLAG1 = 0;
counter--;
if(counter <= 0)counter = 15;
}
PORTA = led_7[counter]; // 显示计数单元
}
}
作者:
liliuyang
时间:
2014-7-25 10:24
不能理解。求高手
作者:
SDC158477392
时间:
2014-7-27 09:29
叫你要少用DELAY()函数,知道不,没事多用用中断,中断多好啊,定时准确,这样就不会有那啥啥影子存在,你的问题中断消抖,我不懂耶,谁叫我是水货呢,哈哈哈
作者:
伊海
时间:
2014-7-27 18:57
本帖最后由 伊海 于 2014-7-27 18:58 编辑
很好,好好想下,加油
作者:
墨奚
时间:
2014-7-28 08:50
搞其他的功能吧,那个其实已经弄的差不多了
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/)
Powered by Discuz! X3.4