📄 pt2262_decode.c
字号:
/*********************************************************************************************************
**
**
**
** (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 + -