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

📄 mtouch722.c

📁 PIC单片机C语言程序设计实例精粹
💻 C
📖 第 1 页 / 共 2 页
字号:
	#include <pic.h>
	//---------------------------------------------------
	// 2009-05-08 modified IR code to follow the new controllor
	// 2009-05-08 send poweron code twice when first poweron ,then one time
	//---------------------------------------------------	
	__CONFIG(INTIO & WDTDIS & BORDIS & PWRTEN & MCLREN & UNPROTECT);
	__CONFIG(VCAPRA0);
	//---------------------------------------------------
	
	#define BL_IO			RC3
	#define IR_OUT1			RC0			// main board
	#define IR_OUT2			RA6			// mp4 board
	#define IR_IN			RA1
	#define BAT_DEC			RA2			// 1 means powered by batterys
	#define LED_PWM			RC1			// control RT8451
	#define PWM				RC2			// control backlight
	#define NOP()			asm("nop")
	#define ON				1
	#define OFF				0
	#define HIGH	 		1
	#define LOW				0
	#define HIGHPART		8			// led adjust
	#define LOWPART			2
	#define TMR0VALUE		77
	
	//Buttons
	#define BTN_NUM			7
	#define Button1			0x01		// POWER
	#define Button2			0x02		// SOURCE
	#define Button4 		0x04		// LEFT
	#define Button7			0x08		// MENU
	#define Button6			0x10		// DOWN
	#define Button3			0x20		// RIGHT
	#define Button5			0x40		// UP
	
	#define THRESHOLD_50	1			// avg >> 1 = 1/2   = 50%   as a threshold value below average
	#define THRESHOLD_25	2			// avg >> 2 = 1/4   = 25%   as a threshold value below average
	#define THRESHOLD_12P5	3			// avg >> 3 = 1/8   = 12.5% as a threshold value below average
	#define THRESHOLD_6P25	4			// avg >> 4 = 1/16  = 6.25% as a threshold value below average
	#define THRESHOLD_3P12	5			// avg >> 5 = 1/32  = 3.12% as a threshold value below average
	#define THRESHOLD_1P56	6			// avg >> 6 = 1/64  = 1.56% as a threshold value below average
	#define THRESHOLD_0P78	7			// avg >> 7 = 1/128 = 0.78% as a threshold value below average

	//main board
	//head 0x01 0xFE
	#define MAIN_UP			0x68
	#define MAIN_DOWN		0x92
	#define MAIN_LEFT		0xE2
	#define MAIN_RIGHT		0xA0
	#define	MAIN_EXIT		0x10
	#define MAIN_POWER 		0xFA
	#define MAIN_MENU		0xD0
	#define MAIN_ENTER		0xD2
	#define MAIN_VGA		0x32
	#define MAIN_AV			0X28
	//mp4
	//head 0x00 0xFF
	#define	MP4_UP			0x60
	#define MP4_DOWN		0x22
	#define MP4_LEFT		0xE2
    #define MP4_RIGHT		0x02
	#define MP4_ENTER		0xE0
	#define MP4_EXIT		0x18
	#define MP4_16TO4		0x98
	#define MP4_MENU		0x48   
	#define MP4_VOLD		0x8A
	#define MP4_VOLU		0xC0
	#define MP4_UD			0x90
	#define MP4_RL			0xA8

	/** Variables **/
    unsigned int Average[BTN_NUM];
    bank1 unsigned int RawData[BTN_NUM];
    bank1 unsigned int Threshold[BTN_NUM];
	
	unsigned char Brightness[4] = {0,4,6,8};//
	unsigned char CpsChl[7] = {0,1,2,3,4,5,7};
	unsigned char Index;
	unsigned char BrtRate;
	unsigned char HighLevel;
	unsigned char LowLevel;
	volatile unsigned char TimeRec;
	volatile unsigned char IRCode[4],IRSendCode[4];
	volatile unsigned char Cnt8bit,p;
	volatile unsigned char IRTemp;
	volatile unsigned char IRcodenum;
	unsigned char ButtonData,ButtonDataBuff1;
	
	typedef union
	{
		struct
		{
			char BTN0 :1;						// {byte 0}
			char BTN1 :1;
			char BTN2 :1;
			char BTN3 :1;
			char BTN4 :1;
			char BTN5 :1;
			char BTN6 :1;
		}ButtonBit;
		struct
		{
			char ButtonDataBuff :7;
		}ButtonByte;
	}BButtons;
	BButtons Buttons;	
 	struct
	{
		unsigned Flag_StartRec 		:1;
		unsigned Flag_BL 			:1;
	    unsigned Flag_PowerOn		:1;
	    unsigned Flag_LowIn			:1;
        unsigned Flag_RequestSend	:1;
	    unsigned Flag_Head			:1;
	    unsigned Flag_FstPwr		:1;		//first power on 
	}FLAG;
    
	/** Prototypes **/
	void BackLightCtl(void);
	void SetNextChannel(void);
	void RestartTimers(void);
	void SaveButtonData(void);
	void Delayms(unsigned char);
	void Delays(unsigned char);
	void Delay50us(unsigned char);
	void SendIR(unsigned char);
	void GetButtonValue(void);
	void LEDSourceCtl(void);
	void CheckInram(void);
    void ReceiveIR(void);
    void PwmOutput(void);
	void TransmitCode(void);
 
