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

📄 mainnew._c

📁 mega8按键数码显示程序
💻 _C
字号:
/***************************************/
/*          使用内部震荡,设置4mhz     */
/****************************************/
 //2007.12---xieming
 //  1、使用ICCAVR的终端调试窗口(Terminal),进行通信调试。
//  2、对ICCAVR的终端调试窗口进行设置,设置串口为com1或com2,
//     通信波特率为19200(Tools->Environment Options...)。
//  3、将PC屏幕光标定位于调试窗口中
#include "iom8v.h"
#include "macros.h"
#define osccal 0x7d  
//内部RC校正常数

#define set_bit(x,y)  (x|=(1<<y))
#define clr_bit(x,y)  (x&=~(1<<y))
#define Se  2
#define TIME 20
//PORT B
#define OUT1 5
#define OUT2  4
#define OUT3  3
#define OUT4  2
#define OUT5  1
#define OUT7  0
//PORT D
#define OUT6  7

unsigned char rcv[5]={0,0,0,0,0};
unsigned char rcnt=0,timecnt=0;
unsigned char int1cnt;
unsigned int int1time;
unsigned char id;

unsigned char srun=0,upodwn=0;


void uart_initial() 
{UCSRA=0x00; //*1
UCSRB=0x00; 
UCSRC=0x86; //no parity,8 data,1 stop 
//UBRRL=12; //baud=19200*1  at4 Mhz
UBRRL=25; //baud=19200*1  at 8 Mhz
UBRRH=0x00; 

UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);////允许发送和接收,打开接受中断

} 


void int_initial() 
{
MCUCR=0X0F;//INT0   INT1 都设置为上升沿触发模式
//MCUCR=0X00;//INT0   INT1 都设置为低点平触发模式
//MCUCR=0X05;//INT0   INT1 都设置为任意沿触发模式
GICR=(1<<INT1);//外部中断1 使能

} 

void delay(int dt) //delay=(0.95dt+1.76)us 
{while(dt) 
{dt--; 
asm("nop"); 
asm("nop"); 
asm("nop"); 
} 
} 


/*  		字符输出函数 		 */
void putchar(unsigned char c)
	{	 UCSRB&=~(1<<RXEN);//DISABLE RECIEVE
         set_bit(PORTD,Se);
         delay(2000);
	     while(!(UCSRA&(1<<UDRE))); 
         UDR=c;
         delay(2000);
         clr_bit(PORTD,Se);
         UCSRB|=(1<<RXEN);//ENABLE RECIEVE
	}


void timer0_init(void)
{
 TCCR0 = 0x00;
 TCNT0 =-125; //定时时间   秒
 TCCR0 = (1<<CS02); //分频比256,
}


#pragma interrupt_handler timer0_ovf_isr:iv_TIMER0_OVF
void timer0_ovf_isr(void)
{
 TCNT0 =-125;
 timecnt++;
 if(timecnt>=TIME) 
   {TCCR0 = 0x00;//close timer0
    timecnt=0;
	if(upodwn==2)
	   {clr_bit(PORTB,OUT4);
	    set_bit(PORTB,OUT2);
	   }
	else //if	(upodwn==4)
	   {clr_bit(PORTB,OUT2);
	    set_bit(PORTB,OUT4);
	   }
   }
 
}



/*外部中断1处理*/
#pragma interrupt_handler int1:iv_INT1
void int1(void)
{GICR&=~(1<<INT1);//外部中断1 关闭
int1cnt++;

if(upodwn==2)//若在起靶状态,就发送中弹信息
  {putchar(id);
   putchar(int1cnt);
   }
int1time=0;
 //action();

}


/*串口接受中断*/
#pragma interrupt_handler usart_rxi:iv_USART_RXC
void usart_rxi(void)
{
 //set_bit(PORTD,Se);//recieve disable se
 //clr_bit(PORTD,Se);//recieve enable se
 rcv[rcnt]=UDR;

rcnt++;
if(rcnt==2)
  {rcnt=0;

   if (rcv[0]==id)
      {if(rcv[1]==1)//up
	     {clr_bit(PORTB,OUT4);
		  clr_bit(PORTB,OUT3);
	      set_bit(PORTB,OUT1);
		  
		  timer0_init();
		  TIMSK =1<<TOIE0;//OPEN Timer0 int
		  
		  upodwn=2;
		  
		  }
	   
	   else if(rcv[1]==2)//down
	      {clr_bit(PORTB,OUT2);
		   clr_bit(PORTB,OUT1);
	       set_bit(PORTB,OUT3);
		   rcv[1]=0;
		   
	       timer0_init();
		   TIMSK =1<<TOIE0;//OPEN Timer0 int
		   
		   upodwn=4;
		   
		   }
	   
	   else if(rcv[1]==7)//audio cnt
	   rcv[1]=int1cnt;
	   
	   else rcv[1]=0x0b;
	   
	   //delay(100);
       
       putchar(id);//return value
	   putchar(rcv[1]);
	   rcv[0]=0;
	   rcv[1]=0;
      }
	  
  }

 //action();

}


void run(unsigned char cmd)
{
if(cmd)
  {
   switch(upodwn)
     {case 2://up
	        clr_bit(PORTB,OUT4);
			clr_bit(PORTB,OUT3);
	        set_bit(PORTB,OUT1);
	        break;
	  case 4://down
	        clr_bit(PORTB,OUT2);
			clr_bit(PORTB,OUT1);
	        set_bit(PORTB,OUT3);
	        break;
	  default:break;
	 }
	 //启动定时器0 
	 timer0_init();
	 TIMSK =1<<TOIE0;//OPEN Timer0 int
	
	 srun=0;//运行过后清除运行标志
  }

}

void main(void) 
{
unsigned char j,keyst;
unsigned int temp,i=0;


    DDRC=0x00;/*PORTC is INPUT PORT*/
	PORTC=0x7F;//PORTC PULLUP ENABLED
	DDRD=0xD7;	/* PD5 3  input ;others output */
	PORTD=0x73;	//se=0    pd2 pd3=0
	
    DDRB=0xff;/* output */
	PORTB=0x00;/*  */

//DDRD=(1<<DDD2);
//PORTD=0;

id=PINC+0x80;//读入地址
uart_initial(); 
int_initial();
 
SEI();//开全局中断//open intrrupt

keyst=PIND;
keyst=keyst&(1<<DDD5);//取出按键的初始状态

while(1) 
  {
  
  int1time++;
  if(int1time==150) 
     {
	  GIFR=(1<<INTF1);//清除标志
	  GICR=(1<<INT1);//外部中断1 使能
	 } 
  /*判断按键key的方向*/
  i=PIND;
  delay(2000);
  temp=PIND;
  if(i==temp)
  if (i&(1<<DDD5))  //key=1-----up
     {if(i!=keyst)
		  {upodwn=2;//---up
		   srun=1;
		   keyst=i;
		  }
     }
  else              //key=0-----down
     {if(i!=keyst)
	    {keyst=i;
		 srun=1;//运行标志有效
		 upodwn=4;//----down
	    }
	  }
	  
 /*yunxing*/
 run(srun);
  } 
} 

⌨️ 快捷键说明

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