//delay.c
#include"./delay/delay.h"
void delay_us(unsigned char t)
{
while(--t);
}
void delay_ms(unsigned char t)
{
while(t--)
{
delay_us(200);
delay_us(245);
}
}
/*void delay_s(unsigned char t)
{
unsigned char i;
for(i = 0;i < t;i++)
{
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
}
}*/
//LCD.c
#include<reg52.h>
#include<intrins.h>
#include "./LCD/LCD.h"
#include"./delay/DELAY.H"
sbit RS = P2^4;
sbit RW = P2^5;
sbit EN = P2^6;
#define _Nop() _nop_() //定义空指令
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
#define DataPort P0
void LCD_Write_Com(unsigned char com) //写入命令
{
delay_ms(5);
RS_CLR;
RW_CLR;
EN_SET;
DataPort = com;
_nop_();
EN_CLR;
}
void LCD_Write_Data(unsigned char Data) //写入数据
{
delay_ms(5);
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}
void LCD_Clear(void) //清屏
{
LCD_Write_Com(0x01);
delay_ms(5);
}
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) //写入字符串
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
while (*s)
{
LCD_Write_Data( *s);
s ++;
}
}
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) //写入字符
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
LCD_Write_Data( Data);
}
void LCD_Init(void) //初始化
{
LCD_Write_Com(0x38); /*显示模式设置*/
delay_ms(5);
LCD_Write_Com(0x38);
delay_ms(5);
LCD_Write_Com(0x38);
delay_ms(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08); /*显示关闭*/
LCD_Write_Com(0x01); /*显示清屏*/
LCD_Write_Com(0x06); /*显示光标移动设置*/
delay_ms(5);
LCD_Write_Com(0x0C); /*显示开及光标设置*/
}
//uart.c
#include<reg52.h>
#include"./uart/uart.h"
void uart_init()
{
SCON = 0x50; //设置串口工作模式,打开接受允许
//SM0 = 0 ; SM1 = 1 ; REN = 0 ;
//TMOD &= 0x0f;
TMOD |= 0x20; //设置定时器1为工作方式2
TH1 = 0xfd; //波特率9600
//ET1 = 0;
TR1 = 1;
//EA = 1;
//ES = 1;
}
void uart_send_byte(unsigned char byte)
{
SBUF = byte;
//TI位自动置1,手动清0
while(!TI);// while(TI != 1);
TI = 0;
}
void uart_send_string(unsigned char *string)
{
while(*string)
{
uart_send_byte(*string);
string++;
}
}
//ir.c
#include<reg52.h>
#include"./uart/uart.h"#include"./LCD/LCD.h"
sbit led1 = P1^0;
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
sbit led5 = P1^4;
sbit led6 = P1^5;
sbit led7 = P1^6;
sbit led8 = P1^7;
sbit IR_IN = P3^2;
unsigned int irtime;
bit irok = 0;
bit startflag = 0;
unsigned char led[9];
unsigned char irdata[34];
unsigned char irchg[14];
unsigned char bitnum = 0;
void int0_init()
{
IT0 = 1; //设置外部中断的触发方式
EA = 1;
EX0 = 1;
}
void timer0_init()
{
EA = 1;
TMOD |= 0x02;
TH0 = 0;
ET0 = 1;
TR0 = 1;
}
void timer0_isr() interrupt 1
{
irtime++;//0.256ms 引导码 13.5/0.256 = 52 1.12/0.256 = 4 0.56+1.685/0.256 = 8
}
/*unsigned char to_hex(unsigned char a,unsigned char b,unsigned char c,unsigned char d)
{
unsigned char i;
i = (a - '0')*8 + (b - '0')*4 + (c - '0')*2 + (d - '0');
if(i <= 9)
return i+'0';
else
return i+'0'+49;
}
void chg_hex()
{
irchg[0] = irdata[0];
irchg[1] = ' ';
irchg[4] = ' ';
irchg[7] = ' ';
irchg[10] = ' ';
irchg[13] = '\0';
irchg[2] = to_hex(irdata[1],irdata[2],irdata[3],irdata[4]);
irchg[3] = to_hex(irdata[5],irdata[6],irdata[7],irdata[8]);
irchg[5] = to_hex(irdata[9],irdata[10],irdata[11],irdata[12]);
irchg[6] = to_hex(irdata[13],irdata[14],irdata[15],irdata[16]);
irchg[8] = to_hex(irdata[24],irdata[23],irdata[22],irdata[21]);
irchg[9] = to_hex(irdata[20],irdata[19],irdata[18],irdata[17]);
irchg[11] = to_hex(irdata[32],irdata[311],irdata[30],irdata[29]);
irchg[12] = to_hex(irdata[28],irdata[27],irdata[26],irdata[25]);
}*/
unsigned char change(unsigned char * str,unsigned char n)
{
unsigned char temp,i,value;
temp = 0x01;
value = 0;
for(i = 0;i < 4;i++)
{
value <<= 1;
value |= str[n+3-i] & temp;
}
if(value >= 0&&value <= 9)
return value+'0';
else if(value >=10 && value <= 15)
return value+'a'-10;
else
return 0;
}
void transform()
{
irchg[0] = '#';
irchg[1] = ' ';
irchg[2] = change(irdata,5);
irchg[3] = change(irdata,1);
irchg[4] = ' ';
irchg[5] = change(irdata,13);
irchg[6] = change(irdata,9);
irchg[7] = ' ';
irchg[8] = change(irdata,21);
irchg[9] = change(irdata,17);
irchg[10] = ' ';
irchg[11] = change(irdata,29);
irchg[12] = change(irdata,25);
irchg[13] = '\0';
//if()
}
void led_show()
{
unsigned char temp;
if(irchg[9] >= 'a' && irchg[9]<= 'f')
irchg[9] -= 39;
temp = (irchg[8]- '0')*16+(irchg[9] - '0');
switch(temp)
{
case 0x45:led1 = ~led1;LCD_Clear();LCD_Write_Char(7,0,'1');break;
case 0x46:led2 = ~led2;LCD_Clear();LCD_Write_Char(7,0,'2');break;
case 0x47:led3 = ~led3;LCD_Clear();LCD_Write_Char(7,0,'3');break;
case 0x44:led4 = ~led4;LCD_Clear();LCD_Write_Char(7,0,'4');break;
case 0x40:led5 = ~led5;LCD_Clear();LCD_Write_Char(7,0,'5');break;
case 0x43:led6 = ~led6;LCD_Clear();LCD_Write_Char(7,0,'6');break;
case 0x07:led7 = ~led7;LCD_Clear();LCD_Write_Char(7,0,'7');break;
case 0x15:led8 = ~led8;LCD_Clear();LCD_Write_Char(7,0,'8');break;
case 0x09:LCD_Clear();LCD_Write_Char(7,0,'9');break;
case 0x16:LCD_Clear();LCD_Write_String(7,0,"10");break;
case 0x19:LCD_Clear();LCD_Write_String(7,0,"11");break;
case 0x0d:LCD_Clear();LCD_Write_String(7,0,"12");break;
case 0x0c:LCD_Clear();LCD_Write_String(7,0,"13");break;
case 0x18:LCD_Clear();LCD_Write_String(7,0,"14");break;
case 0x5e:LCD_Clear();LCD_Write_String(7,0,"15");break;
case 0x08:LCD_Clear();LCD_Write_String(7,0,"16");break;
case 0x1c:LCD_Clear();LCD_Write_String(7,0,"17");break;
case 0x5a:LCD_Clear();LCD_Write_String(7,0,"18");break;
case 0x42:LCD_Clear();LCD_Write_String(7,0,"19");break;
case 0x52:LCD_Clear();LCD_Write_String(7,0,"20");break;
case 0x4a:LCD_Clear();LCD_Write_String(7,0,"21");break;
}
}
void main()
{
timer0_init();
int0_init();
uart_init();
LCD_Init();
while(1)
{
if(irok == 1)
{
uart_send_string(irdata);
uart_send_byte('\n');
uart_send_string(irchg);
uart_send_byte('\n');
led_show();
irok = 0;
}
}
}
void int0_isr() interrupt 0
{
unsigned char temp;
if(startflag)
{
if(irtime>=40&&irtime<=60)
{
bitnum = 0;
}
if(irtime < 6)
{
temp = '0';
}
else if(irtime > 6 && irtime < 10)
{
temp = '1';
}
else
{
temp = '#';
}
irdata[bitnum] = temp;
bitnum++;
irtime = 0;
if(bitnum == 33)
{
irok = 1;
irdata[33] = '\0';
transform();
bitnum = 0;
startflag = 0;
}
}
else
{
irtime = 0;
startflag = 1;
}
}