📄 mtouch722.c
字号:
default :break;
}
FLAG.Flag_RequestSend = 0;
}
}
//------------------------------------------
void BackLightCtl(void)
{
static unsigned int countms;
if(FLAG.Flag_BL)
{
if(countms<=5000) //delay 5s
{
countms++;
Delayms(1);
return;
}
else
{
countms=0;
if(BrtRate!=0)
{
BrtRate--;
HighLevel = Brightness[BrtRate];
LowLevel = 10-Brightness[BrtRate];
}
}
}
}
void SelectIO(unsigned char OutputValue)
{
if(IRcodenum == 0)
IR_OUT1 = OutputValue;
else
IR_OUT2 = OutputValue;
}
void SendIR(unsigned char IRValue)
{
unsigned char i,j;
GIE = 0;
BL_IO = 1;
IR_OUT1 = 1;
IR_OUT2 = 1;
if(IRcodenum == 0)
{
IRSendCode[0]=0x01;
IRSendCode[1]=0xFE;
}
else
{
IRSendCode[0]=0x00;
IRSendCode[1]=0xFF;
}
IRSendCode[2]=IRValue;
IRSendCode[3]=~IRValue;
SelectIO(0);
Delay50us(180); //9ms 0
SelectIO(1); //4.5ms 1
Delay50us(89);
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
NOP();
if((IRSendCode[i]&0x80)==0x80)
{
SelectIO(0);
Delay50us(11); //0.558ms
SelectIO(1);
Delay50us(34); //1.719ms
IRSendCode[i]<<=1;
}
else if((IRSendCode[i]&0x80)==0)
{
SelectIO(0);
Delay50us(11); //0.558ms
SelectIO(1);
Delay50us(11); //0.558ms
IRSendCode[i]<<=1;
}
}
}
SelectIO(0); //stop
Delay50us(11);
SelectIO(1);
/*--------check other status-------*/
if(FLAG.Flag_StartRec)
{
FLAG.Flag_StartRec = 0; //reset ir receive
FLAG.Flag_Head = 0;
}
if(T0IF&&T0IE)
RestartTimers();
BL_IO = 0;
GIE = 1;
}
/*-------------Delays--------------------*/
void Delayms(unsigned char ms_num)
{
unsigned char i,j;
asm("nop");
for(i = ms_num;i > 0;i--)
{
for(j = 20;j > 0 ;j--) //1ms
{
Delay50us(1);
}
}
}
void Delays(unsigned char s_num)
{
unsigned char i,j;
for(i = s_num;i > 0;i--)
{
for(j = 200 ;j > 0;j--)
{
Delayms(5);
}
}
}
void Delay50us(unsigned char us_num) //51us
{
unsigned char i,j;
for(i= us_num;i > 0;i--)
{
for(j = 33;j > 0;j--)
{
NOP();
CLRWDT();
NOP();
}
}
}
/*------------------------------*/
/*Interrupts */
/*------------------------------*/
void interrupt isr(void)
{
/*100us per interrupt for IR receive and send */
if(TMR2IF & TMR2IE)
{
TMR2IF = 0;
ReceiveIR();
PwmOutput(); // 1k
if(T0IF) // If T0 have flaged , then initial timers
RestartTimers();
}
/*Button scan*/
if(T0IF & T0IE)
{
T0IF = 0; // Clear T0IF every time
TMR1ON = 0;
RawData[Index] = TMR1L + (unsigned int)(TMR1H << 8);
switch (Index)
{
case 0: Threshold[Index] = Average[Index]>>THRESHOLD_0P78; break;
case 1: Threshold[Index] = Average[Index]>>THRESHOLD_0P78; break;
case 2: Threshold[Index] = Average[Index]>>THRESHOLD_0P78; break;
case 3: Threshold[Index] = Average[Index]>>THRESHOLD_0P78; break;
case 4: Threshold[Index] = Average[Index]>>THRESHOLD_0P78; break;
case 5: Threshold[Index] = Average[Index]>>THRESHOLD_0P78; break;
case 6: Threshold[Index] = Average[Index]>>THRESHOLD_0P78; break;
case 7: Threshold[Index] = Average[Index]>>THRESHOLD_0P78; break;
default: break;
}
if (RawData[Index]< (Average[Index]-Threshold[Index]))
{
switch(Index)
{
case 0: Buttons.ButtonBit.BTN0 = 1; break; // The current button is pressed
case 1: Buttons.ButtonBit.BTN1 = 1; break; // Relay button pressed information to application
case 2: Buttons.ButtonBit.BTN2 = 1; break;
case 3: Buttons.ButtonBit.BTN3 = 1; break;
case 4: Buttons.ButtonBit.BTN4 = 1; break;
case 5: Buttons.ButtonBit.BTN5 = 1; break;
case 6: Buttons.ButtonBit.BTN6 = 1; break;
default: break;
}
}
else
{
switch(Index)
{
case 0: Buttons.ButtonBit.BTN0 = 0; break; // The current button is unpressed
case 1: Buttons.ButtonBit.BTN1 = 0; break; // Relay button pressed information to application
case 2: Buttons.ButtonBit.BTN2 = 0; break;
case 3: Buttons.ButtonBit.BTN3 = 0; break;
case 4: Buttons.ButtonBit.BTN4 = 0; break;
case 5: Buttons.ButtonBit.BTN5 = 0; break;
case 6: Buttons.ButtonBit.BTN6 = 0; break;
default: break;
}
if(RawData[Index]<=0x450)
Average[Index] = (((Average[Index]<<4)-Average[Index])+RawData[Index])>>4; // Get the Average 16
}
SaveButtonData();
SetNextChannel(); // Set up for next channel
RestartTimers(); // Restart timer1
}
}
//----------------------------------------------
void PwmOutput(void)
{
static unsigned char HighLevelBuff,LowLevelBuff;
if((HighLevelBuff == 0)&&(LowLevelBuff == 0))
{
if(HighLevel == 0xFF)
{
PWM = 1;
return;
}
if(HighLevel == 0x0)
{
PWM = 0;
FLAG.Flag_BL = 0;
return;
}
else
{
HighLevelBuff = HighLevel;
LowLevelBuff = LowLevel;
PWM = 1;
return;
}
}
else
{
if(HighLevelBuff != 0)
{
HighLevelBuff--;
return;
}
else
PWM = 0;
if(LowLevelBuff != 0)
{
LowLevelBuff--;
return;
}
else
PWM = 1;
}
}
//-------------------------------------------------
void ReceiveIR(void)
{
++TimeRec; //+1,per interrupt
if(IR_IN==1) //check input pin logic level
{
FLAG.Flag_LowIn=1; //pin input low
return;
}
else if((FLAG.Flag_LowIn==1)&&(IR_IN==0))
{ //pin come to low ,and pin input low before
FLAG.Flag_LowIn=0; //clr pin low signal
if(FLAG.Flag_StartRec==0) //a new frame?
{ //yes
FLAG.Flag_StartRec=1; //indicate start to receive a new frame
TimeRec=0; //
return;
}
else if((120<=TimeRec)&&(TimeRec<=150)&&FLAG.Flag_StartRec) //13.5/0.1=135 ,this is head
{
asm("nop");
TimeRec=0; //
p=0; //
Cnt8bit=8;
IRCode[0]=0x0; //
IRCode[1]=0x0; //
IRCode[2]=0x0; //
IRCode[3]=0x0; //
FLAG.Flag_Head =1;
return;
}
else if((15<TimeRec)&&(TimeRec<=32)&&FLAG.Flag_Head) //2.25/0.1=22
{
asm("nop");
TimeRec=0;
IRCode[p]=(IRCode[p]<<1)|0x01;
CheckInram();
}
else if((6<=TimeRec)&&(TimeRec<=16)&&FLAG.Flag_Head) //1.12/0.1=11
{
asm("nop");
TimeRec=0;
IRCode[p]<<=1; //shift 0 into IRcode
CheckInram();
}
else
FLAG.Flag_StartRec=0; //error bit ,restart
return;
}
}
void CheckInram(void)
{
if((--Cnt8bit)!=0)
return; //have not finished a byte ,then return
else if ((++p)<=3) //a frame have finished?must be 2;
{ //no
Cnt8bit=8;
return;
}
FLAG.Flag_StartRec=0; //yes
FLAG.Flag_Head =0;
if((IRCode[0]==0x00)&&(IRCode[1]==0xFF)&&(IRCode[2]+IRCode[3]==0xFF))
{
FLAG.Flag_RequestSend = 1;
IRTemp = IRCode[2];
if(T0IF)
{
RestartTimers();
}
}
}
void SaveButtonData(void)
{
if(ButtonDataBuff1 != Buttons.ButtonByte.ButtonDataBuff)
{
ButtonDataBuff1 = Buttons.ButtonByte.ButtonDataBuff;
ButtonData = ButtonDataBuff1;
}
}
void RestartTimers(void)
{
T0IF = 0;
T0IE = 1;
TMR0 = TMR0VALUE;
TMR1ON = 0;
TMR1L = 0; // reset Timer1F
TMR1H = 0; // " "
TMR1ON = 1;
}
void SetNextChannel(void)
{
if(++Index>=BTN_NUM) Index=0;
CPSCON1 = CpsChl[Index]; // Select external pin CPS0..CPS15
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -