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

📄 main.c

📁 一个单片机的完整开发程序AVR的
💻 C
字号:
//ICC-AVR application builder : 2004-11-19 9:42:35
// Target : M8
// Crystal: 7.3728Mhz
#include <eeprom.h>
#include "head.h"

unsigned char getchar(void);       //申明函数:串口接收函数;
void sendchar(unsigned char data); //申明函数:串口发送函数;
unsigned char table[10]={0xeb,0x60,0xc7,0x8f,0x2e,0xbd,0xed,0x0b,0xef,0xaf};
unsigned char lcd_buffer[16];      
unsigned char host_id,guest_id,t,ques[100],data[110],ques_num;
unsigned int t1;

void port_init(void)
{
 PORTB = 0xDF;
 DDRB  = 0xFF;
 PORTC = 0x75; //m103 output only
 DDRC  = 0x77;
 PORTD = 0xFF;
 DDRD  = 0x97;
}

//UART0 initialisation
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x00;
 UCSRC = 0x86;
 UBRRL = 0x2F; //set baud rate lo
 UBRRH = 0x00; //set baud rate hi
 UCSRB = 0x18;
}

void timer0_init(void)
{
 TCCR0 = 0x00; //stop
 TCNT0 = 0x00 /*INVALID SETTING*/; //set count
 TCCR0 = 0x05; //start timer
}

#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
 TCNT0 = 0x00 /*INVALID SETTING*/; //reload counter value
 t++;
 if(t>100)
 {
  t1++; 
  t=0;
 }
}

void adc_init(void)
{
 DDRC=0x77;
 PORTC=0x75;
 ADCSRA = 0x00; //disable adc
 ADMUX = 0xC3; //select adc input 0
 ACSR  = 0x80;
 ADCSRA = 0xC6;
}

//call this routine to initialise all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 uart0_init();
 timer0_init();
 adc_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x01; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialised
}

//send data from the UART.
void sendchar(unsigned char data)
{
 while(!(UCSRA&(1<<UDRE)));
 UDR=data;
}
//receive data from the UART.
unsigned char getchar(void)
{
 while(!(UCSRA&(1<<RXC)));
 return UDR;
}

void send_ans(unsigned char star_flag,unsigned char star_num,unsigned char ans_num)
{
 unsigned char i,chk;
 chk=0xFF;
 chk=0xFF^star_flag;
	sendchar(star_flag);
	chk^=0x78;
	sendchar(0x78);
	chk^=0xAB;
	sendchar(0xAB);
	chk^=0xEF;
	sendchar(0xEF);
	chk^=host_id;
	sendchar(host_id);
	chk^=guest_id;
	sendchar(guest_id);
	chk^=0x01;
	sendchar(0x01);
	chk^=ques_num;
	sendchar(ques_num);
	for(i=star_num;i<ans_num;i++)
	{
	 sendchar(ques[i]);
	 chk^=ques[i];
	}
	chk^=0xF0;
	sendchar(0xF0);
	chk^=0x0F;
	sendchar(0x0F);
	sendchar(chk);
}

void send_answer()
{

 if(ques_num<38)
 	send_ans(0x12,0,ques_num);			
	else if(ques_num>37&&ques_num<75)
	{
	send_ans(0x12,0,37);
	send_ans(0x13,37,ques_num);
	}
	else
	{
	 send_ans(0x12,0,37);
	 send_ans(0x13,37,74);
	 send_ans(0x14,74,ques_num); 
	}
}

unsigned char receive()//
{
 unsigned char i,j;
 begin:	if(t>18)    return 0;//goto A;
	i=getchar();     //get data from RF
  	if(i==0x0f)      //get the start signal
  	{
	 data[0]=getchar();
	 if(data[0]==0xf0)
	 {
      data[1]=getchar();
	  if(data[1]==0xdd)
	  {
	   data[2]=getchar();
	   if(data[2]==0xbb)
	   {
	   	data[3]=getchar();
	  	if(data[3]==host_id)
	  	{
	  	 data[4]=getchar();
	  	 if(data[4]==guest_id||data[4]==0xfe||data[4]==0xdb)
	 	 {
	  	  for(j=5;j<12+ques_num;j++)   //
	  	  data[j]=getchar();
  	 	 }
		 else goto begin;
		}
		else goto begin;
	   }
	   else goto begin;
	  }
	  else goto begin;
	 }
	 else goto begin; 
	}
	else goto begin;
   return 1;
}

