買了本學(xué)習(xí)PIC單片機(jī)的書,光盤中帶的函數(shù)如下,但是現(xiàn)在不能正常解碼,求各位大師傅們能給解惑。指導(dǎo)一下RVC紅外掃描譯碼部分的函數(shù)。
#include
__CONFIG(0x2F02); //芯片配置字,看門狗關(guān),上電延時(shí)開,掉電檢測關(guān),低壓編程關(guān),加密,4M晶體HS振蕩 #define uchar unsigned char #define uint unsigned int #define bitset(var,bitno)((var)|=1<<(bitno)) #define bitclr(var,bitno)((var)&=~(1<<(bitno))) //下面這段程序用的是結(jié)構(gòu)體的位域,方便進(jìn)行位操作 union { struct { unsigned b0: 1; unsigned b1: 1; unsigned b2: 1; unsigned b3: 1; unsigned b4: 1; unsigned b5: 1; unsigned b6: 1; unsigned b7: 1; } oneBit; unsigned char allBits; } myFlag; #define CNT2_1 myFlag.oneBit.b1 #define CNT2_2 myFlag.oneBit.b2 #define CNT2_3 myFlag.oneBit.b3 #define CNT2 myFlag .allBits static bit FLAGS ; static bit Bitin; union Csr { unsigned long i; unsigned char Csra[4]; }myCsra; #define RMT RE2 // ;遙控接收輸入腳位地址(RA。1) #define BITIN 7 //遙控接收數(shù)據(jù)位位標(biāo)志 uchar CNT0, CNT3, CNT4; //用戶臨時(shí)寄存器1--4 uint CNT1; uchar TABADD; //數(shù)碼管顯示碼取碼用寄存器 uchar CSR0; //;遙控鍵碼反碼寄存器 uchar CSR1; //;遙控器鍵碼寄存器 uchar CSR2; //;遙控器用戶碼高8位寄存器 uchar CSR3; //;遙控器用戶碼低8位寄存器 uchar FLAGS2; //;臨時(shí)寄存器 uchar CSR2A ; //遙控接收32位數(shù)據(jù)暫存寄存器 const unsigned char table[] = {0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, //*************延時(shí)函數(shù)************* void delay(uint xms,uint xus) { int i,j; for(i=0;i>xms;i--); {for(j=0;j>xus;j--);} } /**************************************************************************** * 名 稱:initial * 功 能:系統(tǒng)初始化子程序 ****************************************************************************/ void initial (void) { T2CON=0X07; ADCON1 = 0x07; //設(shè)置RA口全部為普通數(shù)字IO口 TRISA = 0x00; //RA設(shè)置為輸出模式 PORTA = 0X00; //RA輸出低電位 TRISE2 = 1 ; //將RMT設(shè)置為輸入,其它所有IO口設(shè)置為輸出 TRISD = 0X00; //RC口全部為輸出 PORTD = 0xFF; //先讓數(shù)碼管全部不顯示 TRISC = 0xf0; //RC高四位為輸入,低四位為輸出 PORTC = 0x11; } /**************************************************************************** * 名 稱:RCV() * 功 能:紅外掃描譯碼 ****************************************************************************/ void RCV() { if (!RMT) { CNT1 = 640; //4*256*10us 640*16=10。24ms CNT2 = 0; //RCV1 // delay(10,240); do { // ;先檢測引導(dǎo)碼的9MS低電平_____┏┓ // ;每一個(gè)循環(huán)16US if (RMT) CNT2 = CNT2++; if (!RMT) CNT2 = 0; if (CNT2_2) //高電平大于8*10US=80US則為有效高電平, break; //否則是一些干擾信號16*4=64us } while (CNT1--); //低電平大于4*256*10US=10.24MS則是錯(cuò)誤脈沖 //RCV2 if (CNT2_2 && (0 < CNT1) && (CNT1 < 320)) //;低電平小于2*256*10US=5.12MS┏┒____//320*16=5。12ms則是錯(cuò)誤脈沖 { CNT1 = 480; //;3*256*10us 480*16=7.68 // delay(7,680); CNT2 = 0; //RCV3 //;每一個(gè)循環(huán)16US do { if (!RMT) CNT2 = CNT2++; if (RMT) CNT2 = 0; if (CNT2_2) // 低電平大于8*10US=80US則為有效低電平,否則是一些干擾信號 break; //RCV4,否則是一些干擾信號16*4=64us // 高電平大于3*256*10US=7.68MS則是錯(cuò)誤的 } while (CNT1--); //RCV4 if (CNT2_2 && (0 < CNT1) && (CNT1 < 320)) //高電平小于1*256*10US=2.56MS則是錯(cuò)誤的 { //480-320=160 *16= 2.56ms CNT3 = 32; //接收數(shù)據(jù)共32位,16位用戶碼,8位控制碼加8位控制碼的反碼 //RCV5 do { CNT2 = 0; CNT0 = 86; //低電平大于256-170=86*10US=860US錯(cuò)誤 86*10 __┌┐ CNT4 = 200; //高電平大于256-56=200*10US=2MS錯(cuò)誤 200*10 //RCV5_HI do { //;每一個(gè)循環(huán)10US if (RMT) CNT2 = CNT2++; if (!RMT) CNT2 = 0; if (CNT2_3) //;高電平大于8*10US=80US則為有效高電平 break; //RCV6否則是一些干擾信號16*4=64us //;低電平大于860US則是錯(cuò)誤的 } while (CNT0--); //CV6 if ((CNT0 == 0) || (CNT2_3 == 0)) break; CNT2 = 0; //RCV6_LO do { //┌┐__ if (!RMT) CNT2 = CNT2++; if (RMT) CNT2 = 0; if (CNT2_3) //低電平大于10*8US=80US則是有效低電平 break ; // COMPARE 否則是一些干擾信號16*4=64us } while (CNT4--); //高電平大于256-56=200*10US=2MS錯(cuò)誤 if ((CNT4 == 0) || (CNT2_3 == 0)) break; //OMPARE CNT0 = (86 - CNT0) + (200 - CNT4) ; //;減CNT0的值 等于實(shí)際低電平計(jì)數(shù)值 // ;減CNT4的值 等于實(shí)際高電平計(jì)數(shù)值 // ;將高低電平的計(jì)數(shù)加在一起并存入CNT0,通過比較高低電平總的時(shí)間來確定是1還是0 // ;總的值大于255(即時(shí)間大于255*10US=2.55MS)則錯(cuò)誤 255*10=2.55 // ;總的時(shí)間小于70*10US=700US則是錯(cuò)誤的 70*10=700 if (( (70 < CNT0) && (CNT0 < 130)) || ((160 < CNT0) && (CNT0 < 230) ) ) // ;130*10=1.3MS { if ((70 < CNT0) && (CNT0 < 130)) //COMPARE_H // ;時(shí)間大于1.3MS轉(zhuǎn)去確定是否1 Bitin = 0; //;時(shí)間在700US-1.3MS之間則是0 else // if (160> 1; //;將每一位移入相應(yīng)寄存器 if (Bitin) bitset ( myCsra. Csra[3], 7); else bitclr ( myCsra. Csra[3], 7); } else break; } while (CNT3--); //;是否接收完32位 CSR3 = myCsra. Csra[0]; CSR2 = myCsra. Csra[1]; CSR1 = myCsra. Csra[2]; CSR0 = myCsra. Csra[3]; CSR2A = ~CSR0; //;比較鍵碼的反碼取反后是否等于鍵碼 //;不等于則接收到的是錯(cuò)誤的信息 // 將鍵碼送顯示 } } } } /**************************************************************************** * 名 稱:display() * 功 能:數(shù)碼管顯示 ****************************************************************************/ void display() { int i, j; //定義查表變量 i = CSR1 & 0x0f; PORTD = table[i]; //送D口顯示,并加上小數(shù)點(diǎn) PORTA = 0x10; NOP(); //延長一段時(shí)間,保證亮度 for (j = 0;j < 50;j++); i = CSR1 & 0xf0; i = i >> 4; //向左移四位 PORTD = table[i]; //送D口顯示 PORTA = 0x20; NOP(); //延長一段時(shí)間,保證亮度 for (j = 0;j < 50;j++); } /**************************************************************************** * 名 稱:main * 功 能:主程序 ****************************************************************************/ void main(void) { initial (); //系統(tǒng)初始化子程序 while (1) { RCV(); //遙控接收程序 display(); //解碼顯示程序 } }