//---------------------------------------------------------------

	void Init_MCU(void)
	{
		TRISA = 0xBF;
		TRISB = 0xFF;
		TRISC = 0x10;
		
		PORTA = 0x40;
		PORTB = 0;
		PORTC = 0;
	
		ANSELA = 0x20;			// CPS7 analog
		ANSELB = 0x3F;

		PR2 = 99;				// 10K
		T2CON = 0x05;			// enable timer2  ,prescale 1:4, Fosc=16M
		CCP2CON = 0x0;
		CCP1CON = 0x0;
		TMR2IF = 0;
		TMR2IE = 1;
		
		/*capsense initial*/
		CPSCON0 = 0x8C;
		CPSCON1 = 0;
		Index = 0; 
		
		OPTION = 0x84;			// prescale to tmr0,1:32,1.6Ms
		INTCON = 0x0;
		TMR0 = TMR0VALUE;
		T0IF = 0;
		T0IE = 1;
		
		T1CON = 0xC1;			//

		PEIE = 1;
		GIE	= 1;
	}
	void BackLightOn(void)
	{
		BL_IO = ON;				// power
		PWM = 0;
		FLAG.Flag_BL = 0;
		BrtRate = 0;
	}
	
	/*main here*/
	void main(void)
	{
		OSCCON = 0x30;	    	// internal osc 16MHZ
		Delayms(250);
		Init_MCU();	
		BackLightOn();		   // when power on ,turn on backlight on
		FLAG.Flag_FstPwr = 1;       // for first ir send
	while(1)
		{
		GetButtonValue();
		TransmitCode();
		BackLightCtl();		  // back light control
        LEDSourceCtl();
		CLRWDT();
		NOP();
		}
	}
	/*daughter routines*/
	void LEDSourceCtl(void)
	{
	    TRISC = 0;
		if(RC4 == 1)		// enter standby
		{
			CCPR2L = 0;		// 
			CCP2CON = 0;
			LED_PWM = 0;
		}
	  	else if((RC4 == 0)&&(BAT_DEC == 0))		//
		{
			CCPR2L = 0x50;	// 2v/5*200 =80 max deceided by RT8451
			CCP2CON = 0x0C;			
		}
	  	else if((RC4 == 0)&&(BAT_DEC == 1))       //powered by battery
		{
			CCPR2L	= 0x40;	// 80*80%=64
			CCP2CON = 0x0C;
		}
	}

	void GetButtonValue(void)
	{
		if(ButtonData != 0)
		{   
			FLAG.Flag_BL = 1;			// Back light on
			HighLevel = 0xFF;
	        LowLevel = 0xFF;
			BrtRate = 4;

			IRcodenum = 0;				// All keys send to port1.

			switch (ButtonData)
			{
				case Button1 :         	// CPS0--PAD6
				{
					if(!FLAG.Flag_PowerOn)	
					{	
						FLAG.Flag_PowerOn = 1;		
						SendIR(MAIN_POWER);	// Power
						NOP();
						if(FLAG.Flag_FstPwr)
						{
							FLAG.Flag_FstPwr = 0;
							Delayms(250);
							Delayms(250);
							SendIR(MAIN_POWER);	// Power
							NOP();
						}
					}
					else
					{
						FLAG.Flag_PowerOn = 0;
						SendIR(MAIN_POWER);
					}
					break;
				}
				case Button4 :		  	// CPS1--PAD5
				{				
					SendIR(MAIN_LEFT);	// Left
					break;
				}
				case Button2 :			// CPS2--PAD4
				{
					SendIR(MAIN_ENTER);	// Enter
					break;
				}
				case Button5 :			// CSP3--PAD3
				{				
					SendIR(MAIN_UP);	// Up
					break;
				}
				case Button3 :			// CPS4--PAD2
				{				
					SendIR(MAIN_RIGHT);		// Right
					break;
				}
				case Button6 :			// CPS5--PAD1
				{					
					SendIR(MAIN_DOWN);	// Down
					break;
				}
				case Button7 :			// CPS7--PAD7
				{					
					SendIR(MAIN_MENU);	// Menu
					break;
				}
				default :
					break;
			}
	 ButtonData = 0;
		}
	}	
	void TransmitCode(void)
	{
		if(FLAG.Flag_RequestSend)
		{
			switch (IRTemp)
			{
			/*---------main board--------*/
			case 0x00: 	
			{
				IRcodenum = 0;
				if(!FLAG.Flag_PowerOn)	
				{	
					FLAG.Flag_PowerOn = 1;
					SendIR(MAIN_POWER);		// Power
					NOP();
					if(FLAG.Flag_FstPwr)
					{
						FLAG.Flag_FstPwr = 0;
						Delayms(250);
						Delayms(250);
						SendIR(MAIN_POWER);
					}
				}
				else
				{
					FLAG.Flag_PowerOn = 0;
					SendIR(MAIN_POWER);
				}
				break;
			}
			case 0x98:	
			{
				IRcodenum = 1; 
				SendIR(MP4_16TO4);	
				Delayms(200);
				IRcodenum = 0;
				SendIR(MAIN_EXIT);
                break;
			}
			case 0x40:  IRcodenum = 0; SendIR(MAIN_MENU);	break;
			case 0x80: 	IRcodenum = 0; SendIR(MAIN_UP);		break;
			case 0x20: 	IRcodenum = 0; SendIR(MAIN_LEFT);	break;
			case 0x90:	IRcodenum = 0; SendIR(MAIN_DOWN);	break;
			case 0x60:	IRcodenum = 0; SendIR(MAIN_RIGHT);	break;
			case 0xA0:	IRcodenum = 0; SendIR(MAIN_ENTER);	break;
			case 0x10:	IRcodenum = 0; SendIR(MAIN_VGA);	break;
			case 0x50:	IRcodenum = 0; SendIR(MAIN_AV);		break;
			
			/*---------mp4 code----------*/
			case 0xB0: 	IRcodenum = 1; SendIR(MP4_UP);		break;
			case 0x08: 	IRcodenum = 1; SendIR(MP4_LEFT);	break;
			case 0xA8:	IRcodenum = 1; SendIR(MP4_DOWN);	break;
			case 0x48:	IRcodenum = 1; SendIR(MP4_RIGHT);	break;
			case 0x88:	IRcodenum = 1; SendIR(MP4_ENTER);	break;
			case 0x70:	IRcodenum = 1; SendIR(MP4_EXIT);	break;
			case 0x30:	IRcodenum = 1; SendIR(MP4_MENU);	break;
			case 0x28:	IRcodenum = 1; SendIR(MP4_VOLD);	break;
			case 0x68:	IRcodenum = 1; SendIR(MP4_VOLU);	break;
			case 0x18:	IRcodenum = 1; SendIR(MP4_UD);		break;
			case 0x58:	IRcodenum = 1; SendIR(MP4_RL);		break;

⌨️ 快捷键说明

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