原创
ATmega16_App_V1.0开发板范例1:8种LED点亮模式
一、
程序结构
二、
仿真效果
三、程序源码
1、main.c
- /*******************************************************************************
- Platform : ATmega16_App_V1.0开发板(http://bbs.armavr.com)
- Project : 范例一:8种LED点亮模式
- Clock F : 3.6864M
- Software : ICCAVR7.14C
- Author : 林夕依然
- Version : 09.11.03
- Updata :
- comments :
- 1、以学习板4路32只LED灯为硬件电路,装上PORTA,PORTB,PORTC,PORTD所有短接帽。
- 2、S1四位拨码开关均需拨动到ON端。
- 3、烧录程序时,禁止JTAG,用作普通IO端口。
- 4、练习AVR单片机端口寄存器的使用及理解。
- 5、练习程序模块化,结构化的书写。
- 6、单片机休眠模式练习。
- 7、8种LED点亮模式。
- *******************************************************************************/
- #include <iom16v.h>
- #include <macros.h>
- #include "led.h"
- void main(void)
- {
- int l,m,n,o,p,q,r,s,i,j;
- DDRA =0XFF;
- PORTA=0X00;
- DDRB =0xFF; //端口输出
- PORTB=0x00; //输出低电平,LED熄灭
- DDRC =0XFF;
- PORTC=0X00;
- DDRD =0XFF;
- PORTD=0X00;
- for (r=0;r<5;r++) //8种点亮模式循环5遍,之后进入休眠模式
- {
- for(l=0;l<5;l++) //模式1:顺序点亮
- {
- for (i = 0; i < 8; i++) //顺序单个点亮LED
- LED_01(i);
- for (i = 6; i > 0; i--) //逆序单个点亮LED
- LED_01(i);
- }
- LED_off();
- for(m=0;m<5;m++) //模式2:顺序单个间隔点亮
- {
- for (i = 0; i < 8; i += 2) //顺序间隔点亮LED
- LED_01(i);
- for (i = 7; i > 0; i -= 2) //逆序间隔点亮LED
- LED_01(i);
- }
- LED_off();
- for(n=0;n<5;n++) //模式3:间隔点亮
- {
- for (i = 2; i < 8; i++) //间隔顺序同时点亮
- LED_02(i);
- for (i = 6; i > 2; i--) //间隔逆序同时点亮
- LED_02(i);
- }
- LED_off();
- for(o=0;o<5;o++) //模式4:相临点亮
- {
- for (i = 1; i < 8; i++) //相临顺序同时点亮
- LED_03(i);
- for (i = 6; i > 1; i--) //相临逆序同时点亮
- LED_03(i);
- }
- LED_off();
- for(p=0;p<5;p++) //模式5:发散聚集点亮
- {
- for(i=0;i<4;i++) //发散点亮
- LED_04(i);
- for(i=2;i>0;i--) //聚集点亮
- LED_04(i);
- }
- LED_off();
- for(q=0;q<5;q++) //模式6:四四点亮
- {
- for(i=0;i<4;i++) //四四顺序点亮
- LED_05(i);
- for(i=2;i>0;i--) //四四逆序点亮
- LED_05(i);
- }
- LED_off();
- for(s=0;s<5;s++) //模式7:四四点亮
- {
- for(i=0;i<2;i++) //四四顺序点亮
- LED_06(i);
- }
- LED_off();
- for(j=0;j<10;j++) //模式8:全部点亮熄灭
- {
- LED_on();
- LED_off();
- }
- }
- //MCUCR=0x40; //空闲模式,CPU占用100%
- //MCUCR=0x50; //ADC噪声抑制模式,CPU占用100%
- //MCUCR=0x60; //掉电模式,CPU占用80%
- //MCUCR=0x70; //省电模式,CPU占用4%
- //MCUCR=0xE0; //Standby模式,CPU占用80%
- MCUCR=0xF0; //扩展Standby模式,CPU占用4%
- asm("sleep"); //CPU休眠指令
- }
2、delay.c
- /*******************************
- Platform : ATmega16_App_V1.0开发板(http://bbs.armavr.com)
- function :延时函数
- Clock F : 3.6864M
- Software : ICCAVR7.14C
- Author : 林夕依然
- Version : 09.11.03
- comments :
- 1、两种方式实现延时
- ********************************/
- /*---------------------------------------------------------------------------------
- 延时程序计算方法
- 计数个数j = 延时时间/6*晶振频率 - 1
- ---------------------------------------------------------------------------------*/
- //方式一:
- void Delay(void)
- {
- unsigned char a, b, c;
- for (a = 1; a; a++)
- for (b = 1; b; b++)
- for (c = 0; c<10; c++) //循环次数=255*255*10
- ;
- }
- //方式二:1ms延时,准确性较Delay();高
- void DelayMs(unsigned int i)
- {
- while(i--)
- {
- unsigned int j;
- for(j=1;j<=613;j++)
- ;
- }
- }
3、led.c
- /*******************************
- Platform : ATmega16_App_V1.0开发板(http://bbs.armavr.com)
- function :功能函数集
- Clock F : 3.6864M
- Software : ICCAVR7.14C
- Author : 林夕依然
- Version : 09.11.03
- comments :
- ********************************/
- #include <iom16v.h>
- #include <macros.h>
- #include "delay.h"
- void LED_on(void) //打开所有LED
- {
- PORTA =0XFF;
- PORTB =0XFF;
- PORTC =0XFF;
- PORTD =0XFF;
- Delay();
- }
- void LED_off(void) //关闭所有LED
- {
- PORTA = 0x00;
- PORTB = 0x00;
- PORTC = 0x00;
- PORTD = 0x00;
- Delay();
- }
- void LED_01(int i) //LED亮灭控制
- {
- PORTA = BIT(i);
- PORTB = BIT(i); //输出高电平
- PORTC = BIT(i);
- PORTD = BIT(i);
- DelayMs(100); //调用延时程序
- }
- void LED_02(int i) //间隔点亮
- {
- PORTA=(BIT(i)|BIT(i-2));
- PORTB=(BIT(i)|BIT(i-2));
- PORTC=(BIT(i)|BIT(i-2));
- PORTD=(BIT(i)|BIT(i-2));
- DelayMs(100);
- }
- void LED_03(int i) //相临点亮
- {
- PORTA=(BIT(i)|BIT(i-1));
- PORTB=(BIT(i)|BIT(i-1)); //~后内容需用括号括起来
- PORTC=(BIT(i)|BIT(i-1));
- PORTD=(BIT(i)|BIT(i-1));
- DelayMs(100);
- }
- void LED_04(int i) //发散聚集点亮
- {
- switch(i)
- {
- case 0ORTA=0x18ORTB=0x18ORTC=0x18ORTD=0x18;DelayMs(100);break; //延时100ms
- case 1ORTA=0x24ORTB=0x24ORTC=0x24ORTD=0x24;DelayMs(100);break;
- case 2ORTA=0x42ORTB=0x42ORTC=0x42ORTD=0x42;DelayMs(100);break;
- case 3ORTA=0x81ORTB=0x81ORTC=0x81ORTD=0x81;DelayMs(100);break;
- default:break;
- }
- }
- void LED_05(int i) //00,0F,F0,FF方式显示
- {
- switch(i)
- {
- case 0ORTA=0xFFORTB=0xFFORTC=0xFFORTD=0xFF;DelayMs(100);break; //延时100ms
- case 1ORTA=0xF0ORTB=0xF0ORTC=0xF0ORTD=0xF0;DelayMs(100);break;
- case 2ORTA=0x0FORTB=0x0FORTC=0x0FORTD=0x0F;DelayMs(100);break;
- case 3ORTA=0x00ORTB=0x00ORTC=0x00ORTD=0x00;DelayMs(100);break;
- default:break;
- }
- }
- void LED_06(int i)
- {
- switch(i)
- {
- case 0ORTA=0X55ORTB=0X55ORTC=0X55ORTD=0X55;DelayMs(100);break;
- case 1ORTA=0XAAORTB=0XAAORTC=0XAAORTD=0XAA;DelayMs(100);break;
- }
- }
4、led.h
- void LED_on(void);
- void LED_off(void);
- void LED_01(int i);
- void LED_02(int i);
- void LED_03(int i);
- void LED_04(int i);
- void LED_05(int i);
- void LED_06(int i);
5、delay.h
- void Delay(void);
- void DelayMs(unsigned int i);
四、完整项目文件
https://static.assets-stash.eet-china.com/album/old-resources/2009/11/5/e096076c-6ae7-446b-9ccd-50a4a292aff3.rar
文章评论(0条评论)
登录后参与讨论