⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pt2262_decode.c

📁 pt2262芯片解码,at89c51的,如果要用到产品用,需再增加一些软件滤波来提高其可靠性,供学习用,
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************************************************
**				                   
**                                   
**
**                                  (c) Copyright 2007-2010, gl
**                                           All Rights Reserved
**
**                                                  V1.00.0
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: pt2262_decode.c(keilc51)
**创   建   人: gl
**最后修改日期: 2007年01月15日
**描        述: c51:V6.12 mcu:at89c52,晶振:12.0M,pt2262 IR 解码,振荡电阻为470K
**              在1602上显示解码出来的按键码,1602LCM驱动部分来自JJJ(proteus例子),在此对他表示感谢,
**				解码程序为原创(采用定时中断查询),在硬件上调试ok,
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: gl
** 版  本: V1.00.0
** 日 期: 2007年01月15日
** 描 述: 
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: gl
** 日 期: 2007年01月21日
** 描 述: 在硬件上调试ok,
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include <reg51.h>
#include <math.h>
#include <intrins.h>
/*********************************************************/
/*io引脚定义*/
sbit 	IRPIN 	= P0^0;
sfr		FUCTIONOUT_IO	= 0x90;//P0,功能输出io
/*常量定义*/	
#define TASKS		8	//任务数
#define KEYS		10	//按键数
/*
#define _4A			1	//1.6,2.4 4>_4A>=1  
#define _12A		5	//5.6,6.4 6>_12A>4
#define _124A		62	//12.4ms,18.6ms70>124A>50
*/
/*红外解码相关常量定义*/ //晶振12M,定时器0中断时间为250us条件下的值
//用示波器观察得出4A的时间为0.6ms,12A的时间为1.4ms
#define _4AMIN		1
#define _4AMAX		3
#define _12AMIN		4
#define _12AMAX		8
#define _124AMIN	50//64
#define _124AMAX	70	
/*********************************************************/
/*标志位定义*/
unsigned char bdata FLAG;
sbit    IRPINOLDFG   	= FLAG^0;		//上次电平的状态标志,ir脚上升沿下降判断时要用到
sbit 	_1SFG 		 	= FLAG^1;		//0.5S时钟标志
sbit 	_synbitokFG 	= FLAG^2;		//检测同步位标志
/*变量定义*/
unsigned char i,keys = 13,have_count;
unsigned char bitcount1,bit0checkcount,bit1checkcount;
unsigned int hightcount,lowcount;
unsigned int hightcountold,lowcountold;
unsigned long int ircode;
unsigned int _03UScount;
unsigned char _1Scount,_1Mcount,_1Hcount;

const unsigned long int ircodetable[KEYS] = //红外24位码值,高16位为地址码,低8位为数据码(4个数据)	
{
/********************************************************************
**地址码A0接地,其它地址位悬空,数据码共4个键,没有按下时为0,按下后为1
**由于data空间不够,只做了10个键,有个问题不理解
**当是当增大KEY值时,data是以每4个字节增加的
**如果真是这样那么24位解码将占用很大的data
**空间,建议码值改为12位.
********************************************************************/
0x1555c0,//b'0001 0101 0101 0101 1100 0000		//key0
0x155530,// b'0001 0101 0101 0101 0011 0000		//key1
0x15550c,//b'0001 0101 0101 0101 0000 1100		//key2
0x155503,//b'0001 0101 0101 0101 0000 0011		//key3
//

0x1555f0,//b'0001 0101 0101 0101 1111 0000		//key0+key1
0x1555cc,//b'0001 0101 0101 0101 1100 1100		//key0+key2
0x1555c3,//b'0001 0101 0101 0101 1100 0011		//key0+key3
0x15553c,//b'0001 0101 0101 0101 0011 1100		//key1+key2
0x155533,//b'0001 0101 0101 0101 0011 0011		//key1+key3
0x15550f,//b'0001 0101 0101 0101 0000 1111		//key2+key3
//
/*
0x1555fc,//b'0001 0101 0101 0101 1111 1100		//key0+key1+key2
0x1555f3,//b'0001 0101 0101 0101 1111 0011		//key0+key1+key3
0x1555ff,//b'0001 0101 0101 0101 1111 1111		//key0+key1+key2+key3
*/
};
/***********************************************************************************************************/
//1602LCM驱动
unsigned long int Count = 0;
////Port Definitions**********************************************************
sbit LcdRs		= P3^7;
sbit LcdRw		= P3^6;
sbit LcdEn  	= P3^5;
sfr  DBPort 	= 0xA0;		//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

