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

2009-8-31 15:27 4346 7 7 分类: MCU/ 嵌入式

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


一、程序结构
attachimg.gif 程序结构GCC

二、仿真效果
attachimg.gif 点击看大图




三、程序源码
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. int main(void)

  20. {

  21. DDRB =0XFF; //关闭LED

  22. PORTB=0XFF;

  23. while(1)

  24. {

  25. key_skcan();

  26. _delay_ms(10);

  27. }

  28. }

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. void key_skcan(void)

  12. {

  13. uchar key_num=0; //存放按键值

  14. DDRA =0XFF; //PA端口输出高电平

  15. PORTA=0XFF;

  16. _delay_ms(1); //延时

  17. DDRA =0x00; //PA口上拉



  18. if(PINA!=0XFF) //判断是否有按键按下,按键防抖处理

  19. {

  20. DDRA =0XFF;

  21. _delay_ms(1);

  22. DDRA =0X00;

  23. }



  24. if(PINA!=0XFF) //当有按键按下时,判断是哪个按键

  25. {

  26. switch(PINA&0XFF)

  27. {

  28. case 0b11111110:key_num=0;break;

  29. case 0b11111101:key_num=1;break;

  30. case 0b11111011:key_num=2;break;

  31. case 0b11110111:key_num=3;break;

  32. case 0b11101111:key_num=4;break;

  33. case 0b11011111:key_num=5;break;

  34. case 0b10111111:key_num=6;break;

  35. case 0b01111111:key_num=7;break;

  36. default: break;

  37. }



  38. while(PINA!=0XFF) //LED点亮

  39. {

  40. DDRB =0XFF;

  41. PORTB&=~(1<<key_num); //不延时,松开按键后,LED熄灭

  42. }

  43. DDRA =0XFF; //取消键盘上拉

  44. PORTB=0XFF; //关闭LED

  45. }

  46. }

3、key_scan.h





  1. void key_skcan(void);

四、完整项目文件下载


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

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条