打印

单片机新手,入门前的感悟第十篇。

[复制链接]
1803|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
suoma|  楼主 | 2010-1-2 23:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机新手,入门前的感悟第十篇。

终于看完中断了,理论知识还是比较好掌握的,感觉就是四个寄存器的设定。课本这章主要介绍了外部中断,先看这个用按键控制的一位LED数码管显示系统的程序
#include <mega16.h>
flash unsigned char led_7[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char counter;

interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (++counter>=16) counter=0;

}


interrupt [EXT_INT1] void ext_int1_isr(void)
{
if (counter) --counter;
else counter=15;
}


void main(void)
{
PORTA=0xff;
DDRA=0xff;
GICR|=0xc0;      //使能INT0,INT1中断
MCUCR=0x0a;     //INT0,INT1下降沿触发
GIFR=0xc0;       //清除INT0,INT1中断标志位
counter=0;      //计数单元初始化为0
#asm("sei")        //使能全局中断

while (1)
    {
    PORTA=led_7[counter];
    };
}
但是接到单片机上一试,发现反映太灵敏,按一下,数变好多次,读完第九章键盘输入接口与状态机设计,知道这是因为按键的时候有抖动,有硬件和软件两种方式,由于我现在主要学软件,给大家介绍一下软件消抖的方案
#include <mega16.h>
#define key_input PIND.7
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2

unsigned char read_key(void)
{
static unsigned char key_state=0;
unsigned char key_press,key_return=0;
key_press=key_input;
switch(key_state)
{
  case key_state_0:
  if(!key_press) key_state=key_state_1;
  break;
  case key_state_1:
    if(!key_press)
    {
      key_return=1;
      key_state=key_state_2;
    }
    else
      key_state=key_state_0;
      break;
  case key_state_2:
    if (key_press) key_state=key_state_0;
    break;
  }
  return key_return;
  }
因为抖动的时间为10到20ms所以是这个函数每10ms执行一次即可。
PIND.7那行表示按键的输入口为PD7
沙发
司徒老鹰| | 2010-1-3 21:00 | 只看该作者
建议楼主打个包,呵呵

使用特权

评论回复
板凳
Karlshen| | 2010-1-3 22:58 | 只看该作者
呵呵,看看哈,没事试一下,我也刚开始学

使用特权

评论回复
地板
suoma|  楼主 | 2010-1-10 23:10 | 只看该作者
打包看着麻烦

使用特权

评论回复
5
thf2008| | 2010-1-11 12:30 | 只看该作者
楼主发的时候字号可以调大一些

使用特权

评论回复
6
Karlshen| | 2010-1-11 22:13 | 只看该作者
四个寄存器的设定我掌握得不太好

使用特权

评论回复
7
huamunv| | 2010-1-12 21:34 | 只看该作者
想试着自己跑跑程序。实践一下,就是现在缺少设备

使用特权

评论回复
8
laslison| | 2010-1-13 23:14 | 只看该作者
软件消抖的方案收下了

使用特权

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

本版积分规则

82

主题

714

帖子

5

粉丝