//-----------------------------------------------------------------------------
// 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
//-----------------------------------------------------------------------------
親測,可用。C8051F310 紅外解碼程序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.