专栏中心

EEPW首页 > 专栏 > AVR笔记10:按键扫描(KEY控制对应LED亮灭)(GCC)

AVR笔记10:按键扫描(KEY控制对应LED亮灭)(GCC)

发布人:mayer 时间:2009-09-01 来源:工程师 发布文章
AVR笔记10:按键扫描(KEY控制对应LED亮灭)(GCC)

 

》》点此进入    http://bbs.armavr.com/   ARM-AVR嵌入式开发论坛

一、程序结构
程序结构GCC

二、仿真效果
点击看大图



三、程序源码
1、main.c

  1. /*******************************************************************************
  2. Platform: AVR mega16学习板(www.iccavr.com)
  3. Project : 实验十:按键扫描(KEY控制对应LED亮灭)
  4. Clock F : 3.6864M
  5. Software: WinAVR-20090313+Proteus7.4
  6. Author : 林夕依然
  7. Version : 08.12.08
  8. Updata : 09.02.26 模块化
  9. 09.05.03 增加proteus仿真模型,仿真通过
  10. 09.07.22 WinAVR-20090313调试通过
  11. comments:
  12. 1、以学习板流水灯和按键为硬件电路
  13. 2、按下按键后,对应的LED点亮,松开后熄灭
  14. 3、使用GCC自带延时函数
  15. *******************************************************************************/
  16. #include <avr/io.h>
  17. #include <util/delay.h>
  18. #include "key_scan.h"
  19.  
  20. int main(void)
  21. {
  22. DDRB =0XFF; //关闭LED
  23. PORTB=0XFF;
  24. while(1)
  25. {
  26. key_skcan();
  27. _delay_ms(10);
  28. }
  29. }

2、key_scan.c

  1. /*-----------------------------------------------------------------
  2. 函数名称: void key_scan(void)
  3. 函数功能: 键盘扫描程序
  4. 参 数:
  5. 返 回 值: 无
  6. -----------------------------------------------------------------*/
  7. #include <avr/io.h>
  8. #include <util/delay.h>
  9. #define uint unsigned int
  10. #define uchar unsigned char
  11.  
  12. void key_skcan(void)
  13. {
  14. uchar key_num=0; //存放按键值
  15. DDRA =0XFF; //PA端口输出高电平
  16. PORTA=0XFF;
  17. _delay_ms(1); //延时
  18. DDRA =0x00; //PA口上拉
  19.  
  20. if(PINA!=0XFF) //判断是否有按键按下,按键防抖处理
  21. {
  22. DDRA =0XFF;
  23. _delay_ms(1);
  24. DDRA =0X00;
  25. }
  26.  
  27. if(PINA!=0XFF) //当有按键按下时,判断是哪个按键
  28. {
  29. switch(PINA&0XFF)
  30. {
  31. case 0b11111110:key_num=0;break;
  32. case 0b11111101:key_num=1;break;
  33. case 0b11111011:key_num=2;break;
  34. case 0b11110111:key_num=3;break;
  35. case 0b11101111:key_num=4;break;
  36. case 0b11011111:key_num=5;break;
  37. case 0b10111111:key_num=6;break;
  38. case 0b01111111:key_num=7;break;
  39. default: break;
  40. }
  41.  
  42. while(PINA!=0XFF) //LED点亮
  43. {
  44. DDRB =0XFF;
  45. PORTB&=~(1<<key_num); //不延时,松开按键后,LED熄灭
  46. }
  47. DDRA =0XFF; //取消键盘上拉
  48. PORTB=0XFF; //关闭LED
  49. }
  50. }

3、key_scan.h

  1. void key_skcan(void);

四、完整项目文件下载

http://bbs.armavr.com/thread-907-1-2.html

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

关键词:

相关推荐

Debian GNU/Linux Bible.part5

长沙理工大学计算机学院全球人才招聘公告

Debian GNU/Linux Bible.part6

村田汽车电子元件技术交流会现场视频3

视频 2008-08-22

村田汽车电子元件技术交流会现场视频4

视频 2008-08-22

中国企业展示电动汽车电池弹出技术

村田汽车电子元件技术交流会现场视频2

视频 2008-08-22

高性能评估板为沉浸式音频体验快速便捷构建声场工具

村田汽车电子元件技术交流会现场视频1

视频 2008-08-13

40W超紧凑DC-DC转换器,适用于空间受限的严苛应用场合

尼得科仪器开发出支持令牌化的安全认证读卡器

Debian GNU/Linux Bible.part3

纳芯微携手联合电子与英诺赛科,共创新能源汽车功率电子新格局

Debian GNU/Linux Bible.part7

松下致力于将汽车电池容量提升25%

提升用户信心,确保电动汽车电池纯正可靠

村田汽车电子元件技术交流会现场视频5

视频 2008-08-22

Debian GNU/Linux Bible.part4

将触感转化为真实体验:TITAN Haptics以科学精度赋能触觉设计

北斗创新平台支持大理州深挖文旅等场景

更多 培训课堂
更多 焦点
更多 视频

技术专区