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

📄 pt6911chmodelok.c

📁 通过AVR atmega128控制LCD模块显示频率。而且频率把旋转编码器的信号通过采集
💻 C
📖 第 1 页 / 共 5 页
字号:
************************************************************************************************/

void Caiji_shuju(void)
{
	uint8_t n0,n1,n2,n3,n4,n5;
	Switch_in1=PINF;
	Switch_in1=Switch_in1&0x03;
	DelayMs(5);
	Switch_in2=PINF;
	Switch_in2=Switch_in2&0x03;
	if((Switch_in1==Switch_in2)&&(Switch_in1!=0))
	{
		Switch_in=Switch_in1;
		//Switch_Enable=Switch_in1;			//为后面3个显示的3个模式做准备是否有按键按下。
	}
	if(Switch_in==0x02)			//F0 is low
	{
		for(n3=0;n3<=100;n3++)
		{
			Switch_in=PINF;
			Switch_in=Switch_in&0x03;
			if(Switch_in==0x01)			//f1 is low
			{
				for(n4=0;n4<=100;n4++)
				{
					Switch_in=PINF;
					Switch_in=Switch_in&0x01;
					if(Switch_in==1)		//f0 is high
					{
						for(n5=0;n5<=100;n5++)
						{
							Switch_in=PINF;
							Switch_in=Switch_in&0x02;
							if(Switch_in==0x02)
							{	
								Caiji_shuju_flag=1;             //表示顺时针转动
								n5=100,	n4=100,	n3=100;
							}
							if(n5==90)
							n5=0;	
						}
					}
					if(n4==90)
					n4=0;
				}
			}
			if(n3==90)
			n3=0;
		}
	}
	if(Switch_in==0x01)			//F1 is low
	{
		for(n0=0;n0<=100;n0++)
		{
			Switch_in=PINF;
			Switch_in=Switch_in&0x03;
			if(Switch_in=0x02)			//f0 is low
			{
				for(n1=0;n1<=100;n1++)
				{
					Switch_in=PINF;
					Switch_in=Switch_in&0x02;
					if(Switch_in==0x02)		//f1 is high
					{
						for(n2=0;n2<=100;n2++)
						{
							Switch_in=PINF;
							Switch_in=Switch_in&0x01;
							if(Switch_in==1)
							{	
								Caiji_shuju_flag=2;  //表示逆时针转动
								n2=100,n1=100,n0=100;
							}
							if(n2==90)
							n2=0;
						}
					}
					if(n1==90)
					n1=0;
				}
			}
			if(n0==90)
			n2=0;
		}
	}
	if((Caiji_shuju_flag!=1)&&(Caiji_shuju_flag!=2))
	{
		Caiji_shuju_flag=0;
	}
}

