"); //-->
》》点此进入 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.30
Updata : 09.02.26 模块化
09.04.30 增加proteus仿真模型,仿真通过。
09.07.21 WinAVR-20071221环境下编译通过。
comments :
1、以学习板八个LED灯和八个按键为硬件电路,JP7短路块需装上
2、AVR单片机端口寄存器的使用及理解
3、端口电平检测程序的编写方法
4、同【实验八】功能相同:操作KEY键控制对应的LED点亮
5、参考:http://www.iccavr.com/forum/dispbbs.asp?boardid=9&replyid=13569&id=147&skin=0&page=1&star=1
6、函数整合为function.c,按键扫描增加防抖功能
*******************************************************************************/
#include <avr/io.h>
#include "function.h"
int main(void)
{
port_init();
while(1)
{
key_scan();
}
}
2、function.c
/*******************************
Platform : AVR mega16学习板(www.iccavr.com)
function :功能函数集
Clock F : 3.6864M
Software : WinAVR-20071221+Proteus7.4
Author : 林夕依然
Version : 09.07.21
comments :
1、两种方式实现延时
2、端口初始化函数
3、键盘扫描函数,增加防抖处理
********************************/
/*---------------------------------------------------------------------------------
延时程序计算方法
计数个数j = 延时时间/6*晶振频率 - 1
---------------------------------------------------------------------------------*/
#include <avr/io.h>
#define uchar unsigned char
#define uint unsigned int
//延时函数:方式一
void Delay(void)
{
uchar a, b, c;
for (a = 1; a; a++)
for (b = 1; b; b++)
for (c = 0; c<10; c++) //循环次数=255*255*10
;
}
//延时函数:方式二,1ms延时,准确性较Delay();高
void DelayMs(uint i)
{
while(i--)
{
uint j;
for(j=1;j<=613;j++)
;
}
}
//端口初始化
void port_init(void) //BCD口使能上拉
{
PORTB = 0XFF;
PORTC = 0XFF;
PORTD = 0XFF;
DDRB = 0X00;
DDRC = 0X00;
DDRD = 0X00;
}
//键盘扫描函数
void key_scan(void)
{
uchar key;
DDRB = 0XFF;
DDRA = 0X00;
PORTA = 0XFF;
if(PINA != 0XFF) //检测A口电平,如果全是高电平则退出
{
DelayMs(20); //防抖
if(PINA != 0XFF ) //再次检测A口电平,如果不全是高电平则继续执行程序
{
key = PINA; //读取PINA,将其存放在key中
PORTB = key; //将PINA读出的值赋给B端口,对应LED点亮
while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
//状态,不会有对应LED点亮发生
}
}
}
3、function.h
#define uint unsigned int
void Delay(void);
void DelayMs(uint i);
void port_init(void);
void key_scan(void);
四、完整项目文件下载
http://bbs.armavr.com/thread-798-1-2.html
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。