专栏中心

EEPW首页 > 专栏 > AVR笔记3:按键扫描(用KEY选择对应LED点亮)(GCC)

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

发布人:mayer 时间:2009-09-01 来源:工程师 发布文章
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

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

利用高精度窗口监控器有效提高电源输出性能

磁滞

元件/连接器 2025-03-24

国内厂商,去搞AI ISP芯片了

开放的汽车电子控制系统研究

联发科Android晶片 本季出货 带动成长

视频 2010-08-17

高通 CEO 安蒙谈 DeepSeek:AI 发展处于令人兴奋的转折点

下一代3D晶体管,迈出重要一步

EDA/PCB 2025-03-24

不止听音乐:苹果 AirPods健康监测专利获批,AI监测步态、心肺等

vivo进军机器人赛道?官方回应将在博鳌论坛上透露更多

力科助力汽车电子总线开发

视频 2010-09-08

联发科技宣传片

视频 2010-09-07

电磁感应

Vicor 电源模块 VI 的基本功能介绍

视频 2010-09-02

HBM新技术,横空出世

网络与存储 2025-03-24

电磁铁

2025-03-24
更多 培训课堂
更多 焦点
更多 视频

技术专区