原创 AVR笔记4:按键扫描+8种LED亮灭模式控制(GCC)

2009-8-31 15:14 3948 4 4 分类: MCU/ 嵌入式

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


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


下载 (11.59 KB)

2009-7-23 20:48


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


下载 (173.51 KB)

2009-7-23 20:48



三、程序源码
1、main.c





  1. /*******************************************************************************

  2. Platform : AVR mega16学习板(www.iccavr.com)

  3. Project : 实验四:按键扫描+8种LED亮灭模式控制GCC

  4. Clock F : 3.6864M

  5. Software : WinAVR-20071221+Proteus7.4

  6. Author : 林夕依然

  7. Version : 08.11.22

  8. Updata : 09.02.25 模块化

  9. 09.04.30 增加proteus仿真模型,修改key_scan.c检测程序,仿真通过

  10. 09.07.21 WinAVR-20071221环境下编译通过

  11. comments :

  12. 1、以学习板八个LED灯和八个按键为硬件电路,JP7短路块需装上

  13. 2、AVR单片机端口寄存器的使用及理解

  14. 3、练习程序模块化,结构化的书写

  15. 4、端口电平检测程序的编写方法

  16. 5、8种LED点亮模式由对应的KEY键选择,同时按下多个键时,LED点亮模式不会循环进行,

  17. 详见仿真。原因为:尽管key_scan.c采用循环判断方式,但采用了状态处理程序

  18. 6、增加状态处理,防止运行选定LED模式序时按下其他按键

  19. 7、使用GCC delay.h头文件中延时函数,更换io头文件

  20. Problem :

  21. 1、ICC中DelayMs()函数在GCC中不可用,不知何因。

  22. *******************************************************************************/

  23. #include <avr/io.h>

  24. #include "port_init.h"

  25. #include "key_scan.h"



  26. int main(void)

  27. {

  28. port_init();

  29. while (1)

  30. {

  31. key_scan();

  32. }

  33. //MCUCR=0x40; //空闲模式,CPU占用100%

  34. //MCUCR=0x50; //ADC噪声抑制模式,CPU占用100%

  35. //MCUCR=0x60; //掉电模式,CPU占用80%

  36. //MCUCR=0x70; //省电模式,CPU占用4%

  37. //MCUCR=0xE0; //Standby模式,CPU占用80%

  38. MCUCR=0xF0; //扩展Standby模式,CPU占用4%

  39. asm("sleep"); //CPU休眠指令

  40. }

2、key_scan.c





  1. #include <avr/io.h>

  2. #include "key_scan.h"

  3. #include "led.h"



  4. /***键盘扫描函数***/

  5. void key_scan(void)

  6. {

  7. int l,m,n,o,p,q,r,s,i;



  8. if((PINA&(1<<PA0))==0) //模式1:顺序点亮

  9. {

  10. PORTB=0XFF;

  11. for(l=0;l<5;l++)

  12. {

  13. for (i = 0; i < 8; i++) //顺序单个点亮LED

  14. LED_01(i);

  15. for (i = 6; i > 0; i--) //逆序单个点亮LED

  16. LED_01(i);

  17. }

  18. LED_off();//关闭LED

  19. while(PINA!=0XFF); //状态处理,防止运行此程序时按下其他按键

  20. }



  21. if((PINA&(1<<PA1))==0) //模式2:顺序单个间隔点亮

  22. {

  23. PORTB=0XFF;

  24. for(m=0;m<5;m++)

  25. {

  26. for (i = 0; i < 8; i += 2) //顺序间隔点亮LED

  27. LED_01(i);

  28. for (i = 7; i > 0; i -= 2) //逆序间隔点亮LED

  29. LED_01(i);

  30. }

  31. LED_off();//关闭LED

  32. while(PINA!=0XFF); //状态处理,防止运行此程序时按下其他按键

  33. }



  34. if((PINA&(1<<PA2))==0) //模式3:间隔点亮

  35. {

  36. PORTB=0XFF;

  37. for(n=0;n<5;n++)

  38. {

  39. for (i = 2; i < 8; i++) //间隔顺序同时点亮

  40. LED_02(i);

  41. for (i = 6; i > 2; i--) //间隔逆序同时点亮

  42. LED_02(i);

  43. }

  44. LED_off();//关闭LED

  45. while(PINA!=0XFF); //状态处理,防止运行此程序时按下其他按键

  46. }



  47. if((PINA&(1<<PA3))==0) //模式4:相临点亮

  48. {

  49. PORTB=0XFF;

  50. for(o=0;o<5;o++)

  51. {

  52. for (i = 1; i < 8; i++) //相临顺序同时点亮

  53. LED_03(i);

  54. for (i = 6; i > 1; i--) //相临逆序同时点亮

  55. LED_03(i);

  56. }

  57. LED_off();//关闭LED

  58. while(PINA!=0XFF); //状态处理,防止运行此程序时按下其他按键

  59. }



  60. if((PINA&(1<<PA4))==0) //模式5:发散聚集点亮

  61. {

  62. PORTB=0XFF;

  63. for(p=0;p<5;p++)

  64. {

  65. for(i=0;i<4;i++) //发散点亮

  66. LED_04(i);

  67. for(i=2;i>0;i--) //聚集点亮

  68. LED_04(i);

  69. }

  70. LED_off();//关闭LED

  71. while(PINA!=0XFF); //状态处理,防止运行此程序时按下其他按键

  72. }



  73. if((PINA&(1<<PA5))==0) //模式6:四四点亮

  74. {

  75. PORTB=0XFF;

  76. for(q=0;q<5;q++)

  77. {

  78. for(i=0;i<4;i++) //四四顺序点亮

  79. LED_05(i);

  80. for(i=2;i>0;i--) //四四逆序点亮

  81. LED_05(i);

  82. }

  83. LED_off();//关闭LED

  84. while(PINA!=0XFF); //状态处理,防止运行此程序时按下其他按键

  85. }



  86. if((PINA&(1<<PA6))==0) //模式7:四四点亮

  87. {

  88. PORTB=0XFF;

  89. for(r=0;r<5;r++)

  90. {

  91. for(i=0;i<2;i++) //四四顺序点亮

  92. LED_06(i);

  93. }

  94. LED_off();//关闭LED

  95. while(PINA!=0XFF); //状态处理,防止运行此程序时按下其他按键

  96. }



  97. if((PINA&(1<<PA7))==0) //模式8:全部点亮熄灭

  98. {

  99. PORTB=0XFF;

  100. for(s=0;s<5;s++)

  101. {

  102. LED_on();

  103. LED_off();

  104. }

  105. LED_off();//关闭LED

  106. while(PINA!=0XFF); //状态处理,防止运行此程序时按下其他按键

  107. }

  108. }