void main()
{
 	 unsigned char i,j,k,temp,ques_id,key,key_flag,d,d1,
	               n_ques[100],n_num,nques_id,score,ans[100],keya_flag,
	               keyb_flag,keyc_flag,keyd_flag,keye_flag,adc_h,adc_l;
	 unsigned int adc_rel,adc_old;
	 guest_id=EEPROMread(0x02);
	 host_id=EEPROMread(0x03);
	 i=0;
	 j=0;
	 k=0;
	 t=0;
	 temp=0;
	 ques_num=0;
	 ques_id=1;
	 nques_id=1;
	 keya_flag=0;
	 keyb_flag=0;
	 keyc_flag=0;
	 keyd_flag=0;
	 keye_flag=0;
	 key_flag=1;
	 init_devices();
	 init_lcd();
	 display(0x00);
   //temp=EEPROMread(0x04);
   //ques_num=EEPROMread(0x05);
   //score=EEPROMread(0x06);
   //for(i=0;i<100;i++)
   //{
   // ques[i]=EEPROMread(i+7);
  // } 
  //for(i=0;i<100;i++)
   //{
   // ans[i]=EEPROMread(i+107);
  // } 
	// while(1);
	  if((PIND|0x9f)==0x9f)
	 {
	  while(key!=5)
	  {
		 if(keyc_flag==0)
		{
		 i=host_id/10;
		 k=host_id-(10*i);
		 lcd_buffer[9]=0x02;
		 lcd_buffer[1]=0;
		}
		else
		{
		 i=guest_id/10;
		 k=guest_id-10*i;
		 lcd_buffer[1]=0x02;
		 lcd_buffer[9]=0;
		}
		lcd_buffer[7]=table[i];
		lcd_buffer[15]=table[k]&0xef;
		send_data(14,lcd_buffer[7]);
		send_data(30,lcd_buffer[15]);
		send_data(2,lcd_buffer[1]);
		send_data(18,lcd_buffer[9]);
		key=key_scan();
		if(key==3)
		keyc_flag=~keyc_flag;
		if(key==7)
		{
		 if(keyc_flag==0)
		 host_id++;
		 else
		 guest_id++;
		}
		if(key==4)
		{
		 if(keyc_flag==0)
		 host_id--;
		 else
		 guest_id--;
		}
		if(host_id>80||host_id<1)
		host_id=1;
		if(guest_id>80||guest_id<1)
		guest_id=1;
		if(key==5)
		{
		 lcd_buffer[0]=table[i];
		 lcd_buffer[6]=table[k];
		
		 PORTB&=~BIT(PB5);
		 PORTC&=~BIT(PC1);
		 while(!((PIND|0x97)==0x97))
		{ 
		 if(t<50)
		 {
		 send_data(0x10,table[0]|0x10);
    	 send_data(0,lcd_buffer[0]);
    	 send_data(12,lcd_buffer[6]);
		 }
		 if(t>50)
		 {
		 send_data(0x10,0);
    	 send_data(0,0);
    	 send_data(12,0);
		 }
		}
		 EEPROMwrite(0x02,guest_id);
		 EEPROMwrite(0x03,host_id);
		}
      }
	 }
	i=guest_id/10;
	j=guest_id-10*i;
	lcd_buffer[0]=table[i];
	lcd_buffer[6]=table[j];
	send_data(0x10,table[0]|0x10);
    send_data(0,lcd_buffer[0]);
    send_data(12,lcd_buffer[6]);
	
	work_state();
    rece_state();
	
	for(i=0;i<100;i++)
	{		
		ques[i]=0;
		n_ques[i]=0;
		ans[i]=0;
	}
	d=0xF0;

 while(1)
 {
  n_num=0;
  if(t==1)
  {
    i=receive();
	if(i)
  	for(j=0;j<11;j++)
  	d^=data[j];
	
	if(d==data[11])
	{
	 if(data[4]==guest_id||data[4]>80||data[4]==0)
	 {
	
	 if(data[6]==temp)//
	 goto B;
	 
	 else
	 {
	   temp=data[6];
	   	//key_flag=0;
	  switch(data[7])
	  {
	   case 0x22: lcd_buffer[1]=0x90;
				  lcd_buffer[11]=0x10;
				  lcd_buffer[15]=0x10;
		
				  send_data(0x16,lcd_buffer[11]);
	  			  send_data(0x02,lcd_buffer[1]);
	  			  send_data(0x1e,lcd_buffer[15]);
		
	  			  ques_num=data[8];
				  ques_id=ques_num;
				  break;
	   case 0xDA: score=data[8];
				  key_flag=0;
				  i=score/100;
				  j=(score-i*100)/10;
				  k=score-i*100-j*10;
				  if(i==1)
		 		  	lcd_buffer[3]=table[j]|0x10;
				  else
		 		    lcd_buffer[3]=table[j];
				  lcd_buffer[13]=table[k]|0x10;
				  send_data(6,lcd_buffer[3]);
				  send_data(26,lcd_buffer[13]);
				  break;
	   deflaut:   break;
	  }
   	 
	  }
     }
    
	}
	}
A:   if((data[4]==0xFE||data[4]==0xDB)&&data[ques_num+5]==0xDB)// //it is the answer
		{
	 	key_flag=0;
		lcd_buffer[9]=0x40;
	  	for(i=0;i<ques_num;i++)
	  	ans[i]=data[i+5];
	  	
	 	}
		

	if(ans[ques_id-1]&0x01)
	    lcd_buffer[9]|=0x04;
	  else
	  	lcd_buffer[9]&=0xfb;	
	if(ans[ques_id-1]&0x02)
	    lcd_buffer[9]|=0x08;
	  else
	  	lcd_buffer[9]&=0xf7;	
	if(ans[ques_id-1]&0x04)
	    lcd_buffer[1]|=0x20;
	  else
	  	lcd_buffer[1]&=0xdf;	
	if(ans[ques_id-1]&0x08)
	    lcd_buffer[1]|=0x40;
	  else
	  	lcd_buffer[1]&=0xbf;	
	if(ans[ques_id-1]&0x10)
	    lcd_buffer[1]|=0x04;
	  else
	  	lcd_buffer[1]&=0xfb;	
			
	send_data(2,lcd_buffer[1]);
	send_data(18,lcd_buffer[9]);

	if(ques_num!=0)//&&key_flag==1
   {
	 j=0;
   	for(k=0;k<ques_num;k++)
	{
	 if(ques[k]==0)
	 {
	  n_ques[j]=k+1;
	  j++;
	  n_num++;
	 }
	}
	i=n_num/100;
	j=(n_num-i*100)/10;
	k=n_num-i*100-j*10;
	lcd_buffer[12]|=0x40;
	if(i==1)
	 lcd_buffer[2]=table[k]|0x10;
	else
	 lcd_buffer[2]=table[k]&0xef;
	lcd_buffer[10]=table[j];
	send_data(4,lcd_buffer[2]);
	send_data(20,lcd_buffer[10]);
	send_data(24,lcd_buffer[12]);
	  
	 key=key_scan();
	 if(key==9||key==6)
	 {
	  if(key==9)
	  ques_id++;
	  if(ques_id>ques_num)
	  ques_id=1;
	  if(key==6)
	  ques_id--;
	  if(ques_id<1)
	  ques_id=ques_num;
	  
	  //ques_id
	  if(ques[ques_id-1]&0x01)
	    lcd_buffer[9]|=0x02;
	  else
	  	lcd_buffer[9]&=0xfd;	
	  if(ques[ques_id-1]&0x02)
		lcd_buffer[1]|=0x02;
	  else
	  	lcd_buffer[1]&=0xfd;
	  if(ques[ques_id-1]&0x04)
		lcd_buffer[12]|=0x20;
	  else
	  	lcd_buffer[12]&=0xdf;
	  if(ques[ques_id-1]&0x08)
		lcd_buffer[12]|=0x02;
	  else
	  	lcd_buffer[12]&=0xfd;	
	  if(ques[ques_id-1]&0x10)
		lcd_buffer[4]|=0x20;
      else
	  	lcd_buffer[4]&=0xdf;
	  
	  send_data(2,lcd_buffer[1]);
	  send_data(8,lcd_buffer[4]);
	  send_data(18,lcd_buffer[9]);
	  send_data(24,lcd_buffer[12]);
	  //send_data(14,lcd_buffer[7]);
	 // send_data(30,lcd_buffer[15]);
	 }
	 
  	 if((key==1||key==4||key==5||key==7||key==8)&&(key_flag==1))
  	 { 
      if(ques[ques_id-1]&0x01)
	    keya_flag=1;
	  else
	  	keya_flag=0;	
	  if(ques[ques_id-1]&0x02)
		keyb_flag=1;
	  else
	  	keyb_flag=0;	
	  if(ques[ques_id-1]&0x04)
		keyc_flag=1;
	  else
	  	keyc_flag=0;
	  if(ques[ques_id-1]&0x08)
		keyd_flag=1;
	  else
	  	keyd_flag=0;	
	  if(ques[ques_id-1]&0x10)
		keye_flag=1;
	  else
	  	keye_flag=0;
			
	 switch(key)
	 {
	  case 7:  ++keya_flag;
	 	       if(keya_flag>1)		  
			     keya_flag=0;
			   break;
	  case 4:  ++keyb_flag;
	 	   	   if(keyb_flag>1)		  
			     keyb_flag=0;
			   break;
	  case 1:  ++keyc_flag;
	 	  	   if(keyc_flag>1)		  
			     keyc_flag=0;
			    break;
	  case 8:  ++keyd_flag;
	 	  	   if(keyd_flag>1)		  
			     keyd_flag=0;
			   break;
	  case 5:  ++keye_flag;
	 	  	   if(keye_flag>1)		  
			     keye_flag=0;
			   break;
	 default:  break;
	 }
	
	ques[ques_id-1]=(keya_flag|(keyb_flag<<1)|(keyc_flag<<2)|(keyd_flag<<3)|(keye_flag<<4));
	
	if(keya_flag==1)
			     lcd_buffer[9]|=0x02;
	else
	  		     lcd_buffer[9]&=0xfd;
	 if(keyb_flag==1)
			     lcd_buffer[1]|=0x02;
	  		   else
	  		     lcd_buffer[1]&=0xfd; 
	if(keyc_flag==1)
			     lcd_buffer[12]|=0x20;
	  		   else
	  		     lcd_buffer[12]&=0xdf;
	if(keyd_flag==1)
			     lcd_buffer[12]|=0x02;
	  		   else
	  		     lcd_buffer[12]&=0xfd;
	if(keye_flag==1)
			     lcd_buffer[4]|=0x20;
      		   else
	  		     lcd_buffer[4]&=0xdf;
	
	send_data(2,lcd_buffer[1]);
	send_data(8,lcd_buffer[4]);
	send_data(18,lcd_buffer[9]);
	send_data(24,lcd_buffer[12]);
	}
   if(key==3)
   {
   	lcd_buffer[1]&=0xfd;
	lcd_buffer[4]&=0x1f;
	lcd_buffer[9]&=0xfd;
	lcd_buffer[12]&=0x59;
	
	send_data(2,lcd_buffer[1]);
	send_data(8,lcd_buffer[4]);
	send_data(18,lcd_buffer[9]);
	send_data(24,lcd_buffer[12]);
	
	nques_id++;
	if(nques_id>n_num)
	nques_id=1;
	ques_id=n_ques[nques_id-1];
	
   }
   	i=ques_id/100;
	j=(ques_id-i*100)/10;
	k=ques_id-i*100-j*10;
	if(i)
	  lcd_buffer[7]=table[j]|0x10;
	else
	  lcd_buffer[7]=table[j];
	lcd_buffer[15]=table[k]|0x10;
	
	send_data(14,lcd_buffer[7]);
    send_data(30,lcd_buffer[15]);
B: i=receive();
   if(i)
   {
   	if(data[7]==0x88)//||data[4]==guest_id
	  {
	   key=0;
	   lcd_buffer[10]&=0xEF;
	   lcd_buffer[1]&=0xFE;
	   lcd_buffer[14]=0x00;
	   lcd_buffer[12]=(lcd_buffer[12]&0x6B)|0x01;
	   
	   send_data(2,lcd_buffer[1]);
	   send_data(24,lcd_buffer[12]);
	   send_data(20,lcd_buffer[10]);
	   send_data(28,lcd_buffer[14]);
	  }
	}
   if(key==2) 
   {
// B:	t=2;
    lcd_buffer[0]|=0x10;
	lcd_buffer[10]|=0x10;
	lcd_buffer[12]|=0x18;
	send_data(0,lcd_buffer[0]);
	send_data(20,lcd_buffer[10]);
	send_data(24,lcd_buffer[12]);
	//i=receive();
	//if(i)
//	while(data[7]!=0x88)
//	{
	//i=receive();
	//if(i)
	//{
	work_state();
	send_state();
	delay_ms(3);
//	delay_us(250);
	sendchar(0x00);
	send_answer();
	sendchar(0x00);
	sendchar(0x00);

	//}
	work_state();
	rece_state();
//	delay_us(250);
//	delay_us(250);
	delay_ms(1);
	//if(t1>200) break;
	
	if(t>=2&&t<33)
	{
	 lcd_buffer[1]|=0x01;
	 lcd_buffer[14]=0x00;
	 send_data(2,lcd_buffer[1]);
	 send_data(28,lcd_buffer[14]);
	}
	if(t>=33&&t<75)
	{
	 lcd_buffer[14]=0x10;
	 lcd_buffer[1]&=0xFE;
	 send_data(28,lcd_buffer[14]);
	 send_data(2,lcd_buffer[1]);
	}
	if(t>=75&&t<100)
	{
	lcd_buffer[14]=0x01;
	lcd_buffer[1]&=0xFE;
	send_data(2,lcd_buffer[1]);
	send_data(28,lcd_buffer[14]);
	}
	goto B;

//	i=receive();

	//if(i)
/*    
	while(i!=0x0F||data[0]!=0xF0)
	{
	 i=getchar();
	 data[0]=getchar();
	}
     for(j=1;j<12;j++)
	 data[j]=getchar();  
  	
	for(j=0;j<11;j++)
  	d^=data[j];      */
	//if(d==data[11])
	//{
	/* 	if(data[7]==0x88)//||data[4]==guest_id
	  {
	  
	   lcd_buffer[10]&=0xEF;
	   lcd_buffer[1]&=0xFE;
	   lcd_buffer[14]=0x00;
	   lcd_buffer[12]=(lcd_buffer[12]&0x6B)|0x01;
	   
	   send_data(2,lcd_buffer[1]);
	   send_data(24,lcd_buffer[12]);
	   send_data(20,lcd_buffer[10]);
	   send_data(28,lcd_buffer[14]);
	  }
	 */ 
	
//	}
   }
  } 
  if(t==0)
  {
   while(!(ADCSRA&0x10));
  	 adc_l=ADCL;
  	 adc_h=(ADCH&0x03);
     ADMUX=0xC3;// value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
 	 ADCSRA|=(1<<ADSC);
 	 adc_rel=(((adc_h<<8)&0xff00)|adc_l);
  	 lcd_buffer[4]&=0xF0;
  	 if(adc_old!=adc_rel)
   	 adc_old=adc_rel;
  	 if(adc_old>0)
	 lcd_buffer[4]|=0x01;
  	 if(adc_old>0x0100&&adc_old<0x0230)
	 lcd_buffer[4]|=0x05;
  	 if(adc_old>0x0230&&adc_old<0x0244)
   	 lcd_buffer[4]|=0x0D;
  	 if(adc_old>0x0244)
	 lcd_buffer[4]|=0x0F;
   	 send_data(0x08,lcd_buffer[4]);
   }
   //EEPROMwrite(0x04,temp);
   //EEPROMwrite(0x05,ques_num);
   //EEPROMwrite(0x06,score);
   //for(i=0;i<100;i++)
   //{
   // EEPROMwrite((i+7),ques[i]);
  // } 
  //for(i=0;i<100;i++)
   //{
   // EEPROMwrite((i+107),ans[i]);
  // } 
  //}
 }
}

⌨️ 快捷键说明

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