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

📄 driver.c

📁 用avr mega128读取spi串行字库
💻 C
📖 第 1 页 / 共 5 页
字号:
	//stop errant interrupts until set up
	CLI(); //disable all interrupts
	XDIV   = 0x00; //xtal divider
	//XMCRA  = 0x00; //external memory
	//XMCRB  = 0x00;
	//SFIOR |= 0x04;	//加上拉电阻	
	PORT_INITIALIZE();
	TIMER1_INITIALIZE();
	UART0_INITIALIZE();//jakegao
	UART1_INITIALIZE();
	
	//MCUCR = 0x80;
	EICRA = 0x03; //extended ext ints,上升延触发
	EICRB = 0x00; //extended ext ints
	EIMSK = 0x01;
	TIMSK = 0x04; //timer interrupt sources
	ETIMSK = 0x00; //extended timer interrupt sources
	SEI(); //re-enable interrupts
	//all peripherals are now initialised
	SEND_COM1_AT((const unsigned char *)MCU_INIT_RUN,sizeof(MCU_INIT_RUN) );

}
//***************************************************************
//IO端口设置
//***************************************************************
void PORT_INITIALIZE(void)								
{
	MCUCSR|=0x80;
	TWCR &=~ 0x02;									//关闭PORTD第二功能的TWI输出 	
	DDRA=0xff;                                                                      //设置PORTA为输出
	PORTA=0xFF;
	//MCUCR&=~0x80;                             //禁止a口第二功能的使能	
	DDRB  = 0xB7;									//设置PORTB为输出(PB6设置为输入用来监测红外信号)
	PORTB = 0xEF;
	
	DDRC=0x07;                                                                     //设置PORTC(0\1\2)为输出(3/4/5/6/7)为输入
	PORTC=0xFF;
	
	DDRD  = 0xFF;									//设置PORTD为输出
	PORTD = 0xFF;

	DDRE  = 0xFF;									//设置PORTE为输出
	PORTE = 0xFF;
	
	DDRF=0xFF;                                                                       //设置PORTF为输出
	PORTF=0xFF;
  // MCUCR|=0X80;   //enable ex_ram. 
   //XMCRA=0b00001110; 
   //XMCRB=0b10000000; 


}
//*************************************************************
//计时器设置
//*************************************************************
void TIMER1_INITIALIZE(void)								
{
	TCCR1B = 0x00; //stop
	//TCNT1H = 0xE0; //setup 1ms定时
	//TCNT1L = 0xC0;
	TCNT1H=0xFC;     //100uS定时    
	TCNT1L=0xE0;	
	OCR1AH = 0x1F;
	OCR1AL = 0x40;
	OCR1BH = 0x1F;
	OCR1BL = 0x40;
	OCR1CH = 0x1F;
	OCR1CL = 0x40;
	ICR1H  = 0x1F;
	ICR1L  = 0x40;
	TCCR1A = 0x00;
	TCCR1B = 0x01; //start Timer
}

//*****************************************************************
//参数初始化
//*****************************************************************
void PARAMETER_INITIALIZE(void)
{
	voice_flag=EEPROM_READ(17);                     //读取按键音标志
}
//**********************************************定时器******************************************************//

//************************************************************
//100us定时中断
//************************************************************
void TIMER1_OVF_ISR(void)	
{
	//TIMER1 has overflowed
	//TCNT1H = 0xE0; //reload counter high value  1MS定时
	//TCNT1L = 0xC0; //reload counter low value
	TCNT1H=0xFC;     //100uS定时    
	TCNT1L=0xE0;
	time++;					//100uS增加一次记数
	debug_time++;
	logo_change_time++;
	wireless_time++;
	TEST_COUNT++;
	clock_count++;
	wait_count_time++;
	//if(PORTB&BEER)
	//{
		//PORTB&=~BEER;
	//}
	//else
	//{
	//	PORTB|=BEER;
	//}
	if(passward_set_flag==1)
	{
		passward_set_time++;
		if(passward_set_time>30000)
		{
			passward_set_flag=0;
			lcd_status=0;
		}
	}
	if(clock_count>=10000)  //计时一秒时间到
	{
		clock_count=0;
		if(wait_count_flag!=0)
		{
			if(wait_count_time>40000)
			{
				lcd_status=0;
				wait_count_flag=0;
				wait_count_time=0;
			}
			else if (wait_count_time>30000)
			{
				lcd_status=32;
				wait_count_flag=4;
			}
			else if (wait_count_time>20000)
			{
				lcd_status=32;
				wait_count_flag=3;
			}
			else if (wait_count_time>10000)
			{
				lcd_status=32;
				wait_count_flag=2;
			}
		}
		second++;
		if(second>=60)
		{
			second=0;
			minute++;
		}
		if(minute>=60)
		{
			minute=0;
			hour++;
		}
		if(hour>=24)
		{
			hour=0;
		}
	}
	if(lcd_lamp_count_flag!=0)
	{
		lcd_lamp_time++;
	}
	if((TEST_COUNT>1000)&&(PORTB&BEER))
	{
		//PORTA&=~LAMP_LCD;
		TEST_COUNT=0;
		//SEND_COM1_AT((const unsigned char *)TIME_COUNT_WORK,sizeof(TIME_COUNT_WORK) );
	}
	else if((TEST_COUNT>20000)&&((PORTB&BEER)==0))
	{ 
		//PORTA|=LAMP_LCD;
		TEST_COUNT=0;
	}
}
//********************************************红外接收器驱动*********************************************//

