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

2009-8-31 15:10 3532 5 5 分类: MCU/ 嵌入式

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


一、程序结构
attachimg.gif 程序结构


下载 (10.27 KB)

2009-7-23 20:34


二、仿真效果
attachimg.gif 点击看大图
下载 (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

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条