"); //-->
》》点此进入 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.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
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。