📄 mtouch722.c
字号:
#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 + -