AVR笔记10:按键扫描(KEY控制对应LED亮灭)(GCC)
》》点此进入 http://bbs.armavr.com/ ARM-AVR嵌入式开发论坛
一、程序结构
二、仿真效果
三、程序源码
1、main.c
- /*******************************************************************************
- Platform: AVR mega16学习板(www.iccavr.com)
- Project : 实验十:按键扫描(KEY控制对应LED亮灭)
- Clock F : 3.6864M
- Software: WinAVR-20090313+Proteus7.4
- Author : 林夕依然
- Version : 08.12.08
- Updata : 09.02.26 模块化
- 09.05.03 增加proteus仿真模型,仿真通过
- 09.07.22 WinAVR-20090313调试通过
- comments:
- 1、以学习板流水灯和按键为硬件电路
- 2、按下按键后,对应的LED点亮,松开后熄灭
- 3、使用GCC自带延时函数
- *******************************************************************************/
- #include <avr/io.h>
- #include <util/delay.h>
- #include "key_scan.h"
-
- int main(void)
- {
- DDRB =0XFF; //关闭LED
- PORTB=0XFF;
- while(1)
- {
- key_skcan();
- _delay_ms(10);
- }
- }
2、key_scan.c
- /*-----------------------------------------------------------------
- 函数名称: void key_scan(void)
- 函数功能: 键盘扫描程序
- 参 数:
- 返 回 值: 无
- -----------------------------------------------------------------*/
- #include <avr/io.h>
- #include <util/delay.h>
- #define uint unsigned int
- #define uchar unsigned char
-
- void key_skcan(void)
- {
- uchar key_num=0; //存放按键值
- DDRA =0XFF; //PA端口输出高电平
- PORTA=0XFF;
- _delay_ms(1); //延时
- DDRA =0x00; //PA口上拉
-
- if(PINA!=0XFF) //判断是否有按键按下,按键防抖处理
- {
- DDRA =0XFF;
- _delay_ms(1);
- DDRA =0X00;
- }
-
- if(PINA!=0XFF) //当有按键按下时,判断是哪个按键
- {
- switch(PINA&0XFF)
- {
- case 0b11111110:key_num=0;break;
- case 0b11111101:key_num=1;break;
- case 0b11111011:key_num=2;break;
- case 0b11110111:key_num=3;break;
- case 0b11101111:key_num=4;break;
- case 0b11011111:key_num=5;break;
- case 0b10111111:key_num=6;break;
- case 0b01111111:key_num=7;break;
- default: break;
- }
-
- while(PINA!=0XFF) //LED点亮
- {
- DDRB =0XFF;
- PORTB&=~(1<<key_num); //不延时,松开按键后,LED熄灭
- }
- DDRA =0XFF; //取消键盘上拉
- PORTB=0XFF; //关闭LED
- }
- }
3、key_scan.h
四、完整项目文件下载
http://bbs.armavr.com/thread-907-1-2.html
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。