新闻  |   论坛  |   博客  |   在线研讨会
AVR笔记5:按键扫描(增加防抖功能)(GCC)
mayer | 2009-09-01 19:38:22    阅读:3609   发布文章

AVR笔记5:按键扫描(增加防抖功能)(GCC)

 

》》点此进入    http://bbs.armavr.com/   ARM-AVR嵌入式开发论坛

一、程序结构
程序结构

二、仿真效果
点击看大图

三、程序源码
1、main.c
/*******************************************************************************
Platform : AVR mega16学习板(www.iccavr.com)
Project  : 实验五:按键扫描(用KEY点亮对应LED)(增加防抖) (GCC)
Clock F  : 3.6864M
Software : WinAVR-20071221+Proteus7.4
Author   : 林夕依然
Version  : 08.11.30
Updata   : 09.02.26  模块化
           09.04.30  增加proteus仿真模型,仿真通过。
     09.07.21  WinAVR-20071221环境下编译通过。
comments :
1、以学习板八个LED灯和八个按键为硬件电路,JP7短路块需装上
2、AVR单片机端口寄存器的使用及理解
3、端口电平检测程序的编写方法
4、同【实验八】功能相同:操作KEY键控制对应的LED点亮
5、参考:http://www.iccavr.com/forum/dispbbs.asp?boardid=9&replyid=13569&id=147&skin=0&page=1&star=1
6、函数整合为function.c,按键扫描增加防抖功能
*******************************************************************************/
#include <avr/io.h>
#include "function.h"
int main(void)
  {
    port_init();
    while(1)
    {
     key_scan();  
    }
  }

2、function.c
/*******************************
Platform : AVR mega16学习板(www.iccavr.com)
function :功能函数集
Clock F  : 3.6864M
Software : WinAVR-20071221+Proteus7.4
Author   : 林夕依然
Version  : 09.07.21
comments :
1、两种方式实现延时
2、端口初始化函数
3、键盘扫描函数,增加防抖处理
********************************/
/*---------------------------------------------------------------------------------
     延时程序计算方法
     计数个数j = 延时时间/6*晶振频率 - 1
---------------------------------------------------------------------------------*/
#include <avr/io.h>
#define uchar unsigned char
#define uint unsigned int
//延时函数:方式一
void Delay(void)                        
    {
    uchar a, b, c;
    for (a = 1; a; a++)
        for (b = 1; b; b++)
            for (c = 0; c<10; c++)  //循环次数=255*255*10
          ;
    }
//延时函数:方式二,1ms延时,准确性较Delay();高
void DelayMs(uint i)               
   {
    while(i--)
    {                          
     uint j;               
        for(j=1;j<=613;j++)   
      ;               
    }                       
   }
   
//端口初始化
void port_init(void) //BCD口使能上拉
  {
   PORTB = 0XFF;
   PORTC = 0XFF;
   PORTD = 0XFF;
   DDRB = 0X00;
   DDRC = 0X00;
   DDRD = 0X00;
  }
//键盘扫描函数
void key_scan(void)
  {
   uchar key;
   DDRB = 0XFF;
   DDRA = 0X00;
   PORTA = 0XFF;
   
   if(PINA != 0XFF)         //检测A口电平,如果全是高电平则退出
    {
     DelayMs(20);           //防抖
     if(PINA != 0XFF )      //再次检测A口电平,如果不全是高电平则继续执行程序
      {
       key = PINA;          //读取PINA,将其存放在key中
       PORTB = key;         //将PINA读出的值赋给B端口,对应LED点亮
       while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
                         //状态,不会有对应LED点亮发生
      }
    }
}

3、function.h
#define uint unsigned int
void Delay(void);
void DelayMs(uint i);
void port_init(void);
void key_scan(void);

四、完整项目文件下载

http://bbs.armavr.com/thread-798-1-2.html

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客