返回列表 回复 发帖 点我体验网上斗地主的乐趣

[林夕依然] 实验3:按键扫描(用KEY选择对应LED点亮)(ICC)

相关搜索: 例程
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
【相关资源】
【ATMEGA16L】单片机学习案例硬件电路图
实验1:8种LED点亮模式
实验2:有源蜂鸣器驱动实验
实验3:按键扫描(用KEY选择对应LED点亮)
实验4:按键扫描+8种LED亮灭模式控制
实验5:按键扫描(用KEY选择LED点亮模式)
实验6:无源蜂鸣器驱动实验
实验7:外部中断INT0实验
实验8:7种LED亮灭模式+INT0中断+蜂鸣器
实验9:蜂鸣器产生音节节拍
实验10:按键扫描(KEY控制对应LED亮灭)
实验11:SPI实验(数码管显示)
实验12:SPI实验(数码管位显示控制)
实验13:SPI实验(数码管显示INT0次数)
实验14:TC0用作PWM相位修正模式
实验15:TC0定时器四种工作模式实验
实验16:TC0定时器中断实验
实验17:TC0定时器溢出定时实验
实验18:TC1比较中断实现10ms定时实验
实验19:音乐键盘
实验20:USART实验(查询方式收发数据)
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

一、程序结构
程序结构ICC.jpg
2009-7-31 10:25


二、仿真效果
实验3.jpg
2009-4-30 17:52


三、程序源码
1、main.c
  1. /*******************************************************************************
  2. Platform : AVR mega16学习板(www.iccavr.com)
  3. Project : 实验三:按键扫描(用KEY选择对应LED点亮)
  4. Clock F : 3.6864M
  5. Software : ICCAVR7.14C
  6. Author : 林夕依然
  7. Version : 08.11.22
  8. Updata : 09.02.25 模块化
  9. 09.04.30 增加proteus仿真模型,仿真通过。
  10. comments :
  11. 1、以学习板八个LED灯和八个按键为硬件电路,JP7短路块需装上
  12. 2、AVR单片机端口寄存器的使用及理解
  13. 3、端口电平检测程序的编写方法
  14. 4、操作KEY键控制对应的LED点亮
  15. 5、PORTB=~BIT(0)和PORTB&=~BIT(0);的区别,前者是对整个B口的操作,
  16. 后者是只对B0的操作,不影响其他端口的状态
  17. 6、同时按下多个键时,LED不会依次循环点亮,详见仿真。原因为:尽管key_scan.c
  18. 采用循环判断方式,但进行了状态处理。
  19. *******************************************************************************/
  20. #include <iom16v.h>
  21. #include <macros.h>
  22. #define uint unsigned int

  23. void main()
  24. {
  25. port_init();
  26. while(1)
  27. {
  28. key_scan();
  29. }
  30. }
复制代码
2、key_scan.c
  1. #include <iom16v.h>
  2. #include <macros.h>

  3. /***键盘扫描程序***/
  4. void key_scan(void)
  5. {
  6. if((PINA&(1<<PA0))==0)
  7. {
  8. PORTB=~BIT(0);
  9. DelayMs(50);
  10. while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
  11. }

  12. if((PINA&(1<<PA1))==0)
  13. {
  14. PORTB=~BIT(1);
  15. DelayMs(50);
  16. while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
  17. }

  18. if((PINA&(1<<PA2))==0)
  19. {
  20. PORTB=~BIT(2);
  21. DelayMs(50);
  22. while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
  23. }

  24. if((PINA&(1<<PA3))==0)
  25. {
  26. PORTB=~BIT(3);
  27. DelayMs(50);
  28. while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
  29. }

  30. if((PINA&(1<<PA4))==0)
  31. {
  32. PORTB=~BIT(4);
  33. DelayMs(50);
  34. while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
  35. }

  36. if((PINA&(1<<PA5))==0)
  37. {
  38. PORTB=~BIT(5);
  39. DelayMs(50);
  40. while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
  41. }

  42. if((PINA&(1<<PA6))==0)
  43. {
  44. PORTB=~BIT(6);
  45. DelayMs(50);
  46. while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
  47. }

  48. if((PINA&(1<<PA7))==0)
  49. {
  50. PORTB=~BIT(7);
  51. DelayMs(50);
  52. while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
  53. }
  54. }
复制代码
3、delay.c
  1. /*******************************
  2. Platform : AVR mega16学习板(www.iccavr.com)
  3. function :延时函数
  4. Clock F : 3.6864M
  5. Software : ICCAVR7.14C
  6. Author : 林夕依然
  7. Version : 09.02.25
  8. comments :
  9. 1、两种方式实现延时
  10. ********************************/

  11. /*---------------------------------------------------------------------------------
  12. 延时程序计算方法
  13. 计数个数j = 延时时间/6*晶振频率 - 1
  14. ---------------------------------------------------------------------------------*/

  15. #define uchar unsigned char
  16. #define uint unsigned int

  17. //方式一:
  18. void Delay()
  19. {
  20. uchar a, b, c;
  21. for (a = 1; a; a++)
  22. for (b = 1; b; b++)
  23. for (c = 0; c<10; c++) //循环次数=255*255*10
  24. ;
  25. }

  26. //方式二:1ms延时,准确性较Delay();高
  27. void DelayMs(uint i)
  28. {
  29. while(i--)
  30. {
  31. uint j;
  32. for(j=1;j<=613;j++)
  33. ;
  34. }
  35. }
复制代码
4、port_init.c
  1. #include <iom16v.h>
  2. #include <macros.h>

  3. /***端口初始化函数***/
  4. void port_init()
  5. {
  6. DDRA =0X00;
  7. PORTA=0XFF;
  8. DDRB =0XFF;
  9. PORTB=0XFF;
  10. DDRC =0X00;
  11. PORTC=0XFF;
  12. DDRD =0X00;
  13. PORTD=0XFF;
  14. }
复制代码
四、完整项目文件下载
实验3完整项目文件及proteus模型.rar (52.52 KB)
面对人生,既要有当机立断的决心,更要有永不后悔的气魄!
****************************************************************
期待你和论坛一起成长、进步!

怎么要回复啊

怎么要回复啊

怎么要回复啊

搞了这个回复好像没什么用吧,你看看阿莫的网站都不用回复的
看看 正在学这个呢 哈哈
看看 正在学这个呢 哈哈
貌似protues打不开哦
使用7.4版本
面对人生,既要有当机立断的决心,更要有永不后悔的气魄!
****************************************************************
期待你和论坛一起成长、进步!
谢谢了!!
提示: 作者被禁止或删除 内容自动屏蔽
学习一下!!
谢谢了!!
序有改动,以附件为准!
谢谢啊 我的单片机学的不怎么样 但还要教别人 正在到处找现成的例子 呵呵
很好,支持!顶起来
谢谢楼主提供!!
好资料,谢谢楼主分享
Forge ahead! Never retreat!
好东西,谢谢啊
好好学习了!
很好好 很强大 谢谢
正在到处找现成的例子呢!谢啦!
返回列表
Datasheet