⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 runled.c

📁 4个跑马灯
💻 C
字号:
#include <iom16v.h>
#include <macros.h>
#include <stdio.h>

#define uchar unsigned char
#define uint unsigned int

#define D01ON PORTB&=(~(1<<PB3))    //打开LED D1   与的方式置0
#define D01OFF PORTB|=(1<<PB3)      //关闭LED D1   或的方式置1
#define D02ON PORTB&=(~(1<<PB2))
#define D02OFF PORTB|=(1<<PB2)
#define D03ON PORTB&=(~(1<<PB1))
#define D03OFF PORTB|=(1<<PB1)
#define D04ON PORTB&=(~(1<<PB0))
#define D04OFF PORTB|=(1<<PB0)

#define LED1 D01ON;D02OFF;D03OFF;D04OFF;delay_nms(100);
#define LED12 D01ON;D02ON;D03OFF;D04OFF;delay_nms(100);
#define LED14 D01ON;D02OFF;D03ON;D04OFF;delay_nms(100);
#define LED13 D01ON;D02OFF;D03OFF;D04ON;delay_nms(100);

#define LED2 D02ON;D01OFF;D03OFF;D04OFF;delay_nms(100);
#define LED21 D02ON;D01ON;D03OFF;D04OFF;delay_nms(100);
#define LED24 D02ON;D01OFF;D03ON;D04OFF;delay_nms(100);
#define LED23 D02ON;D01OFF;D03OFF;D04ON;delay_nms(100);

#define LED4 D03ON;D02OFF;D01OFF;D04OFF;delay_nms(100);
#define LED41 D03ON;D02OFF;D01ON;D04OFF;delay_nms(100);
#define LED42 D03ON;D02ON;D01OFF;D04OFF;delay_nms(100);
#define LED43 D03ON;D02OFF;D01OFF;D04ON;delay_nms(100);

#define LED3 D04ON;D02OFF;D03OFF;D01OFF;delay_nms(100);
#define LED31 D04ON;D02OFF;D03OFF;D01ON;delay_nms(100);
#define LED32 D04ON;D02ON;D03OFF;D01OFF;delay_nms(100);
#define LED34 D04ON;D02OFF;D03ON;D01OFF;delay_nms(100);

#define LED44 D01ON;D02ON;D03ON;D04ON;delay_nms(100);     ///全亮
#define LED00 D01OFF;D02OFF;D03OFF;D04OFF;delay_nms(100); //全灭



#define BuzzerON  PORTC|=(1<<PC6)
#define BuzzerOFF PORTC&=(~(1<<PC6))
//比#define BuzzerOFF PORTC=0x00全修改方式相对好,仅修改个别位
#define BuzzerLongON  BuzzerON;delay_nms(500);BuzzerOFF;
#define BuzzerShortON BuzzerON;delay_nms(100);BuzzerOFF;
/*
void timer1_init(void);
void delay_nms(unsigned int n);

void timer1_init(void)///1秒中断初始化 定时1
{
   TCCR1B=0x00;
   TCNT1H=0xf0;
   TCNT1L=0xBE;
   OCR1AH=0x00;
   OCR1AL=0x00;
   OCR1BH=0x00;
   OCR1BL=0x00;
   TCCR1A=0x00;
   TCCR1B=0x05;
}

uint count60s=0;  //60秒=1分
uint count3600s=0; //60分钟=1时
uint count1h=0; //60分钟=1时




#pragma interrupt_handler timer1_ovf_isr:7
void timer1_ovf_isr(void) ///1秒中断
{
   TCNT1H=0xf0;
   TCNT1L=0xbe;
   if (count60s<60)
     {BuzzerShortON;
	   count60s++;
	 }
   if (count60s>60)
        {
	     count60s=1;
	     count3600s++;
	     if (count3600s<60)
	        {
	      	   count3600s++;
	      	 }
	     if (count3600s>60)
	         {
	      	   count3600s=1;
	      	   count1h++;
			    if (count1h=7)
				{
				  count1h=0;
				  while(1)
				    {
					  BuzzerShortON;
					 }
				}
	      	 }
	    }
}


#pragma interrupt_handler timer1_ovf_isr:7
void timer1_ovf_isr(void) ///1秒中断
{
   TCNT1H=0xf0;
   TCNT1L=0xbe;
    BuzzerShortON;
   if (count60s<60)
     {
	   BuzzerShortON;
	   count60s++;
	 }
   
}
*/
void WDT_ON(void)
 {
   WDR(); //this prevents a timout on enabling
   WDTCR|=(1<<WDTOE)|(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0);//WDTCR = 0x1F; //特别注意这一条不是ICC生成的,是后来加上的。
   WDTCR&=(~(1<<WDTOE))|(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0);//WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
 }

void delay_1ms(void)//1ms延时函数
{
  unsigned int i;
  for (i=0;i<150;i++)
  WDR();  
} 
 
void delay_nms(unsigned int n)//延时n毫秒
{
  unsigned int i;
  for (i=0;i<n;i++)//执行n次1毫秒延时
      {
	     delay_1ms(); 
      }
  WDR(); 
}

void LED_Run(void)
{
  uint i;
   for (i=5;i>0;i--){LED1;LED12;LED23;LED34;LED41;}
   for (i=5;i>0;i--){LED1;LED14;LED43;LED32;LED21;}
   for (i=4;i>0;i--){LED1;LED14;LED2;LED23;LED3;LED32;LED4;LED41;}
   for (i=4;i>0;i--){LED1;LED13;LED2;LED24;LED3;LED31;LED4;LED42;}
   for (i=3;i>0;i--){LED1;LED12;LED2;LED21;LED2;LED23;LED3;LED32;LED3;LED34;LED4;LED43;LED4;LED41;LED1;LED14}
   for (i=3;i>0;i--){LED1;LED14;LED4;LED41;LED4;LED43;LED3;LED34;LED3;LED32;LED2;LED23;LED2;LED21;LED1;LED12}
}
 
void main(void)
{ 	
   	OSCCAL=0xff;                   //系统时钟校准,不同的芯片和不同的频率,200%
	PORTA = 0xff;DDRA  = 0xff;  PORTB = 0xff;DDRB  = 0xff;
    PORTC = 0x00;DDRC  = 0xff;  PORTD = 0x00;DDRD  = 0x00;
	WDT_ON();              //使能watchdog,并且采用2048K分频,典型溢出时间5V时2.1S
//    timer1_init();
	SEI();
	LED44;                             //开放中断
	delay_nms(500);        //延时1秒
	BuzzerShortON;        //提示开始计时
  	while(1) 
     {
	   WDR();                    //清看门狗
	   LED_Run();
	   BuzzerShortON
	   //LED1;LED12;LED23;LED34;LED41;
		
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -