|
請(qǐng)問大家,我用stc15單片機(jī)代替pt2272解碼,為什么不能實(shí)現(xiàn)按鍵5按下電機(jī)開,松開電機(jī)停。現(xiàn)在是按下它就開,松開也停,但是長(zhǎng)按的話就是電機(jī)有停頓,開了停然后又開,以下是我的代碼,請(qǐng)大神幫忙看看怎么改。萬分感謝,已經(jīng)困擾我好多天了。
#include "PT2262.h"
#include "EEPROM.h"
uchar MA1,MA2,MA3; /*用來記錄地址碼(占16位)和鍵碼(占8位)(MA1、MA2、MA3各8個(gè)bit位)*/
uchar TimeCount;
unsigned int TimeCount1=1;
unsigned int flag_key,flag;
unsigned int qq,FF,zz,W,vv;
extern unsigned int IN_COUNT;
void Init()
{
TMOD = 0x01; /*定時(shí)器T0,工作模式1,16位定時(shí),不自動(dòng)重裝,TL0、TH0全用*/
TR0 = 0; /*(可位尋址)關(guān)閉定時(shí)器T0運(yùn)行*/
// EX1 = 1; /*允許外部中斷1中斷*/
IT1 = 0; /*IT1=0 --上升沿和下降沿均可觸發(fā)中斷; IT1=1 ----下降沿觸發(fā)*/
EA = 1; /*(可位尋址)開啟總中斷*/
}
void PT2262_R(void) /*外部中斷1入口函數(shù)*/
{
/*PT2262發(fā)碼為窄高+寬低+窄高+寬低=0 /寬高+窄低+寬高+窄低=1 /窄高+寬低+寬高+窄低=F
數(shù)值表示: 00 = 0 / 11 = 1 / 01 = F
反碼表示: 11 = 0 / 00 = 1 / 10 = F(本例所用)*/
bit err = 0;
uchar I = 0; /*用來記錄位數(shù),正常會(huì)收到24位*/
uchar TL,TH; /*用來記錄每位的低電平總時(shí)長(zhǎng)*/
uint L,M,S,K; /*W用于學(xué)習(xí)鎖碼進(jìn)入,識(shí)別單個(gè)遙控;*/
char bat[5]={0};
/*判斷是否想再次進(jìn)入學(xué)習(xí)的狀態(tài)*/
if(P55 != 1)
{
/*以下語句用于:當(dāng)按下學(xué)習(xí)鍵時(shí)進(jìn)入學(xué)習(xí)狀態(tài),學(xué)習(xí)狀態(tài)進(jìn)入時(shí)間5s*/
if(W)
{
studyInit1();
}
}
MA1=0;
// EX1 = 0; /*先關(guān)閉中斷*/
TR0 = 1; /*啟動(dòng)定時(shí)器計(jì)數(shù)器0*/
if(TimeCount > 0) /*當(dāng)按鍵按下釋放后該值不在賦值就同通過遞減直到該值等于0*/
{
TimeCount--; /*等于0后表示按鍵釋放*/
}
while(WuXian_IN == 0); /*如果為0一直等待,等待高電平出現(xiàn)*/
while(I<24) /*共接收24位*/
{
TR0 = 1;
while(WuXian_IN == 0); /*等待高電平到來*/
TL = TL0;
TH = TH0;
TH0 = TL0 = 0; /*記錄低電平長(zhǎng)度*/
L = TH;
L = ((L << 8) + TL); /*將計(jì)時(shí)器的高低8位合并*/
if(I == 0) /*處理同步位*/
{
if(L > 2360) /*確認(rèn)是引導(dǎo)頭(判斷同步位低電平時(shí)長(zhǎng)31a)/2360*/
{
M = L / 31; /*M即4a亦即是窄電平的時(shí)長(zhǎng)*/
}
else /*不符合規(guī)則(出錯(cuò))*/
{
I = TR0 = TH0 = TL0 = 0;
err = 1;
break;
}
}
else
{
/* 短555 長(zhǎng)1666
4.7M的振蕩電阻時(shí)同步位的低電平時(shí)長(zhǎng)為L(zhǎng)=15378uS;即31a
4.7M的振蕩電阻時(shí)窄電平時(shí)長(zhǎng)為M=492uS;即4a
4.7M的振蕩電阻時(shí)寬電平時(shí)長(zhǎng)為1488uS即12a
以下語句即判斷窄電平與寬電平的寬度是否合格
窄電平時(shí)長(zhǎng)為M即 M=4a;a為一個(gè)振蕩頻率, fosc=(2x1000x16/Rosc(KΩ))KHz,fosc單位為KHz, (Rosc為振蕩電阻,單位為KΩ),則一個(gè)振蕩周期T=1/fosc
例如常用振蕩電阻為4.7M;則振蕩頻率a=fosc=1/(2x1000x16/4700)=6.8KHz ,則振蕩周期T=1/6.8K=147uS,即窄電平M=a=4T=588us;則寬電平3xM=3a=1764us;
程序中窄電平的誤差范圍為正(M+M/4)負(fù)(M-M/4)一個(gè)振蕩周期a=M/4;
程序中寬電平的誤差范圍為正(M * 3 + M / 2)負(fù)(M * 3 - M / 2) 兩個(gè)振蕩周期2a=M/2;
*/
if(((L < M - M / 4) && (L > M + M / 4)) || ((L < M * 3 - M / 2) && (L > M * 3 + M / 2)))
{
/*如果窄電平小于4a與大小4a或?qū)掚娖叫∮?2a與大小12a則表示出錯(cuò)*/
/* 窄電平的誤差范圍為正(M+M/4)負(fù)(M-M/4)一個(gè)振蕩周期a=M/4;*/
I = TR0 = TH0 = TL0 = 0;/*寬電平的誤差范圍為正(M * 3 + M / 2)負(fù)(M * 3 - M / 2) 兩個(gè)振蕩周期2a=M/2;*/
err = 1;
break;
}
}
while(WuXian_IN == 1); /*等待低電平到來*/
TH = TH0;
TL = TL0;
TH0 = TL0 = 0;
L = TH;
L = ((L << 8) + TL); /*將計(jì)時(shí)器的高低8位合并*/
/*以下語句即判斷是窄電平是否合格(4.7M的振蕩電阻時(shí)窄電平時(shí)長(zhǎng)為492uS即4a) */
if(((L > (M - M / 4)) && (L < (M + M / 4))))/*如果此時(shí)為4a則本位為0 短492uS*/
{ /*窄電平的誤差范圍為正(M+M/4)負(fù)(M-M/4)一個(gè)振蕩周期a=M/4;*/
I++;
MA1 <<= 1; /*本位置0*/
}
/*以下語句即判斷寬電平是否合格(4.7M的振蕩電阻時(shí)寬電平時(shí)長(zhǎng)為1488uS即12a) */
else if(((L > (M * 3 - M / 2)) && (L < (M * 3 + M / 2))))/*如果此時(shí)為12a則本位為1 長(zhǎng)1488uS*/
{ /*寬電平的誤差范圍為正(M * 3 + M / 2)負(fù)(M * 3 - M / 2) 兩個(gè)振蕩周期2a=M/2;*/
I++;
MA1 <<= 1;
MA1++; /*本位置1*/
}
else /*已不是4a也不是12a則不符合規(guī)表示出錯(cuò)*/
{
I = 0;
TR0 = TH0 = TL0 = 0;
err = 1;
break;
}
if(I == 8)
{
MA3 = MA1; /*每二位對(duì)應(yīng)PT2262的一個(gè)引腳,bit7/bit6二位對(duì)應(yīng)PT2262的1腳,類推對(duì)應(yīng)PT2262的1~4腳*/
K=1; /* 11 = 接+ / 00 = 接地 / 01 = 懸空*/
/*以下if(W==0)語句作用:將PT2262的編碼送進(jìn)W,鎖定編碼,用途為鎖定遙控編號(hào)*/
if(W==0)
{
if(MA3)
{
W=MA3;
IapEraseSector(IAP_ADDRESS);
Delay(10);
IapProgramByte(IAP_ADDRESS, (BYTE)MA3);
}
K=0;
}
/*以下if(W)為:將新進(jìn)入的遙控信號(hào)裝在S*/
if(W)
{
S=MA3;
}
}
if(I == 16)
{
MA2 = MA1; /*每二位對(duì)應(yīng)PT2262的一個(gè)引腳,bit7/bit6二位對(duì)應(yīng)PT2262的5腳,類推*/
/*對(duì)應(yīng)PT2262的5~8腳 / 11 = 接+ / 00 = 接地 / 01 = 懸空*/
}
if(I == 24) /*24位已收完則解碼結(jié)束*/
{
/*以下if(S==W)為:斷定進(jìn)入的遙控信號(hào)是否為之前鎖住的遙控編碼*/
if(S==W&&K==1)
{
// HL=MA1;
if(TimeCount == 0) /*為0表示是新的一次按下對(duì)其進(jìn)行處理,如過該值大于0表示已經(jīng)按下不在處理*/
{
switch(MA1)
{
case 0xC0: /*單鍵KEY1*/
Delay_Nms(100);
if(MA1==0xC0)
{
Uart_Send_String("K1\r\n");
flag_key=1;zz=1;qq++;FF++;
INT_CLKO |= 0x20; /*(EX3 = 1)使能INT3中斷*/
IN_COUNT=0;
}
break;
case 0x30: /*單鍵KEY2*/
Delay_Nms(100);
if(MA1==0x30)
{
Uart_Send_String("K2\r\n");
flag_key=2;zz=1;
IN_COUNT=0;qq++;FF++;
INT_CLKO |= 0x20;
}
break;
case 0xF0: /*單鍵KEY3*/
Delay_Nms(50);
if(MA1==0xF0)
{
Uart_Send_String("K3\r\n");
flag_key=3;zz=1;
IN_COUNT=0;qq++;FF++;
INT_CLKO |= 0x20;
}
break;
case 0x0C: /*單鍵KEY4*/
Delay_Nms(50);
if(MA1==0x0C)
{
Uart_Send_String("K4\r\n");
flag_key=4;zz=1;
IN_COUNT=0;qq++;FF++;
INT_CLKO |= 0x20;
}
break;
// case 0xCC: /*單鍵KEY5*/
// Delay_Nms(50);
// if(MA1==0xCC)
// {
//// P32=1;P11=0;
//// Uart_Send_String("K5\r\n");
// flag_key=5;IN_COUNT=0;
// INT_CLKO |= 0x20;
// }
// break;
// case 0x3C: /*單鍵KEY6*/
// Delay_Nms(50);
// if(MA1==0x3C)
// {
//// P32=0;P11=1;
//// Uart_Send_String("K6\r\n");
// flag_key=6;IN_COUNT=0;
// INT_CLKO |= 0x20;
// }
// break;
case 0xFC: /*單鍵KEY7*/
Delay_Nms(50);
if(MA1==0xFC)
{
Uart_Send_String("K7\r\n");
flag_key=7;IN_COUNT=0;
// INT_CLKO |= 0x20;
}
break;
case 0x03: /*單鍵KEY8*/
Delay_Nms(50);
if(MA1==0x03)
{
Uart_Send_String("K8\r\n");
flag_key=8;IN_COUNT=0;
// INT_CLKO |= 0x20;
}
break;
// case 0xc3: /*組合鍵KEY8+KEY1*/
// Delay_Nms(100);
// if(MA1==0xc3)
// {
// Uart_Send_String("K8+K1\r\n");
// flag_key=9;
// }
// break;
// case 0x33: /*組合鍵KEY8+KEY2*/
// Delay_Nms(100);
// if(MA1==0x33)
// {
// Uart_Send_String("K8+K2\r\n");
// flag_key=10;
// }
// break;
}
}
if(TimeCount!=0)
{
if(MA1==0xc3)
{
IN_COUNT=0;
// Uart_Send_String("K8+K1\r\n");
flag_key=9;
}
if(MA1==0x33)
{
IN_COUNT=0;
// Uart_Send_String("K8+K2\r\n");
flag_key=10;
}
if(MA1==0xCC)
{
P32=1;P11=0;
Uart_Send_String("K5\r\n");
TimeCount1=0;flag=5;
Timer2Init();
}
if(MA1==0x3C)
{
P32=0;P11=1;
Uart_Send_String("K6\r\n");
TimeCount1=0;flag=6;
Timer2Init();
}
}
}
key1_function();
TimeCount = 25; /*PT2262每按一次會(huì)發(fā)出4組相同的編碼防止按鍵沒放開直在取反,保證按1次只做1次處理*/
break;
}
}
TR0 = TH0 = TL0 = 0; /*關(guān)閉定時(shí)器T0,并重置TH0、TL0*/
}
void t2int() interrupt 12
{
char buf[10]={0};
T2L = 0xCD;
T2H = 0xD4;
TimeCount1++;
UART1_Init(9600);
if(TimeCount1>2000)
{
TimeCount1=0;
sprintf(buf,"int12:%d\r\n",TimeCount1);
Uart_Send_String(buf);
P11=0;P32=0;
IE2 &= 0xfb;
}
//IE2 &= 0xfb;
}
|
|