试试这个
#include <STC15F2K60S2.H>
#include <intrins.h>
#define RXD P30
#define TXD P31
#define IRIN P32
#define Buzzer P33 //定义蜂鸣器IO口
#define LCD12864_SID P34 //定义LCD12864时钟IO口
#define LCD12864_SCLK P35 //定义LCD12864数据IO口
#define Write_Command 0xf8
#define Write_Data 0xfa
#define Read_Command 0xfc
#define Read_Data 0xfe
#define Setting_Basic_Instruction_Set 0x30
#define Setting_Extended_Instruction_Set_Drawing_Off 0x34
#define Setting_Extended_Instruction_Set_Drawing_On 0x36
#define Clear_Display 0x01
#define Entry_Mode_Cursor_Left 0x04
#define Entry_Mode_Entire_Right 0x05
#define Entry_Mode_Cursor_Right 0x06
#define Entry_Mode_Entire_Left 0x07
#define Display_Off 0x08
#define Display_On_Cursor_Off_Inverse_Off 0x0c
#define Display_On_Cursor_Off_Inverse_On 0x0d
#define Display_On_Cursor_On_Inverse_Off 0x0e
#define Display_On_Cursor_On_Inverse_On 0x0f
#define Cursor_Move_Left 0x10
#define Cursor_Move_Right 0x14
#define Display_Move_Left 0x18
#define Display_Move_Right 0x1c
bit Error_Flag;
unsigned char ms_50,Temp_Second,Temp;
unsigned char IRCOM[4];
unsigned char code Display_Hex[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
unsigned char code Display_Data1[64]=
{
" 红外遥控解码 " //0x80
" IR_Code: " //0x90
" " //0x88
" " //0x98
};
/*----------------------------延时10us@STC-Y5@11.0592MHz----------------------------*/
void Delay_10us(void)
{
unsigned char i;
_nop_();
_nop_();
i=25;
while(--i);
}
/*----------------------------延时x10us----------------------------*/
void Delay_x10us(unsigned char x)
{
while(x--)
Delay_10us();
}
/*----------------------------延时10ms@STC-Y5@11.0592MHz----------------------------*/
void Delay_10ms(void)
{
unsigned char i,j;
i=108;
j=145;
do
{
while(--j);
}while(--i);
}
/*----------------------------延时140us@STC-Y5@11.0592MHz----------------------------*/
void Delay_140us(void)
{
unsigned char i,j;
i=2;
j=126;
do
{
while(--j);
}
while(--i);
}
void Delay_x140us(unsigned char x)
{
while(x--)
Delay_140us();
}
/*----------------------------写1字节命令或数据----------------------------*/
void LCD12864_Write_Byte(unsigned char temp)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((temp<<i)&0x80)
LCD12864_SID=1;
else
LCD12864_SID=0;
LCD12864_SCLK=0;
LCD12864_SCLK=1;
}
}
/*----------------------------传送数据或者命令----------------------------*/
void LCD12864_Write(unsigned char Command,unsigned char temp)
{
LCD12864_Write_Byte(Command);
LCD12864_Write_Byte(temp&0xf0);
LCD12864_Write_Byte((temp<<4)&0xf0);
}
/*----------------------------清空GDRAM----------------------------*/
void Clear_GDRAM(void)
{
unsigned char i,j,k;
LCD12864_Write(Write_Command,Setting_Extended_Instruction_Set_Drawing_Off);
k=0x80;
for(i=0;i<32;i++)
{
LCD12864_Write(Write_Command,k++);
LCD12864_Write(Write_Command,0x80);
for(j=0;j<16;j++)
{
LCD12864_Write(Write_Data,0x00);
}
}
k=0x80;
for(i=0;i<32;i++)
{
LCD12864_Write(Write_Command,k++);
LCD12864_Write(Write_Command,0x88);
for(j=0;j<16;j++)
{
LCD12864_Write(Write_Data,0x00);
}
}
LCD12864_Write(Write_Command,Setting_Extended_Instruction_Set_Drawing_On);
}
/*----------------------------整页显示字符----------------------------*/
void Display_Text(unsigned char code *addr)
{
unsigned char i;
LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
LCD12864_Write(Write_Command,0x80); //设置DDRAM地址
Delay_10us();
for(i=0;i<16;i++)
{
LCD12864_Write(Write_Data,*addr);
addr++;
}
LCD12864_Write(Write_Command,0x90); //设置DDRAM地址
Delay_10us();
for(i=0;i<16;i++)
{
LCD12864_Write(Write_Data,*addr);
addr++;
}
LCD12864_Write(Write_Command,0x88); //设置DDRAM地址
Delay_10us();
for(i=0;i<16;i++)
{
LCD12864_Write(Write_Data,*addr);
addr++;
}
LCD12864_Write(Write_Command,0x98); //设置DDRAM地址
Delay_10us();
for(i=0;i<16;i++)
{
LCD12864_Write(Write_Data,*addr);
addr++;
}
}
/*----------------------------指定位置显示字符----------------------------*/
void Display_Data(unsigned char x,unsigned char y,unsigned char Data1,unsigned char Data2)
{
LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
switch(y)
{
case 0:
LCD12864_Write(Write_Command,0x80+x); //设置DDRAM地址
Delay_10us();
LCD12864_Write(Write_Data,Data1);
LCD12864_Write(Write_Data,Data2);
break;
case 1:
LCD12864_Write(Write_Command,0x90+x); //设置DDRAM地址
Delay_10us();
LCD12864_Write(Write_Data,Data1);
LCD12864_Write(Write_Data,Data2);
break;
case 2:
LCD12864_Write(Write_Command,0x88+x); //设置DDRAM地址
Delay_10us();
LCD12864_Write(Write_Data,Data1);
LCD12864_Write(Write_Data,Data2);
break;
case 3:
LCD12864_Write(Write_Command,0x98+x); //设置DDRAM地址
Delay_10us();
LCD12864_Write(Write_Data,Data1);
LCD12864_Write(Write_Data,Data2);
break;
}
}
/*----------------------------初始化12864----------------------------*/
void LCD12864_Init(void)
{
Delay_10ms(); //40mS延时
Delay_10ms();
Delay_10ms();
Delay_10ms();
LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
Delay_x10us(10); //100uS延时
LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
Delay_x10us(4); //40uS延时
LCD12864_Write(Write_Command,Clear_Display); //显示光标闪烁完全关闭
Delay_x10us(10); //100uS延时
LCD12864_Write(Write_Command,Clear_Display); //清除显示
Delay_10ms(); //10mS延时
LCD12864_Write(Write_Command,Entry_Mode_Cursor_Right); //光标右移模式
Delay_x10us(10); //100uS延时
LCD12864_Write(Write_Command,Display_On_Cursor_Off_Inverse_Off); //开显示,无光标,光标不闪烁
Delay_x10us(10); //100uS延时
Clear_GDRAM(); //清空GDRAM
Delay_x10us(10); //100uS延时
}
void Init(void)
{
P3M0=0x08;
P3M1=0x00;
IRIN=1;
EA=1;
EX0=1;
IT0=1;
Buzzer=0;
LCD12864_Init();
}
/*----------------------------主函数----------------------------*/
void main(void)
{
Init();
Display_Text(Display_Data1);
while(1)
if(RXD==0)
IAP_CONTR=0x60;
}
void IR_IN(void) interrupt 0
{
unsigned char j,k,n=0,q=0;
EX0=0;
Delay_x140us(15);
if(IRIN==1)
{
EX0=1;
return;
}
while(!IRIN)
Delay_x140us(1);
for(j=0;j<4;j++)
{
for(k=0;k<8;k++)
{
while(IRIN)
Delay_x140us(1);
while(!IRIN)
Delay_x140us(1);
while(IRIN)
{
Delay_x140us(1);
n++;
if(n>=30)
{
EX0=1;
return;
}
}
IRCOM[j]=IRCOM[j]>>1;
if(n>=8)
{
IRCOM[j]=IRCOM[j]|0x80;
}
n=0;
}
}
if(IRCOM[2]!=~IRCOM[3])
{
EX0=1;
return;
}
else
{
Display_Data(1,2,Display_Hex[IRCOM[0]/16],Display_Hex[IRCOM[0]%16]);
Display_Data(2,2,Display_Hex[IRCOM[1]/16],Display_Hex[IRCOM[1]%16]);
Display_Data(3,2,Display_Hex[IRCOM[2]/16],Display_Hex[IRCOM[2]%16]);
Display_Data(4,2,Display_Hex[IRCOM[3]/16],Display_Hex[IRCOM[3]%16]);
Display_Data(6,2,Display_Hex[IRCOM[2]/16],Display_Hex[IRCOM[2]%16]);
Buzzer=1;
Delay_10ms();
Buzzer=0;
}
EX0=1;
}