//***********************************************
//对红外信号的监测
//监测端口低电平持续9ms,高电平持续4.5ms后方进入数据接收状态
//return: wireless_key_value ,得到此值后应立即清零
//***********************************************
void TEST_WIRELESS_SINGLE(void)
{
	unsigned char i;
	if(wireless_test_step==0)
	{
		if(PINB&TELEC)
		{
			wireless_time=0;
		}
		else
		{
				wireless_test_step=1;
		}
	}
	else if(wireless_test_step==1)
	{
		if(PINB&TELEC)
		{
			//i=wireless_time;
					//SEND_COM1_BYTE('1');
					//SEND_COM1_BYTE(':');
					//SEND_COM1_BYTE(ASCII(i/10));
					//SEND_COM1_BYTE(ASCII(i%10));
					//SEND_COM1_BYTE(0X0D);
					//SEND_COM1_BYTE(0X0A);
				if((wireless_time>80)&&(wireless_time<100))//在9ms波动范围以内
				{
					//SEND_COM1_BYTE('E');
					//SEND_COM1_BYTE('N');
					//SEND_COM1_BYTE('T');
					//SEND_COM1_BYTE('E');
					//SEND_COM1_BYTE('R');
					//SEND_COM1_BYTE('2');
					//SEND_COM1_BYTE(0X0D);
					//SEND_COM1_BYTE(0X0A);
					wireless_time=0;
					wireless_test_step=2;
				}
				else
				{
					wireless_time=0;
					wireless_test_step=0;
				}
		}
		else 
		{
		}
	}
	else if(wireless_test_step==2)
	{
		if(PINB&TELEC)
		{
		}
		else 
		{
			//i=wireless_time;
			//SEND_COM1_BYTE('2');
			//SEND_COM1_BYTE(':');
			//SEND_COM1_BYTE(ASCII(i/10));
			//SEND_COM1_BYTE(ASCII(i%10));
			//SEND_COM1_BYTE(0X0D);
			//SEND_COM1_BYTE(0X0A);
				if((wireless_time>35)&&(wireless_time<55))//在4.5ms波动范围内
				{
					wireless_time=0;
					wireless_test_step=3;    //开始接收数据
				}
				else
				{
					wireless_time=0;
					wireless_test_step=0;
				}
		}
	}
	while((wireless_test_step==3)||(wireless_test_step==4))
	{
		if(wireless_test_step==3)
		{
			if(PINB&TELEC)
			{
				wireless_test_step=4;
			}
			else if(wireless_time>10)   //低电平的时间超过1ms(正常为0.56ms)
			{
				wireless_time=0;
				wireless_test_step=0;
				wireless_byte_count=0;
				wireless_custom_code_1=0;
				wireless_custom_code_2=0;
				wireless_data_code_1=0;
				wireless_data_code_2=0;
			}
		}
		else if(wireless_test_step==4)
		{
			if(PINB&TELEC)
			{
				if(wireless_time>25)  //高电平时间超过2.5ms(正常为1.69ms)>25jakegao
				{
					wireless_time=0;
					wireless_test_step=0;
					wireless_byte_count=0;
					wireless_custom_code_1=0;
					wireless_custom_code_2=0;
					wireless_data_code_1=0;
					wireless_data_code_2=0;
				}
			}
			else
			{
					if((wireless_time>8)&&(wireless_time<14))   //1.125ms低电平  8-14
					{
						if(wireless_byte_count<=7)
						{
							wireless_custom_code_1&=~(1<<wireless_byte_count);
							wireless_byte_count++;
							wireless_test_step=3;
							wireless_time=0;
						}
						else if((wireless_byte_count>7)&&(wireless_byte_count<=15))
						{
							wireless_custom_code_2&=~(1<<(wireless_byte_count-8));
							wireless_byte_count++;
							wireless_test_step=3;
							wireless_time=0;
						}
						else if((wireless_byte_count>15)&&(wireless_byte_count<=23))
						{
							wireless_data_code_1&=~(1<<(wireless_byte_count-16));
							wireless_byte_count++;
							wireless_test_step=3;
							wireless_time=0;
						}
						else if((wireless_byte_count>23)&&(wireless_byte_count<=31))
						{
							wireless_data_code_2&=~(1<<(wireless_byte_count-24));
							wireless_byte_count++;
							wireless_test_step=3;
							wireless_time=0;
						}
						else
						{
							wireless_time=0;
							wireless_test_step=0;
							wireless_byte_count=0;
							wireless_custom_code_1=0;
							wireless_custom_code_2=0;
							wireless_data_code_1=0;
							wireless_data_code_2=0;					
						}
						if(wireless_byte_count==32)
						{
							wireless_time=0;
							wireless_test_step=0;
							wireless_byte_count=0;
							if((wireless_custom_code_1==0x00)&&(wireless_custom_code_2==0xFF))
							{
								wireless_key_value=wireless_data_code_1;
								lcd_lamp_time=0;         //背光灯亮的时间计时
								lcd_lamp_count_flag=1;    //开始计时
								PORTA&=~LAMP_LCD;
							}
							wireless_custom_code_1=0;
							wireless_custom_code_2=0;
							wireless_data_code_1=0;
							wireless_data_code_2=0;	
											
						}
					}
					else if((wireless_time>18)&&(wireless_time<26))//2.25ms高电平 18-26
					{
						if(wireless_byte_count<=7)
						{
							wireless_custom_code_1|=(1<<wireless_byte_count);
							wireless_byte_count++;
							wireless_test_step=3;
							wireless_time=0;
						}
						else if((wireless_byte_count>7)&&(wireless_byte_count<=15))
						{
							wireless_custom_code_2|=(1<<(wireless_byte_count-8));
							wireless_byte_count++;
							wireless_test_step=3;
							wireless_time=0;
						}
						else if((wireless_byte_count>15)&&(wireless_byte_count<=23))
						{
							wireless_data_code_1|=(1<<(wireless_byte_count-16));
							wireless_byte_count++;
							wireless_test_step=3;
							wireless_time=0;
						}
						else if((wireless_byte_count>23)&&(wireless_byte_count<=31))
						{
							wireless_data_code_2|=(1<<(wireless_byte_count-24));
							wireless_byte_count++;
							wireless_test_step=3;
							wireless_time=0;
						}
						else
						{
							wireless_time=0;
							wireless_test_step=0;
							wireless_byte_count=0;
							wireless_custom_code_1=0;
							wireless_custom_code_2=0;
							wireless_data_code_1=0;
							wireless_data_code_2=0;					
						}
						if(wireless_byte_count==32)
						{
							wireless_time=0;
							wireless_test_step=0;
							wireless_byte_count=0;
							if((wireless_custom_code_1==0x00)&&(wireless_custom_code_2==0xFF))
							{
								wireless_key_value=wireless_data_code_1;
								lcd_lamp_time=0;         //背光灯亮的时间计时
								lcd_lamp_count_flag=1;    //开始计时
								PORTA&=~LAMP_LCD;
							}
							wireless_custom_code_1=0;
							wireless_custom_code_2=0;
							wireless_data_code_1=0;
							wireless_data_code_2=0;					
						}				
					}
					else
					{
						wireless_time=0;
						wireless_test_step=0;
						wireless_byte_count=0;
						wireless_custom_code_1=0;
						wireless_custom_code_2=0;
						wireless_data_code_1=0;
						wireless_data_code_2=0;	
					}
			}
		}
	}
	
}

