Red de conocimiento informático - Aprendizaje de programación - Programación por infrarrojos de monitores LCD

Programación por infrarrojos de monitores LCD

# incluir & ltreg 51 . h & gt;

# incluir & ltintrins.h & gt

#Definir carácter uchar sin signo

#Definir uint entero sin signo

#define ulong tipo largo sin firmar

# define Nop(){ _ Nop _(); ();}

código IR ulong volátil = 0x 00000000; //código clave de 32 bits

código ird ulong volátil = 0x 00000000;

código personalizado uint volátil = 0x0000//16 código de usuario

tiempo uint volátil _ us = 0x0000//tiempo entre dos flancos descendentes

tiempo uchar volátilH, timeL //Guarda el valor de TH1 TL.

uchar Lcustomcode//código de usuario bajo de 8 dígitos

uchar Hcustomcode//altura 8

código de datos uchar //código de datos clave de 8 dígitos

uchar mycode

uchar Rdatacode//complemento de datos clave de 8 bits

uchar UC 1 ms

uchar UC 10 ms; p >

uchar uc3ms

uchar ucDispTime

uchar ucDispOrder

uchar ucDispCon

uchar ucSpeakerTime

Ninguno Código de carácter de símbolo LedData[16] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};

Ninguno Código de carácter de símbolo LedCon[2] = {0x8f, 0x4f};

Carácter sin firmar UC dispdata[2]; //Datos de visualización de almacenamiento

sbit led 1 = p3^7;

sbit led 2 = p3^6;

sbit power=p1^0; //Interruptor de encendido

sbit pitido = p2^1;

bit new ircode = 0; //Indica que al procesar códigos de 32 bits, habrá un nuevo código de control remoto.

Peso de datos de bits = 0; // Cuando es 1, los datos se leen correctamente.

Bit bSampleOk

Bit b muestra

Bit b 10ms int

Bit b 1 msint; >bKeySound bit;

Bit b 1ms main;

Bit IR_E; //Indica que los datos de escaneo se actualizarán cuando haya un nuevo botón del control remoto.

bit b3msint

void senddatodispdevice();

void Ir_process();

void display();

void beep();

/* * * * *El oscilador de cristal es de 12 MHz * * * * * */

/* *El tiempo máximo del temporizador es 1,12 MHZ 65,53 ms***/

// -

inicialización nula()

{

IP = 0x09// Temporizador 1, interrupción externa 0 tiene alta prioridad.

TMOD = 0x 11; // Temporizador 0, modo de trabajo 1; Temporizador 1, modo de trabajo 1

TCON = 0x 01 // La interrupción externa comienza desde el flanco descendente de 0; Disparador (incluido TR1=0, TR0=0)

TH0 = 0xff//Inicializa el temporizador 0, temporización 0,2 ms.

TL0 = 0x47

th 1 = 0x 00; //Inicializar temporizador 1

TL 1 = 0x 00;

EA = 1; //Activar interrupción completa

ET0 = 1; //Activar interrupción T0

et 1 = 1 //Activar interrupción T1

EX0 = 1; //abrir INT0

tr 1 = 0;

TR0 = 1

}

// -

Programa de tiempo no válido (no válido)

{

b 1 msmain = b 1 msint

b 1ms main = 0

b 10ms int = 0;

if(b1msInt == 1)

{

b 1ms principal = 1;

if(++uc10ms == 10)

{

UC 10ms = 0

b 10ms int = 1; p> if(bKeySound==1)

{beep();

bkey sound = 0;

}

}< / p>

}

}//void TimeProg(void)

// -Interrupción 0 -

void IR _ ISR()interrupción 0 usando 1//Función de procesamiento de interrupción de control remoto

{

Uchar estático cn

tr 1 = 0;

timeH = th 1 ;

tiempoL = TL 1;

th 1 = 0

TL 1 = 0

tr 1 = 1; / Iniciar interrupción del temporizador 1

time _ us =(unsigned int)timeH

time _ us = time _ us & lt& lt8;

time _ us; = time_us | timeL

if(time_us>12200.&time_us<13000){cn=1;IRcode=0;}//Cuando encuentre el código de inicio, cambie cn y se borrará el código IR.

//La duración del tiempo del código piloto es 9 ms+4,5 ms.

if(cn & lt;34)

{

if(time _ us & gt; 950 & amp& amptime _ us & lt1120) //0

{

código IR = código IR | 0x00000000

if(cn<33)códigoIR = código IR>>1;

}

else if(time_us>1920. & amptime_us<2120)//1t>1950.

&t & lt2150

{

código IR = código IR | 0x80000000

if(cn <33)códigoIR = código IR >>1;

}

//else if(time_us>10000.&time_us<11000){ird code = IRcode;cn=34}//Se encontró un código duplicado

//cn se utiliza para registrar el bits de datos recibidos.

}

cn++;

if (cn==34)

{ nuevo código ir=1;

tr 1 = 0;

Irdcode = IRcodecn = 0;

}//Después de leer el código de 32 bits, genera un nuevo código.

}

// - timer_ISR -

Voidtimer0 _ ISR() usa 2//La función de interrupción del temporizador 0 interrumpe 1

{

TR0 = 0;

TH0 = 0xff//Inicializa el temporizador 0, temporización 0,2 ms, oscilador de cristal 11,0592 MHZ.

TL0 = 0x47

TR0 = 1;

if(++uc1ms == 5)

{

UC 1ms = 0;

b 1 msint = 1;

if(++uc3ms==8)

{

uc3ms = 0;

B3 msint = 1;

senddatodispdevice(); //n* ms enviar pantalla.

}

}

}//void Timer0IntProg() interrupción 1 usa 1

void timer 1 _ ISR() interrupción 3 usando 3//función de interrupción del temporizador 1

{

tr 1 = 0;

th 1 = 0x 00 //Inicializa el temporizador 1

TL 1 = 0x 00;

tr 1 = 1;

}

//-senddatodispdevice-

void SendDataToDispDevice ()

{

Carácter sin firmar n;

//Watchdog();

if(++ucDispOrder >= 2 )UC disporder = 0;//Siguiente guía de visualización

//El siguiente es el control de bits para enviar datos de control.

if(ucDispOrder==0)

{ led 1 = 0

led 2 = 1

nop();

nop();

}

if(b3msint==1)

{if(ucDispOrder==1) p>

{ led 2 = 0

led 1 = 1

nop(); >

}

}

//Lo siguiente es enviar los datos de visualización.

n = datos LED[ucDispData[ucDispOrder]];

P0 = n

} //void SendDataToDispDevice()

// - principal() -

void main()

{

init();

beep();< / p>

mientras(1)

{

tiempo Prog();

IR _ proceso();

mostrar ();

}

}

void Ir_process()

{

If(NewIRcode= = 1) //Si hay un nuevo código de control remoto por aprender,

{

new ircode = 0 //Se borra después de la lectura, lo que indica que se ha leído el nuevo código. .

código personalizado =(ird code>>16);//Obtiene el botón en el código de infrarrojos.

//Obtén el código de usuario inferior de 8 dígitos.

Lcustomcode = customcode & gt& gt8;//Toma los 8 bits inferiores y presiona la tecla de código.

datacode=(unsigned Character)(customcode & amp0x 00 ff); //Toma los 8 bits superiores y presiona la tecla de código.

Rdatacode = Lcustomcode//El código inverso bajo de 8 dígitos de la clave del código.

if(~código RDA!=código de datos)

{ derecho de datos = 0

código ird = 0; code = rdata code = 0;

}//Verificar código de usuario, anti-código.

Otro

{ derecho de datos = 1;

IR _ E = 1

mycode = código de datos}

if(datos correctos = = 1){ bKeySound = 1; datos correctos = 0;}

}

}

Pantalla vacía()

{

/*Carácter sin firmar a[2];

a[0]= mi código & gt& gt4;

a[1]= mi código & 0x0f

ET0 = 0;

UC dispdata[0]= a[0 ];

UC dispdata[1]= a[1];

ET0 = 1;*/

if(IR_E==1)

{

ET0 = 0;

Datos de visualización de UC[0]= mi código & 0x0f

mycode = mycode & gt& gt4; p>UC dispdata[1]= mi código & 0x0f

IR _ E = 0

ET0 = 1

}

}

/************************************ **** *********************/

Retraso no válido (carácter x sin firmar)//x * 0,14 milisegundos

{

Carácter sin firmar a;

while(x -)

{

for(a = 0; a<13;a++){; }

}

}

/************************ * *****************************************/

Bip no válido()

{

Caracteres sin firmar I;

for(I = 0;i<100;i++)

{

Retraso(4);

Bip=! Beep; //Bip invertido

}

Beep = 1;

//Apaga el timbre

}