//内部等待函数**************************************************************************
unsigned char LCD_Wait(void)
{
	LcdRs=0;
	LcdRw=1;	_nop_();
	LcdEn=1;	_nop_();
	while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,
						 //可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80
						 //实际硬件时打开此语句
	LcdEn=0;
	return DBPort;		
}
//向LCD写入命令或数据************************************************************
#define LCD_COMMAND			0      // Command
#define LCD_DATA			1      // Data
#define LCD_CLEAR_SCREEN	0x01      // 清屏
#define LCD_HOMING  		0x02      // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
	LcdEn=0;
	LcdRs=style;
	LcdRw=0;		_nop_();
	DBPort=input;	_nop_();//注意顺序
	LcdEn=1;		_nop_();//注意顺序
	LcdEn=0;		_nop_();
	LCD_Wait();	
}
void Delay1ms(unsigned int count)
{
	unsigned int i,j;
	for(i=0;i<count;i++)
	for(j=0;j<120;j++);
}
//设置显示模式************************************************************
#define LCD_SHOW			0x04    //显示开
#define LCD_HIDE			0x00    //显示关	  

#define LCD_CURSOR			0x02 	//显示光标
#define LCD_NO_CURSOR		0x00    //无光标		     

#define LCD_FLASH			0x01    //光标闪动
#define LCD_NO_FLASH		0x00    //光标不闪动

void LCD_SetDisplay(unsigned char DisplayMode)
{
	LCD_Write(LCD_COMMAND, 0x08|DisplayMode);	
}

//设置输入模式************************************************************
#define LCD_AC_UP			0x02
#define LCD_AC_DOWN			0x00      // default

#define LCD_MOVE			0x01      // 画面可平移
#define LCD_NO_MOVE			0x00      //default

void LCD_SetInput(unsigned char InputMode)
{
	LCD_Write(LCD_COMMAND, 0x04|InputMode);
}

//移动光标或屏幕************************************************************
/*
#define LCD_CURSOR		0x02      
#define LCD_SCREEN		0x08
#define LCD_LEFT		0x00
#define LCD_RIGHT		0x04
void LCD_Move(unsigned char object, unsigned char direction)
{
	if(object==LCD_CURSOR)
		LCD_Write(LCD_COMMAND,0x10|direction);
	if(object==LCD_SCREEN)
		LCD_Write(LCD_COMMAND,0x18|direction);
}
*/
//初始化LCD************************************************************
void LCD_Initial()
{
	Delay1ms(1000);
	LcdEn=0;
	LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵
	LCD_Write(LCD_COMMAND,0x38);
	LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
	LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
	LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
}

//************************************************************************
void GotoXY(unsigned char x, unsigned char y)
{
	if(y==0)
		LCD_Write(LCD_COMMAND,0x80|x);
	if(y==1)
		LCD_Write(LCD_COMMAND,0x80|(x+0x40));
}
void Print(unsigned char *str)
{
	while(*str!='\0')
	{
		LCD_Write(LCD_DATA,*str);
		str++;
	}
}
/*
void LCD_LoadChar(unsigned char user[8], unsigned char place)
{
	unsigned char i;
	LCD_Write(LCD_COMMAND,0x40|(place*8));
	for(i=0; i<8; i++)
		LCD_Write(LCD_DATA,user[i]);
}
*/
//************************************************************************
//** 修改人: gl
//** 日 期: 2007年01月21日,由原来的5位改为8位,t改为long
unsigned char TempBuffer[10];
void IntToStr(unsigned long int t, unsigned char *str, unsigned char n) 
{
	unsigned char a[8]; char i, j;        
   	a[0]=(t/10000000)%10;                                      	
	a[1]=(t/1000000)%10;                                       	
	a[2]=(t/100000)%10;                      	
	a[3]=(t/10000)%10;         //取得整数值到数组         	
	a[4]=(t/1000)%10;                                     	
	a[5]=(t/100)%10;                                      	
	a[6]=(t/10)%10;                                       	
	a[7]=(t/1)%10;                                        	
                                                      
	for(i=0; i<8; i++)         //转成ASCII码 ;5             	
		a[i]=a[i]+'0';                                    	
	for(i=0; a[i]=='0' && i<=3; i++);                     	
	for(j=8-n; j<i; j++)       //填充空格   ;5-n              	
		{ *str=' ';  str++; }                             	
	for(; i<8; i++)                 //   ;5                   	
		{ *str=a[i]; str++; }  //加入有效的数字           	
	*str='\0'; 
} 
/***********************************************************************************************************/

