"); //-->
》》点此进入 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
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
利用高精度窗口监控器有效提高电源输出性能
磁滞
国内厂商,去搞AI ISP芯片了
开放的汽车电子控制系统研究
用CD4017组成分频系数为18的分频电路
提供PocketPC2003 BSP for Intel PXA25x and PXA26x
可改变频率的自激锯齿波电路
联发科Android晶片 本季出货 带动成长
ARM-ELF-GCC交叉编译环境,
蓝牙技术在施工机械在线监测中的应用
高通 CEO 安蒙谈 DeepSeek:AI 发展处于令人兴奋的转折点
自举式阶梯波电路
单结晶体管自激多谐振荡分频电路
某型直升机球形指示器故障探测器的研制
下一代3D晶体管,迈出重要一步
不止听音乐:苹果 AirPods健康监测专利获批,AI监测步态、心肺等
如何用100元赚得成百上千个100元
沥青软化点自动检测装置的设计
vivo进军机器人赛道?官方回应将在博鳌论坛上透露更多
希望开新板
提供PocketPC2003 BSP for Intel PXA27x
力科助力汽车电子总线开发
联发科技宣传片
电磁感应
介质损耗因数的自动数字测量系统
Vicor 电源模块 VI 的基本功能介绍
HBM新技术,横空出世
连续生产过程集散式监测系统的开发
电磁铁
复位信号发生电路