//********************************************按键扫描函数(做按键释放检查)********************************//

//********************************************************
//按键扫描-不带按键释放检查
//********************************************************
unsigned char SCAN_KEY(void)
{
	unsigned char i,temp;
	DDRC=0x07;                                                                     //设置PORTC(0\1\2)为输出(3/4/5/6/7)为输入
	PORTC=0xFF;
	for(i=0;i<3;i++)
	{
		PORTC=~(1<<i);       //键盘线扫描
		DELAY_TIME(10);       //等待低电平稳定
		temp=PINC&0xf8;      //读取键盘扫描信号,屏蔽低三位
		if(temp!=0xf8)       //如果有键按下,延时10ms消抖
		{
			DELAY_TIME(1000);   //延时100ms消抖
			temp=PINC&0xf8;    //再读键盘
			if(temp!=0xf8)
			{
				temp&=0xf8;
			}
			switch(temp)
			{
				case 0xb8: 
				{
					temp=11-(2-i)*4;//10111000
					break;
				}
				case 0xd8:
				{
					temp=10-(2-i)*4;//11011000
					break;
				}
				case 0xe8:
				{
					temp=9-(2-i)*4;//11101000
					break;
				}
				case 0xf0:
				{
					temp=8-(2-i)*4;//11110000
					break;
				}
				default:
				{
					temp=0x7f;
					break;
				}
				//return temp;
			}
			return temp;
		}
		PORTC=0xff;
	}
	return 0x7f;
}
//******************************************************************

⌨️ 快捷键说明

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