/*********************************************************************************************************
** 函数名称: init
** 功能描述: 初始化
** 输 入: 无
** 输 出: 
** 全局变量: 
** 调用模块: 
**
** 作 者: gl
** 日 期: 2007年01月15日
**-------------------------------------------------------------------------------------------------------
** 修改人: gl
** 日 期: 2007年01月21日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void 	init() //端口初始化
{ 
	P0 = 0xff;		//p0.0为ir输入引脚,作为输一定要执行这一条
	FUCTIONOUT_IO = 0;//输出功能,关所有继电器
	IE = 0;
	EA = 1;
	ET0 = 1;
	TMOD = 0X02;	//T0工作在模式2下,
	TL0 = 0x06;		//定时中断时间为250us,12M晶振
	TH0 = 0x06;		//重装初值
	TR0 = 1;
	TR1 = 0;
	_synbitokFG = 0;	//同步位检测标志
  	IRPINOLDFG = 1;		//因为无信号时,为高电平
	LCD_Initial();		//LCM1602A初始化

}
/*********************************************************************************************************
** 函数名称: KeyScan
** 功能描述: 读键
** 输 入: 无
** 输 出: 
** 全局变量: 
** 调用模块: 
**
** 作 者: gl
** 日 期: 2007年01月15日
**-------------------------------------------------------------------------------------------------------
** 修改人: gl
** 日 期: 2007年01月15日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void KeyScan()
{
	

}
/*********************************************************************************************************
** 函数名称: Display
** 功能描述: LCM1602A显示
** 输 入: 无
** 输 出: 
** 全局变量: 
** 调用模块: 
**
** 作 者: gl
** 日 期: 2007年01月15日
**-------------------------------------------------------------------------------------------------------
** 修改人: gl
** 日 期: 2007年01月21日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Display()
{

	IntToStr(Count,&TempBuffer[0],8);	
	GotoXY(0,0);
	Print("CODE:");Print(&TempBuffer[0]);
	GotoXY(0,1);
	switch (keys)
	{
		case 0:	Print("key0            ");	
		break;
		case 1:	Print("key1            ");	
		break;
		case 2:	Print("key2            ");	
		break;
		case 3:	Print("key3            ");	
		break;
		case 4:	Print("key0+key1       ");	
		break;
		case 5:	Print("key0+key2       ");	
		break;
		case 6:	Print("key0+key3       ");	
		break;
		case 7:	Print("key1+key2       ");	
		break;
		case 8:	Print("key1+key3       ");
		break;
		case 9:	Print("key2+key3       ");
		break;
/*
		case 10:Print("key0+key1+key2  ");	//由于data空间不够,只做了10个键,有个问题不理解
		break;								//当是当增大KEY值时,data是以每4个字节增加的
		case 11:Print("key0+key1+key3  ");	//如果真是这样那么24位解码将占用很大的data
		break;								//空间,建议码值改为12位(悬空地址信号不知如何处理).
		case 12:Print("key0key1key2key3");	
		break;
*/
		default :Print("NO key          ");
		break;
	}
}

/*********************************************************************************************************
** 函数名称: GetAd
** 功能描述: 读ad转换结果
** 输 入: 无
** 输 出: 
** 全局变量: 
** 调用模块: 
**
** 作 者: gl
** 日 期: 2007年01月15日
**-------------------------------------------------------------------------------------------------------
** 修改人: gl
** 日 期: 2007年01月15日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GetAd()
{
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -