C8051F310 紅外解碼程序

//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------

#include <C8051F310.h>                 // SFR declarations
#include <stdio.h>

#define IR_CUSTOMER_CODE	0xcd32
#define IR_POWER_KEY		0x81

#define setbit(x,y) ((x)|=(1<<(y)))   //將X的第Y位置1
#define clrbit(x,y) ((x)&=~(1<<(y)))  //將X的第Y位清0
#define revbit(x,y) ((x)^=(1<<(y)))   //將X的第Y位取反
//-----------------------------------------------------------------------------
// Global Constants
//-----------------------------------------------------------------------------

#define SYSCLK             24500000/8  // SYSCLK in Hz (24.5 MHz internal
                                       // oscillator / 8)
                                       // the internal oscillator has a
                                       // tolerance of +/- 2%

#define BAUDRATE        9600           // Baud rate of UART in bps

sbit LED = P3^3;                       // LED='1' means ON
sbit sigin = P2 ^ 3;	 			   // IR in pin

int xdata rdata[65];

//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------

void Port_Init (void);                 // Port initialization routine
void UART0_Init (void);

//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------

void main (void)
{
	unsigned short i;
	int times, times1;
	unsigned int usercode, keycode;
	unsigned int keymin, keymax;
	unsigned short kj,uj;

   PCA0MD &= ~0x40;                    // Clear watchdog timer enable

   Port_Init ();
 
   UART0_Init();


   EA = 1;                             // Enable global interrupts

   printf("booting...\r\n");
   LED=0;
   sigin=1;
   while (1){
restart:
		//EA = 1;	  // enable global interrupts
		times=0;
		times1=0;
		for(i=64;i>0;i--) rdata[i]=0;
		while(!sigin){
			//EA = 0;	  // disable global interrupts
		 	while(!sigin&×<20000){
			 	times++;
			}
			if(times>=20000) goto restart;
			while(sigin&×1<20000){
			 	times1++;
			}
			if(times1>=20000) goto restart;
			if(times>0 && times1>0){
				for(i=64;i>0;i--){
				 	while(!sigin&&rdata[i]<500) rdata[i]++;
					if(rdata[i]>=500) goto restart;
					i--;
					while(sigin&&rdata[i]<500) rdata[i]++;
					if(rdata[i]>=500) goto restart;
				}
				//EA = 1;	  // enable global interrupts

				for(i=64;i>0;i--){
				 	//printf(" %d ",rdata[i]);
					if(rdata[i]<=0) goto restart;
				}

				// combine data
				// find min and max value to decide bit "0" or "1"
				keymin = 0xffff;
				keymax = 0x0000;
				for(i=1;i<64;i+=2){
					if(rdata[i]>keymax) keymax=rdata[i];
					if(rdata[i]<keymin) keymin=rdata[i];
				}

				kj=0;
				uj=0;
				usercode=0x0000;
				keycode=0x0000;
				for(i=1;i<64;i+=2){
					if((rdata[i]>=keymin) && (rdata[i]<=(keymin+3))){ // bit "0"
						if(i<=31){
						   kj++;
						}else{
						   uj++;
						}
					}else if((rdata[i]<=keymax) && (rdata[i]>=(keymax-3))){ // bit "1"
						if(i<=31){
						   setbit(keycode,15-kj);
						   kj++;
						}else{
						   setbit(usercode,15-uj);
						   uj++;
						}
					}else{
						goto restart;
					}
				}
				printf("\r\nusercode = 0x%04x, keycode = 0x%04x\r\n", usercode, keycode);
				if( (((keycode>>8)&0xff)+(keycode&0xff)) != 0xff ){
				 	printf("\r\n code and reverse code mismatch!\r\n");
					goto restart;
				}else{
				 	if((keycode&0xff)==IR_POWER_KEY){
					 	printf("user pressed power key!\r\n");
						LED=~LED;
						goto restart;
					}
				}
			}
		}
   }
}

//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// Port_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : None
//
// This function configures the crossbar and GPIO ports.
//
// Pinout:
//
//    P3.3 -> LED
//
//    all other port pins unused
//
//-----------------------------------------------------------------------------
void Port_Init (void)
{
   XBR1 = 0x40;                        // Enable crossbar
   XBR0    = 0x01;                     // Enable UART on P0.4(TX) and P0.5(RX) 
   P3MDOUT = 0x08;                     // Set LED to push-pull
   P0MDOUT |= 0x10;                    // Enable UTX as push-pull output
}

void UART0_Init (void)
{
   SCON0 = 0x10;                       // SCON0: 8-bit variable bit rate
                                       //        level of STOP bit is ignored
                                       //        RX enabled
                                       //        ninth bits are zeros
                                       //        clear RI0 and TI0 bits
   if (SYSCLK/BAUDRATE/2/256 < 1) {
      TH1 = -(SYSCLK/BAUDRATE/2);
      CKCON &= ~0x0B;                  // T1M = 1; SCA1:0 = xx
      CKCON |=  0x08;
   } else if (SYSCLK/BAUDRATE/2/256 < 4) {
      TH1 = -(SYSCLK/BAUDRATE/2/4);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01                  
      CKCON |=  0x01;
   } else if (SYSCLK/BAUDRATE/2/256 < 12) {
      TH1 = -(SYSCLK/BAUDRATE/2/12);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 00
   } else {
      TH1 = -(SYSCLK/BAUDRATE/2/48);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 10
      CKCON |=  0x02;
   }

   TL1 = TH1;                          // Init Timer1
   TMOD &= ~0xf0;                      // TMOD: timer 1 in 8-bit autoreload
   TMOD |=  0x20;                       
   TR1 = 1;                            // START Timer1
   TI0 = 1;                            // Indicate TX0 ready
}

//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------
親測,可用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章