ir.c
#include <reg52.h>
#include "./lcd/lcd.h"
unsigned int irtime = 0;
bit startflag = 0;
bit irok = 0;
bit irprocessok;
unsigned char irdata[33];
unsigned char disdata[8];
unsigned char ircode[8];
#if 0
void display(unsigned char num)
{
lcd_dis_byte(1,1,num / 10 + '0');
lcd_dis_byte(1,2,num % 10 + '0');
}
#endif
unsigned char irprocess()
{
unsigned char i;
unsigned char j;
unsigned char k = 1;
unsigned char temp;
for(j = 0; j < 4; j++)
{
for(i = 0; i < 8; i++)
{
temp >>= 1;
if(irdata[k] > 6)
{
temp += 0x80;
}
k++;
}
ircode[j] = temp;
}
switch(ircode[2])
{
case 0x45:
case 0x46:
case 0x47:
case 0x44:
case 0x40:
case 0x43:
case 0x07:
case 0x15:
case 0x09:
case 0x19:
case 0x0d:
case 0x16:
{
return 0;
break;
}
case 0x0c:
{
return 1;
break;
}
case 0x18:
{
return 2;
}
case 0x5e:
{
return 3;
}
case 0x8:
{
return 4;
}
case 0x1c:
{
return 5;
}
case 0x5a:
{
return 6;
}
case 0x42:
{
return 7;
}
case 0x52:
{
return 8;
}
case 0x4a:
{
return 9;
}
default:
{
return 0xff;
}
}
irprocessok = 1;
return 0xff;
}
void lcd_display()
{
unsigned char i;
unsigned char x = 1;
unsigned char y = 1;
for(i = 0; i < 4; i++)
{
if((ircode[i] / 16) > 9)
{
lcd_dis_byte(x,y,ircode[i] / 16 + 0x37);
}
else
{
lcd_dis_byte(x,y,ircode[i] / 16 + 0x30);
}
if((ircode[i] % 16) > 9)
{
lcd_dis_byte(x,y + 1,ircode[i] % 16 + 0x37);
}
else
{
lcd_dis_byte(x,y + 1,ircode[i] % 16 + 0x30);
}
y = y + 3;
}
}
void timer0_init()
{
EA = 1;
TMOD |= 0x02; //8位自动重装方式 TH0 = 0 , TL0 = 0
TH0 = 0;
TL0 = 0; //256us = 0.256ms
ET0 = 1;
TR0 = 1;
}
void timer0_isr() interrupt 1
{
irtime++;
}
void int0_init()
{
EA = 1;
IT0 = 1; //下降沿触发
EX0 = 1;
}
void int0_isr() interrupt 0
{
static unsigned char bitnum = 0;
if(1 == startflag) //不是第一次进外部中断 13.5 / 0.256 = 53
{
if((irtime > 40) && (irtime < 60))
{
bitnum = 0;
}
irdata[bitnum] = irtime;
bitnum++;
irtime = 0;
if(33 == bitnum)
{
irok = 1;
bitnum = 0;
startflag = 0;
}
}
else
{
startflag = 1;
irtime = 0;
}
}
void main()
{
unsigned char keynum;
timer0_init();
int0_init();
lcd_init();
while(1)
{
if(1 == irok)
{
irok = 0;
keynum = irprocess();
if(0xff != keynum)
{
lcd_display();
}
}
}
}
lcd.c
#include <reg52.h>
#include "../delay/delay.h"
#include "lcd.h"
/*====================================================
判断写入命令/数据函数
=====================================================*/
void lcd_write(unsigned char byte, unsigned char flag)
{
if(flag)
{
RS = 1; //选择数据寄存器
}
else
{
RS = 0; //选择指令寄存器
}
RW = 0; //写
E = 1; //选中LCD
LCDPORT = byte;
delay_us(5); //稳定
E = 0; //失能LCD
}
/*====================================================
LCD初始化函数
=====================================================*/
void lcd_init()
{
delay_ms(15);
lcd_write(0x38,LCD_WRITE_COM); //显示8位数据接口,两行显示,5*7点阵字符
delay_ms(5);
lcd_write(0x38,LCD_WRITE_COM);
delay_ms(5);
lcd_write(0x38,LCD_WRITE_COM);
delay_ms(5);
lcd_write(0x38,LCD_WRITE_COM);
delay_ms(5);
lcd_write(0x08,LCD_WRITE_COM); //关闭显示,关闭光标的闪烁
delay_ms(5);
lcd_write(0x01,LCD_WRITE_COM); //清屏
delay_ms(5);
lcd_write(0x06,LCD_WRITE_COM); //设置指针方式,画面不平移
delay_ms(5);
lcd_write(0x0c,LCD_WRITE_COM); //打开显示
delay_ms(5);
}
/*====================================================================================
写入字符函数
函数原型:void lcd_dis_byte(unsigned char x, unsigned char y, unsigned char byte);
说明:x为行(1——2),y为列(1——8)。
=====================================================================================*/
void lcd_dis_byte(unsigned char x, unsigned char y, unsigned char byte)
{
unsigned char add;
if(((0 == x) || (x > 2)) || ((0 == y) || (y > 16)))
{
return ;
}
add = 0x80 + (x - 1) * 0x40 + (y - 1);
lcd_write(add,LCD_WRITE_COM);
lcd_write(byte,LCD_WRITE_DATA);
}
#if 0
/*====================================================================================
写入字符串函数
函数原型:void lcd_dis_str(unsigned char x, unsigned char y, unsigned char *disdata);
说明:x为行(1——2),y为列(1——8)。
=====================================================================================*/
void lcd_dis_str(unsigned char x, unsigned char y, unsigned char *disdata)
{
unsigned char add;
if(((0 == x) || (x > 2)) || ((0 == y) || (y > 16)))
{
return ;
}
add = 0x80 + (x - 1) * 0x40 + (y - 1);
lcd_write(add,LCD_WRITE_COM);
while(*disdata != '\0')
{
lcd_write(*disdata,LCD_WRITE_DATA);
disdata++;
}
}
/*===========================================================================
时间显示函数
============================================================================*/
void lcd_dis_time()
{
lcd_write(0x80 + 4,LCD_WRITE_COM);
lcd_write((hour / 10) + 0x30,LCD_WRITE_DATA);
lcd_write((hour % 10) + 0x30,LCD_WRITE_DATA);
lcd_write((min / 10) + 0x30,LCD_WRITE_DATA);
lcd_write((min % 10) + 0x30,LCD_WRITE_DATA);
lcd_write((sec / 10) + 0x30,LCD_WRITE_DATA);
lcd_write((sec % 10) + 0x30,LCD_WRITE_DATA);
}
#endif
delay.c
/*==============================================
us延时函数
延时时间:time = 2 * t + 12
===============================================*/
void delay_us(unsigned char t)
{
while(--t);
}
/*==============================================
ms延时函数
===============================================*/
void delay_ms(unsigned char t)
{
while(t--)
{
delay_us(245);
delay_us(245);
}
}
#if 0
/*==============================================
s延时函数
===============================================*/
void delay_s(unsigned char t)
{
while (t--)
{
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
}
}
#endif
delay.h
#ifndef _DELAY_H_
#define _DELAY_H_
extern void delay_us(unsigned char t);
extern void delay_ms(unsigned char t);
extern void delay_s(unsigned char t);
#endif
lcd.h
#ifndef _LCD_H_
#define _LCD_H_
#define LCDPORT P0
#define LCD_WRITE_DATA 1
#define LCD_WRITE_COM 0
sbit RS = P2^4;
sbit RW = P2^5;
sbit E = P2^6;
extern void lcd_write(unsigned char byte, unsigned char flag);
extern void lcd_init();
extern void lcd_dis_str(unsigned char x, unsigned char y, unsigned char *disdata);
extern void lcd_dis_byte(unsigned char x, unsigned char y, unsigned char byte);
extern void lcd_dis_time();
#endif