新闻  |   论坛  |   博客  |   在线研讨会
AVR笔记10:按键扫描(KEY控制对应LED亮灭)(GCC)
mayer | 2009-09-01 19:35:03    阅读:2301   发布文章

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

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客