/************************************************************************************************

									显示8.33KHZ频率

************************************************************************************************/
void Display_Fre_jisuan(void)
{
	uint16_t hundred,ten,ge,Temp1,Fre2;
	float Fre,Temp,Temp0;
	uint32_t  Fre1,Temp2;

	if(Caiji_shuju_flag==1)
	{
		Freq_Count++;
		if(Freq_Count>=2279)
		Freq_Count=0;	
	}
	if(Caiji_shuju_flag==2)
	{
		Freq_Count--;
		if(Freq_Count==0)
		Freq_Count=2278;	
	}	
	if(Caiji_shuju_flag==0)
	{
		Freq_Count=Freq_Count;
	}	
	
			//频率显示次数计数
			//第6种模式频率通道计数是25KHZ还是8.33KHZ
			//LCD_Display(Display_RESET,1);
	Temp=Freq_Count;
	Fre = Temp*8.33/1000+118;					//frequency conversion to n*25;120.475		118.04998
	Fre1 = Fre;						//count the float number.120	小数变整数		118
	Fre2 = Fre1;					//count the int number.	0.04998
	Fre = Fre - Fre1;
	Fre *= 100000;					//4749.9849			4998
	Fre1 = Fre;			//4749
	//Temp3=Fre1/10;
	Temp1=Fre1/10 % 10;
	Temp2=Fre1/100;
	if(((Temp1==9)||(Temp1==8)||(Temp1==7))&&(Freq_Count%3==0))
	{
		Fre1=(Temp2+1)*100;
	}
	Temp1 = Fre1 % 10;				//9
	Temp1=Fre1/100;
	Temp0=Temp1;
	Temp2=Temp0/10;
	Temp1=Temp1%10;
	if(Temp1==5) 
	{
		Temp1 += 5;					//4759
	}
	if(Temp1==8) 
	{
		Temp1 += 2;					//4759
	}

	if((Temp1==0)||(Temp1==3)||(Temp1==6))
	{
		Temp1=5;
	}
	if(Temp1==1)
	{
		Temp1=0;
	}
	Fre1=Temp2*10+Temp1;

	//Fre1 -= Temp1;					//4750
	//Fre1 /= 10;						//475
	hundred = Fre1 / 100;			//4	
	ten = (Fre1 % 100)/10;			//7
	ge = (Fre1 % 100) % 10;		//5
	hundred &= 0x0F;				//4
	hundred |= 0x30;				//52
	ten &= 0x0F;					//7
	ten |= 0x30;					//55
	ge &= 0x0F;						//5	
	ge |= 0x30;						//53
	
	Display_Frequency_Data[5] = hundred;
	Display_Frequency_Data[6] = ten;
	Display_Frequency_Data[7] = ge;
	//	ge0=ge;
	hundred = Fre2 / 100;				
	ten = (Fre2 % 100)/10;
	ge = (Fre2 % 100) % 10;
	
	hundred &= 0x0F;
	hundred |= 0x30;
	
	ten &= 0x0F;
	ten |= 0x30;
	ge &= 0x0F;
	ge |= 0x30;
	
	Display_Frequency_Data[0] = 0x20;
	Display_Frequency_Data[1] = hundred;
	Display_Frequency_Data[2] = ten;
	Display_Frequency_Data[3] = ge;
}


/************************************************************************************************

									显示通道数目

************************************************************************************************/
void Display_Channel_jisuan(void)
{
	uint8_t hundred,ten,ge,Channel2;

	/*if(Caiji_shuju_flag==1)
	{
		Channel_Count++;
		if(Channel_Count>=100)
		Channel_Count=0;	
	}
	if(Caiji_shuju_flag==2)
	{
		Channel_Count--;
		if(Channel_Count==0)
		Channel_Count=99;	
	}	
	if(Caiji_shuju_flag==0)
	{
		Channel_Count=Channel_Count;
	}	*/

	Channel2 = Channel_Count;
	ten = Channel2 /10;
	ge = Channel2 % 10;
	hundred &= 0x0F;
	hundred |= 0x30;
	ten &= 0x0F;
	ten |= 0x30;
	ge &= 0x0F;
	ge |= 0x30;
	Display_Channel_Data[6] = ten;
	Display_Channel_Data[7] = ge;
	Display_Channel_Data[0] = 0x20;
	Display_Channel_Data[1] = 0x20;
	Display_Channel_Data[2] = 0x20;
	Display_Channel_Data[3] = 0x20;
	Display_Channel_Data[4] = 0x43;
	Display_Channel_Data[5] = 0x48;
}

/*************************************************************************************************



**************************************************************************************************/

void Task_In(void)
{
	if(Task_Rear < 20)
	{
		Task_Lock = 0;
		Task_Buff[Task_Rear] = Task_No;
		Task_Lock = 1;
		Task_Rear++;
	}
	if(Task_Rear >= 20)
	{
		Task_Rear = 0;
	}
//	USART_Transmit(Task_Rear);
//	USART_Transmit(Task_Buff[Task_Rear-1]);
}

uint8_t Task_Out(void)
{
	uint8_t Task_Select=0;
	if(Task_Lock == 1)		//enable to read the task number.
	{
		if(Task_Buff[Task_Front] != 0)
		{
			Task_Select = Task_Buff[Task_Front];
			Task_Buff[Task_Front] = 0;
			Task_Front++;
		}
//		USART_Transmit(Task_Front);
//		USART_Transmit(Task_Buff[Task_Front-1]);
		if((Task_Front > Task_Rear)||(Task_Front >= 20))
		{
			Task_Front = 0;
			Task_Rear = 0;
		}
		return (Task_Select);
	}
	return 0;
}
/*************************************************************************************************



**************************************************************************************************/

