新闻  |   论坛  |   博客  |   在线研讨会
AVR笔记3:按键扫描(用KEY选择对应LED点亮)(GCC)
mayer | 2009-09-01 19:40:12    阅读:2601   发布文章

AVR笔记3:按键扫描(用KEY选择对应LED点亮)(GCC)

 

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

一、程序结构
程序结构

下载 (10.27 KB)
2009-7-23 20:34


二、仿真效果
点击看大图
下载 (162.76 KB)
2009-7-23 20:34



三、程序源码
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.22
Updata   : 09.02.25  模块化
           09.04.30  增加proteus仿真模型,仿真通过。
     09.07.21  WinAVR-20071221环境下编译通过。
comments :
1、以学习板八个LED灯和八个按键为硬件电路,JP7短路块需装上
2、AVR单片机端口寄存器的使用及理解
3、端口电平检测程序的编写方法
4、操作KEY键控制对应的LED点亮
5、PORTB=~BIT(0)和PORTB&=~BIT(0);的区别,前者是对整个B口的操作,
   后者是只对B0的操作,不影响其他端口的状态
6、同时按下多个键时,LED不会依次循环点亮,详见仿真。原因为:尽管key_scan.c
   采用循环判断方式,但进行了状态处理。
7、key_scan.c第58行代码会出现:"warning: large integer implicitly truncated to unsigned type"
   警告,但经验证不影响程序运行。
*******************************************************************************/
#include <avr/io.h>
#include "port_init.h"
#include "key_scan.h"
int main(void)
{
  port_init();
  while(1)
  {
    key_scan();
  }
}

2、key_scan.c
#include <avr/io.h>
#include <util/delay.h>
/***键盘扫描程序***/
void key_scan(void)
{
   if((PINA&(1<<PA0))==0)
{
  PORTB=~_BV(0);
  _delay_ms(50);
  while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
}

if((PINA&(1<<PA1))==0)
{
  PORTB=~_BV(1);
  _delay_ms(50);
  while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
}

if((PINA&(1<<PA2))==0)
{
  PORTB=~_BV(2);
  _delay_ms(50);
  while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
}

if((PINA&(1<<PA3))==0)
{
  PORTB=~_BV(3);
  _delay_ms(50);
  while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
}

if((PINA&(1<<PA4))==0)
{
  PORTB=~_BV(4);
  _delay_ms(50);
  while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
}

if((PINA&(1<<PA5))==0)
{
  PORTB=~_BV(5);
  _delay_ms(50);
  while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
}

if((PINA&(1<<PA6))==0)
{
  PORTB=~_BV(6);
  _delay_ms(50);
  while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
}

if((PINA&(1<<PA7))==0)
{
  PORTB=~_BV(7);
  //PORTB=~_BV(PB7);
  //PORTB=~(1<<PB7);
  //PORTB=~(char)(1<<7);
  /*--------------------------------------------------------------------------------
    上面注释的三句均会产生:"warning: large integer implicitly truncated to unsigned type"
    警告,但经验证不影响程序运行
  --------------------------------------------------------------------------------*/
  _delay_ms(50);
  while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
}
}

3、port_init.c
#include <avr/io.h>
/***端口初始化函数***/
void port_init(void)
{  
  DDRA =0X00;
  PORTA=0XFF;
  DDRB =0XFF;
  PORTB=0XFF;
  DDRC =0X00;
  PORTC=0XFF;
  DDRD =0X00;
  PORTD=0XFF;
}

4、key_scan.h
void key_scan(void);

5、port_init.h
void port_init(void);

四、完整项目文件下载

http://bbs.armavr.com/thread-794-1-3.html

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

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