微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STC12C5410AD学习板---红外解码

STC12C5410AD学习板---红外解码

时间:11-18 来源:互联网 点击:

/********************LCD12864**************************/
void LCD_SEND(uchar date);
void LCD_SCOM(bit st,uchar date);
void LCD_DELAY(void);
void LCD_INIT(void);
void LCD_write(uchar *p);
void LCD_LOCAL(uchar x,uchar y,uchar *p);
void LCD_cblank(uchar x,uchar y);
void LCD_count(long s,uchar x1,uchar y1,uchar x,uchar y,uchar *p);
void DELAYLCD(uchar t);
/*****************************************************/
/****************************lcd12864************************************/
void DELAYLCD(uchar t)
{
while(--t);
}

void LCD_SEND(uchar date)
{
uchar i;
LCD_SCLK=0;
for(i=0;i<8;i++)
{
LCD_SID=date&0x80;
LCD_SCLK=1;
LCD_SCLK=0;
date<=1;
}
}
void LCD_SCOM(bit st,uchar date)
{
uchar st_temp,hdate,ldate;
if(st)
st_temp=0xfa;
else st_temp=0xf8;
hdate=date&0xf0;
ldate=date&0x0f;
ldate <= 4;
LCD_CS = 1;
LCD_SEND(st_temp);
LCD_SEND(hdate);
LCD_SEND(ldate);
LCD_CS = 0;
DELAYLCD(38);
}
void LCD_DELAY(void)
{ uchar s;
s=10;
while(--s)
DELAYLCD(250);
}
void LCD_INIT(void)
{
LCD_SCOM(0,0x30);
LCD_DELAY();
LCD_SCOM(0,0x0c);
LCD_DELAY();
LCD_SCOM(0,0x01); //清屏,将DDRAM的地址计数器归零
LCD_DELAY();
}
void LCD_write(uchar *p)
{
while(*p)
{
LCD_SCOM(1,*p);
p++;
}
}
void LCD_LOCAL(uchar x,uchar y,uchar *p) //lcd string (x,y) write!
{
switch (x)
{
case 1:LCD_SCOM(0,0x7f+y); LCD_write(p);break;
case 2:LCD_SCOM(0,0x8f+y); LCD_write(p);break;
case 3:LCD_SCOM(0,0x87+y); LCD_write(p);break;
case 4:LCD_SCOM(0,0x97+y); LCD_write(p);break;
default :LCD_SCOM(0,0x7f+y); LCD_write(p);
}
}
void LCD_cblank(uchar x,uchar y)
{
switch (x)
{
case 1:LCD_SCOM(0,0x7f+y); LCD_SCOM(0,0x0d);break;
case 2:LCD_SCOM(0,0x8f+y); LCD_SCOM(0,0x0d);break;
case 3:LCD_SCOM(0,0x87+y); LCD_SCOM(0,0x0d);break;
case 4:LCD_SCOM(0,0x97+y); LCD_SCOM(0,0x0d);break;
default :LCD_SCOM(0,0x7f+y); LCD_SCOM(0,0x0d);
}
}

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

/*******************************************************************************/
#endif

SAA3010_Rncode.H 如下:

/*****Program Author : ZhengWen(ClimberWin) *****/
/*****E_mail :cooldianzi@163.com *****/
/*************************************************************/
/*****File Function : SAA3010 IR_Input soft recode *****/
/*****Compile Date : 2009/2/4 *****/
/*****Edition Info : V1.0 *****/
/*****Amend Date : *****/
/*************************************************************/
/***************对红外遥控器SAA3010软件解码*******************/
#ifndef __SAA3010_Rncode__
#define __SAA3010_Rncode__
#define uchar unsigned char
#include
sbit IR_Input=P3^4;
uchar SAA3010_CODE[4];

void SAA3010_Recode(void);
void Delay100us(uchar i);

/*************SAA3010解码程序**************/
void SAA3010_Recode(void)
{
unsigned char i, j;
bit FBIT;
// IR_Input 由高变低,跳过第一次采样
for (i=0; i<4; i++)
{
SAA3010_CODE[i] =0x00;
}
/*--------------------------------------
曼彻斯特码:
输入二元码 Manchester码
0 01
1 10
****************************************/
// 设为第二次采样,采样时间间隔800uS
Delay100us(8);

if (!IR_Input)
{
// 因为SAA3010的起始位为1
SAA3010_CODE[0] |=0x01;
SAA3010_CODE[0] <= 1;
// 起始第二位一次采样
Delay100us(8);
if (IR_Input)
{ // 采样是1
SAA3010_CODE[0] |=0x01;
FBIT = 1;
}
else
{ // 采样是0
FBIT = 0;
}
if (FBIT)
{ // 若第一次采样是1
while (IR_Input);
}
else
{
while (!IR_Input);
}
// 二次采样
Delay100us(8);
//----------------------------------------------------------------------------
// 采样控制位
// 一次采样
Delay100us(8);
if (IR_Input)
{
SAA3010_CODE[1] |=0x01;
FBIT = 1;
}
else
{
FBIT = 0;
}

if (FBIT)
{
while (IR_Input);
}
else
{
while (!IR_Input); // 等待IR_Input上升
}
// 二次采样
Delay100us(8);
//----------------------------------------------------------------------------------
// 收集系统码(5位)
for (j=0; j<5; j++)
{
// 一次采样
Delay100us(8);
if (IR_Input)
{
SAA3010_CODE[2] |=0x01;
FBIT = 1;
}
else
{
FBIT = 0;
}

if (FBIT)
{
while (IR_Input);
}
else
{
while (!IR_Input);
}
// 二次采样
Delay100us(8);
SAA3010_CODE[2] <= 1;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top