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

📄 intctrl.c

📁 一个带收音的功放程序, VFD显示驱动用一个非常实用的方法, 稍加修改即可换成不同的VFD, 功放芯片用M61538
💻 C
字号:
#include "reg52.h"
#include "intrins.h"
#include "..\..\inc\globedef.h"
#include "..\..\inc\intctrl.h"
#include "..\..\inc\keyproc.h"
#include	"..\..\inc\tuner.h"

/*====================================================
外部中断1, 用来接收遥控信号,和Timer0配合使用
====================================================*/
void RemoteInt(void) interrupt 2
{
	WORD IRTimeCount;
	BYTE temp1,temp2;
	IRTimeCount = (WORD)Timer0_CntH*256+(WORD)Timer0_CntL;
	Timer0_CntH =0;
	Timer0_CntL = 0;
	Start_Timer0;
	switch(IrState)
	{
		case  IR_READY:
			IRDataTemp=0;
			IRDataCount=0;
			IrState=IR_HEAD;
			break;
		case  IR_HEAD:
			if((IRTimeCount<IR_HEAD_MAX)&&(IRTimeCount>IR_HEAD_MIN))
			{
				IRDataCount=0;
				IrState=IR_OFFCODE;
				IRDataTemp=0;
				RepCount = 0;
				Current_Remote_In = 0;
			}
			else if((IRTimeCount>IR_REP_MIN) && (IRTimeCount<IR_REP_MAX))
			{
				//是重复信号
#ifdef	IRRepEnable
				if(1 == Current_Remote_In)
				{		
					if( (Remote_value == 18)     //FM/AM 和AUTO_SCAN_KEY复用
						    || (Remote_value == 7)   //STEPR和FB复用

						    || (Remote_value == 8))  //STEPF和FF复用

					{
						FMAM_PRESSED = 1;
						RepCount++;
					}
					if( (Remote_value  == 19)			//IR_KEY_TBL[2] = VOLUME_UP_KEY;
					   ||(Remote_value == 2) 			//IR_KEY_TBL[6] = VOLUME_DOWN_KEY;
					   ||(Remote_value == 12)			//IR_KEY_TBL[5] = BASS_PLUS_KEY;
					   ||(Remote_value == 14))			//IR_KEY_TBL[9] = CENTER_MINUS_KEY;
					   //||(Remote_value == 0x7) )		//IR_KEY_TBL[7] = CENTER_PLUS_KEY;
					{
							//当遥控输入是以上按键时,才有重复功能					
						RepCount++;	
						if(RepCount > 3)
							IR_KeyAct = 1;	//当重复计数值超过设定值时,重复有效
					}
				}
#endif
				IrState = IR_READY;
			}
			else
			{
				//是杂波
				IR_KeyAct = 0;
				IrState = IR_READY;
				Current_Remote_In = 0;
			}
			break;
		case  IR_OFFCODE:
			//地址码检测
			IRDataTemp<<=1;
			if(((IRTimeCount < CODE_1_MAX) && (IRTimeCount > CODE_1_MIN))
				|| ((IRTimeCount < CODE_0_MAX) && (IRTimeCount > CODE_0_MIN)))
			{
				IRDataCount++;
				if((IRTimeCount < CODE_1_MAX) && (IRTimeCount > CODE_1_MIN))
					IRDataTemp |= 0x1;//检测"1
				if(IRDataCount >= 16)
				{
					IRDataCount=0;
					if((IRDataTemp==IR_SYSTEM_CODE))
					{
						//是正确的地址码
						IrState=IR_ADDRESS;
						IRDataTemp=0;	
						
						
					}

					else
					{
						//错误的地址码
						IR_KeyAct=0;
						Current_Remote_In = 0;
						IrState=IR_READY;
					}
				}
			}
			else
			{
				//是杂波
				IR_KeyAct = 0;
				Current_Remote_In = 0;
				IrState = IR_READY;
			}
			break;
		case  IR_ADDRESS:
			//数据码检测
			IRDataTemp>>=1;
			if(((IRTimeCount < CODE_1_MAX)&&(IRTimeCount > CODE_1_MIN)) 
				|| ((IRTimeCount < CODE_0_MAX) && (IRTimeCount > CODE_0_MIN)))
			{
				IRDataCount++;

				if((IRTimeCount < CODE_1_MAX) && (IRTimeCount > CODE_1_MIN))
					IRDataTemp |= 0x8000;	//检测到“1”
			
			    if(IRDataCount >= 16)
				{
					//判断检测到的数据码是否正确
					IRDataCount=0;
					temp1 = (BYTE)(IRDataTemp%256);
					temp2 = (BYTE)(IRDataTemp/256);
					temp2 = ~temp2;
					if(temp1 == temp2)
					{					
						Remote_value = temp1;
						if(Remote_value > 0x1f)
							Remote_value -= 0x20;
						Current_Remote_In = 1;
						if( (Remote_value == 18)     //FM/AM 和AUTO_SCAN_KEY复用
						    || (Remote_value == 7)   //STEPR和FB复用

						    || (Remote_value == 8))  //STEPF和FF复用

							FMAM_PRESSED = 1;
						else
							IR_KeyAct = 1;
					}
					IrState = IR_READY;
					IRDataCount = 0;
				}
		    }
			else
			{
				    //无效键
					IR_KeyAct = 0;
					Current_Remote_In = 0;
					IrState = IR_READY;
		
			}
			break;	
	}
}

