1、/*copyright 2007,ShangHai HaoTun Electronic Technology co.,Ltd
*
*This sample is used for control light by infrared .
*
*write by Shifang
*
*V1.1
*/
//该程序使用LCD1602显示
#include
2、e TURE 1 #define FALSE 0 //////////////////////////////////////////////// sbit IR=P3^2;//红外接口标志 sbit RS = P2^4;//Pin4 sbit RW = P2^5; //Pin5 sbit E = P2^6;//Pin6 #define Data P0 //数据端口 unsigned int hour,minute,second,count; char code Tab[16]="0123456789ABCDEF"; char data Tim
3、eNum[]=" "; char data Test1[]=" "; //////////////////////////////////////////// unsigned char irtime;//红外用全局变量 bit irpro_ok,irok; unsigned char IRcord[4]; unsigned char irdata[33]; void ShowString (unsigned char line,char *ptr); ////////////////////
4、////////////////////////// void Delay(unsigned char mS); void Ir_work(void); void Ircordpro(void); //////////////////////////////////////////////////////////////// void Delay(unsigned char mS)//delay mS { unsigned char us,usn; while(mS!=0) { usn = 4; while(usn!=0)
5、{ us=0xf0; while (us!=0) {us--;}; usn--; } mS--; } } ////////////////////////////////////////////////////////////////// //************************************************************* // //////////////////////////////////////////////////////////////////
6、 void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数 { irtime++; } /////////////////////////////////////////////////////////////////////// void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数 { static unsigned char i; static bit startflag; if(startflag) { if(irtime<6
7、3&&irtime>=33)//引导码 TC9012的头码 i=0; irdata[i]=irtime; irtime=0; i++; if(i==33) { irok=1; i=0; } } else {irtime=0;startflag=1;} } ///////////////////////////////////////////////////////////////
8、///// void TIM0init(void)//定时器0初始化 { TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值 TH0=0x00;//reload value TL0=0x00;//initial value ET0=1;//开中断 TR0=1; } /////////////////////////////////////////////////////////////////// void EX0init(void) { IT0 = 1; // Configure interrupt 0 for fa
9、lling edge on /INT0 (P3.2) EX0 = 1; // Enable EX0 Interrupt EA = 1; } /****************************************************************/ /******************************************************************/ void Ir_work(void)//红外键值散转程序 { TimeNum[5] = Tab[IRcord[0
10、]/16]; TimeNum[6] = Tab[IRcord[0]%16]; TimeNum[8] = Tab[IRcord[1]/16]; TimeNum[9] = Tab[IRcord[1]%16]; TimeNum[11] = Tab[IRcord[2]/16]; TimeNum[12] = Tab[IRcord[2]%16]; TimeNum[14] = Tab[IRcord[3]/16]; TimeNum[15] = Tab[IRcord[3]%16]; ShowString(1,TimeN
11、um); irpro_ok=0; } /*****************************************************************/ void Ircordpro(void)//红外码值处理函数 { unsigned char i, j, k; unsigned char cord,value; k=1; for(i=0;i<4;i++)//处理4个字节 { for(j=1;j<=8;j++) //处理1个字节8位 { co
12、rd=irdata[k]; if(cord>7)//大于某值为1 { value=value|0x80; } else { value=value; } if(j<8) { value=value>>1; } k++; } IRcord[i]=value; value=0; } irpro_ok=1;//处理
13、完毕标志位置1 } /******************************************************************/ void DelayUs(unsigned char us)//delay us { unsigned char uscnt; uscnt=us>>1;/* Crystal frequency in 12MHz*/ while(--uscnt); } /******************************************************************/ v
14、oid DelayMs(unsigned char ms)//delay Ms { while(--ms) { DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); } } void WriteCommand(unsigned char c) { DelayMs(5);//short delay before operation E=0; RS=0; RW=0; _nop_(); E=1; Data=c; E=0; } /********
15、/ void WriteData(unsigned char c) { DelayMs(5); //short delay before operation E=0; RS=1; RW=0; _nop_(); E=1; Data=c; E=0; RS=0; } /*********************************************************************/ void ShowChar(un
16、signed char pos,unsigned char c) { unsigned char p; if (pos>=0x10) p=pos+0xb0; //是第二行则命令代码高4位为0xc else p=pos+0x80; //是第二行则命令代码高4位为0x8 WriteCommand (p);//write command WriteData (c); //write data } /*************************************************************************/
17、void ShowString (unsigned char line,char *ptr) { unsigned char l,i; l=line<<4; for (i=0;i<16;i++) ShowChar (l++,*(ptr+i));//循环显示16个字符 } /*********************************************************************/ void InitLcd() { DelayMs(15); WriteCommand(0x38); //display mode WriteCom
18、mand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x06); //显示光标移动位置 WriteCommand(0x0c); //显示开及光标设置 WriteCommand(0x01); //显示清屏 } ///////////////////////////////////////////////////////////////// void main(void) { EX0init(); // Enable Global Interrupt Fla
19、g TIM0init(); InitLcd();// DelayMs(15); sprintf(Test1," ");//the first line ShowString(0,Test1); sprintf(TimeNum,"Code ");//the second line ShowString(1,TimeNum); while(1)//主循环 { if(irok) { Ircordpro(); irok=0; } if(irpro_ok)//step press key { Ir_work(); } } }