void Delete_All_Save(void)
{
	LCD_Write(0x01,0);
	DelayMs(1000);						//清频显示空白在显示RESET/SET
	//if(Time_1Minute_Flag!=1)
	//{
	
		LCD_Write(0x01,0);
		PORTE|=_BV(PE3);
		DelayMs(300);
		LCD_Display(Display_SET,1);
		DelayMs(300);
		PORTE&=!_BV(PE3);
		LCD_Write(0x01,0);
		LCD_Display(Display_RESET,1);
		LCD_Display(Display_0,2);

	//}	
}

/**************************************************************************************************

把2个8位的数组变成一个16位的数组,把采集到的数组保存到EEPROM中,共100个数据占地址100*32=3200
是C80,最后一个地址的开头是3168,
此3种模式不分开,按键反映不灵敏,导致数据互相错位,保存会黑屏。而且3种模式连续相应不好。
**************************************************************************************************/
void Display_Eeprom0_address(unsigned int First_Value)
{
	j=0;													//累加器清0
	for(k1=First_Value;k1<=32;k1++)
	{
		eeprom_is_ready();
		eeprom_busy_wait(); 
		Temp_Fre_Channel_Place[j]=eeprom_read_word(k1);

		j++;
	}
		j=0;
		for(i=0;i<=15;i++)
		{	
			if(i<=7)
			{
				Display_Str2[i]=Temp_Fre_Channel_Place[i];		//显示通道
			}
			if(i>=8)
			{
				Display_Str0[j]=Temp_Fre_Channel_Place[i];		//显示频率
				j++;
			}
		}

		LCD_Display(Display_Str0,1);		//第一行显示频率
		Display_Str2[1]=0x20;
		Display_Str2[2]=0x20;
		Display_Str2[3]=0x20;
		LCD_Display(Display_Str2,2);		//第二行显示通道

}


void Save_Channel_Model(void)
{

	k=0;
	//把2个8位数组变成一格16位的数组
	for(i=0;i<8;)
	{
		
			Save_Fre_Channel[k]=Display_Channel_Data[i];	//通道在Save_Fre_Channel数组的地位
			i++;
			k++;
	}
	for(j=0;j<8;)
	{
		k=8+j;
		Save_Fre_Channel[k]=Display_Ch_Model_Temp_Fre[j];			//通道在Save_Fre_Channel数组的高位
		j++;
	}	
}
void Save_Dir_Model(void)	
{
	k=0;
	//把2个8位数组变成一格16位的数组
	for(i=0;i<8;)
	{
		
			Save_Fre_Channel[k]=Display_Ch_Model_Temp_CH[i];	//通道在Save_Fre_Channel数组的地位
			i++;
			k++;
	}
	for(j=0;j<8;)
	{
		k=8+j;
		Save_Fre_Channel[k]=Display_Dir_Model_Temp_Fre[j];			//通道在Save_Fre_Channel数组的高位
		j++;
	}		
}


void Save_Fre_Model(void)
{
	k=0;
	//把2个8位数组变成一格16位的数组
	for(i=0;i<8;)
	{
		
			Save_Fre_Channel[k]=Display_Channel_Data[i];	//通道在Save_Fre_Channel数组的地位
			i++;
			k++;
	}
	for(j=0;j<8;)
	{
		k=8+j;
		Save_Fre_Channel[k]=Display_Fre_Model_Temp_Fre[j];			//通道在Save_Fre_Channel数组的高位
		j++;
	}
}
/*********************************************************************************************



************************************************************************************************/
/*void Save_to_EEprom_Dir_Model(void)
{
	i=0;
	for(i1=Display_Ch_Model_Temp_Adress;i1<=(15+Display_Ch_Model_Temp_Adress);i1++)
	{
	
		cli();
		eeprom_is_ready();
		eeprom_busy_wait();
		
		eeprom_write_word(i1,Save_Fre_Channel[i]);   // 把此时的数据保存到不为空的那个地址中
		eeprom_is_ready();
		eeprom_busy_wait();
		eeprom_write_word(i,Save_Fre_Channel[i]);    // 并且保存到第一个地址中,保证开机可以找到最后保存的那个数据
		i++;											
		sei();
	}
}*/
//写入EEPROM数据,如果读到EEPROM地址中有连续16个0XFF表示此地址是空的采可以保存数据