/*======================================================
外部中断0, 用来判断CS49326是否有message发送给主控MCU
=======================================================*/
void CS49326Int(void) interrupt 0// using 1
{
	//read CS49326 unsolicited messages
}

/*================================================================
Timer0中断用于遥控按键输入中断的计时
================================================================*/
void TIMER0Int(void) interrupt INT_Timer0
{
	Stop_Timer0;
	IrState = IR_READY;
	Timer0_CntH = 0;
	Timer0_CntL = 0;
	ET0 = 1;
}
/*===================================================================
设置TIMER1为定时中断,每次中断时间为20ms,中断1ms后开始测试滚轮按键,
VFD显示时间长度计时
===================================================================*/
void TIMER1Int(void) interrupt INT_Timer1
{
	Timer1_CntL = 0xE0;
	Timer1_CntH = 0xB1;
	Start_Timer1;
	/*
	if(Volume_Interval > 0)
	{
		Volume_Interval++;
		if(Volume_Interval > 60)
			Volume_Interval = 0;
	}	
	*/
	if(FMAM_PRESSED > 0)
	{

		FMAM_PRESSED++;
		//证明已经没有FM/AM按下,如果按下FMAM_PRESSED=1,
		//按下经过120ms,(NEC最长为108ms) 
		if(FMAM_PRESSED > 8) 
		{    			
			if(RepCount > 5)
			{
				if(Remote_value == 18)//FMAM_KEY
					Remote_value = 28;//AUTO_SCAN_KEY
				else if(Remote_value == 7) //CHANNEL_SETPR_KEY
					Remote_value = 20;//CHANNEL_FB_KEY
				else if(Remote_value == 8) //CHANNEL_SETPF_KEY
					Remote_value = 21;//CHANNEL_FF_KEY
					
			}			
			IR_KeyAct    = 1;
			FMAM_PRESSED = 0;
		}
			
		
	}
	if(TO_MAIN_DISPLAY > 0)
	{
		TO_MAIN_DISPLAY--;
		if((TO_MAIN_DISPLAY % 15) == 0)
		{
			if(FLASH_TEMP == 0)
				FLASH_TEMP = 1;
			else
				FLASH_TEMP = 0;
		}
	}
	
	
	if(Key_Timer >= 1)
	{
		Key_Timer++;	
			
	}
	
	if(Wait_Lock_40ms > 0) 
		Wait_Lock_40ms++;
	
	
}
/*===================================================================
Timer2中断,暂时未用
===================================================================*/
void TIMER2Int(void) interrupt INT_Timer2
{
	TF2 = 0;
	
	if(ReadKey_Timer < 20)
	{
		ReadKey_Timer++;
	}
	
	if(Volume_Control == 1)
	{
		Jog_A_Input = 1;
		Jog_B_Input = 1;
		Jog_A_Buffer <<= 1;
		Jog_B_Buffer <<= 1;
		if(1 == Jog_A_Input)
			Jog_B_Buffer++;
		if(1 == Jog_B_Input)
			Jog_A_Buffer++;
		Jog_A_Buffer &=  0x7;
		Jog_B_Buffer &=  0x7;
		if(( 4 == Jog_A_Buffer) && (0 == Volume_Key_Dealed))
		{
			if(Jog_B_Buffer >= 0x7)//ab  ab  ab  ab  ab  ab  ab  ab
			{
				Jog_Key = 1;	   //11->01->00->10->11->01->00->10  ;a=9 b=0xc
			}
			else
			{
				Jog_Key = 2;	   //ab  ab  ab  ab  ab  ab  ab  ab
			}
			Jog_KeyAct = 1;        //11->10->00->01->11->10->00->01  ;a=4 b=(0,1)
			Volume_Key_Dealed = 1;
		}
	}
	else
	{
		Jog_A_Buffer = 0;
		Jog_B_Buffer = 0;
	}
}

⌨️ 快捷键说明

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