3、led.c





  1. /*******************************

  2. Platform : AVR mega16学习板(www.iccavr.com)

  3. function :功能函数集

  4. Clock F : 3.6864M

  5. Software : WinAVR-20071221

  6. Author : 林夕依然

  7. Version : 09.07.20

  8. comments :

  9. ********************************/

  10. #include <avr/io.h>

  11. #include <util/delay.h>

  12. #include "led.h"



  13. void LED_on(void) //打开所有LED

  14. {

  15. PORTB =0X00;

  16. _delay_ms(100);

  17. }



  18. void LED_off(void) //关闭所有LED

  19. {

  20. PORTB = 0xFF;

  21. _delay_ms(100);

  22. }



  23. void LED_01(int i) //LED亮灭控制

  24. {

  25. PORTB = ~_BV(i); //输出低电平

  26. _delay_ms(100); //调用延时程序

  27. }



  28. void LED_02(int i) //间隔点亮

  29. {

  30. PORTB=~(_BV(i)|_BV(i-2));

  31. _delay_ms(100);

  32. }



  33. void LED_03(int i) //相临点亮

  34. {

  35. PORTB=~(_BV(i)|_BV(i-1)); //~后内容需用括号括起来

  36. _delay_ms(100);

  37. }



  38. void LED_04(int i) //发散聚集点亮

  39. {

  40. switch(i)

  41. {

  42. case 0:PORTB=0xE7;_delay_ms(100);break; //延时100ms

  43. case 1:PORTB=0xDB;_delay_ms(100);break;

  44. case 2:PORTB=0xBD;_delay_ms(100);break;

  45. case 3:PORTB=0x7E;_delay_ms(100);break;

  46. default:break;

  47. }

  48. }



  49. void LED_05(int i) //00,0F,F0,FF方式显示

  50. {

  51. switch(i)

  52. {

  53. case 0:PORTB=0x00;_delay_ms(100);break; //延时100ms

  54. case 1:PORTB=0x0F;_delay_ms(100);break;

  55. case 2:PORTB=0xF0;_delay_ms(100);break;

  56. case 3:PORTB=0xFF;_delay_ms(100);break;

  57. default:break;

  58. }

  59. }



  60. void LED_06(int i)

  61. {

  62. switch(i)

  63. {

  64. case 0:PORTB=0XAA;_delay_ms(100);break;

  65. case 1:PORTB=0X55;_delay_ms(100);break;

  66. }

  67. }

4、port_init.c





  1. #include <avr/io.h>

  2. #include "port_init.h"



  3. /***端口初始化函数***/

  4. void port_init(void)

  5. {

  6. DDRA =0X00; //端口上拉输入

  7. PORTA=0XFF;

  8. DDRB =0xFF; //端口输出

  9. PORTB=0xFF; //输出高电平,LED熄灭

  10. DDRC =0X00;

  11. PORTC=0XFF;

  12. DDRD =0X00;

  13. PORTD=0XFF;

  14. }

5、key_scan.h





  1. void key_scan(void);

6、led.h





  1. void LED_on(void);

  2. void LED_off(void);

  3. void LED_01(int i);

  4. void LED_02(int i);

  5. void LED_03(int i);

  6. void LED_04(int i);

  7. void LED_05(int i);

  8. void LED_06(int i);

7、port_init.h





  1. void port_init(void);

四、完整项目文件下载
http://bbs.armavr.com/thread-796-1-2.html

PARTNER CONTENT

文章评论0条评论)

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