void Save_to_EEprom(void)
{
	
	k=0;
	for(i=0;i<8;)
	{
		Save_Fre_Channel[k]=Display_Ch_Model_Temp_CH[i];	//通道在Save_Fre_Channel数组的地位
		i++;
		k++;
	}
	for(j=0;j<8;)
	{
		k=8+j;
		Save_Fre_Channel[k]=Display_Ch_Model_Temp_Fre[j];			//通道在Save_Fre_Channel数组的高位
		j++;
	}	
	
	for(Max_Eprom_Place=160;Max_Eprom_Place<=3168;Max_Eprom_Place+=16)
	{
		j=0;													//累加器清0
		for(k1=Max_Eprom_Place;k1<=(Max_Eprom_Place+15);k1++)
		{
			eeprom_is_ready();
			Temp_Fre_Channel_Place[j]=eeprom_read_word(Max_Eprom_Place);
			if(j==2)
			j1=Temp_Fre_Channel_Place[j];
			j++;
		}	

		if(j1==0x0FF)
		{	
			Temp_Eprom_Place=Max_Eprom_Place;				//读15次不是OXFF那么地址单元加0X10
			Max_Eprom_Place=3168;
		}

	}
	i=0;
	for(i1=Temp_Eprom_Place;i1<=(15+Temp_Eprom_Place);i1++)
	{
	
		cli();
		eeprom_is_ready();
		eeprom_busy_wait();
		
		eeprom_write_word(i1,Save_Fre_Channel[i]);   // 把此时的数据保存到不为空的那个地址中
		//eeprom_is_ready();
		//eeprom_busy_wait();
		eeprom_write_word(i,Save_Fre_Channel[i]);    // 并且保存到第一个地址中,保证开机可以找到最后保存的那个数据
		i++;											
		sei();
	}
}	
void Trans_Fre_Display(void)
{

					j=0;
					for(i=0;i<=7;i++)
					if(i==2)
					j1=Display_Str0[j];
					if(j1==0xFF)
					{
						LCD_Write(0x01,0);
						LCD_Display(Display_Frequency_Data1,1);				//循环显示。第一行显示频率。
						for(i=0;i<=7;i++)
						{
							Temp_Display_use[i]=Display_Frequency_Data1[i];
						}					
					}
					else
					{
						LCD_Write(0x01,0);
						LCD_Display(Display_Str0,1);						//显示频率	di yi hang
						for(i=0;i<=7;i++)
						{
							Temp_Display_use[i]=Display_Str0[i];
						}					
					}
					//j=0;
					//j1=Temp_Display_Fre[j];
					//if(j1==0xFF)
					LCD_Display(Display_Frequency_Data1,2);				//循环显示。第一行显示通道。
						for(i=0;i<=7;i++)
						{
							Temp_Display_stby[i]=Display_Frequency_Data1[i];
						}				
				for(m0=0;m0<=100;m0++)
				{
					m2=0;
					//Display_Fre();
					if(Freq_Count==0)								//
					{
						LCD_Display(Display_Frequency_Data1,2);			//如果没有这2行,第一次显示第一个通道频率118.005
						for(i=0;i<=7;i++)
						{
							Temp_Display_stby[i]=Display_Frequency_Data1[i];
						}	
					}
					else
					{	
						LCD_Display(Display_Frequency_Data,2);	
						for(i=0;i<=7;i++)
						{
							Temp_Display_stby[i]=Display_Frequency_Data[i];
						}					
					}
					DelayMs(10);
					for(m1=0;m1<=100;m1++)												//如果500毫秒没有采集到数据就退出到主程序
					{
						DelayMs(20);
						Switch_in=PINF;
						Switch_in=Switch_in&0x03;
						if(Switch_in==0x03)		//表示没有采集到F口数据
						{
							
							m2++;
						}
						
						if(Switch_in!=0x03)		//表示没有采集到F口数据
						{
							m1=100;
							m2=0;
						}						
						if(m2==100)
							{

⌨️ 快捷键说明

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