for(j=0;j<10000;j++);
}
voidmain(void)
{
Sys_Init();//系统初始化
while
(1)
{
if(Irf_En&&(pCount>=34))//仅在接收完毕执行一次
{
Inf_Dec();//红外测试和解调
Inf_Con(Irf_Data);//红外遥控
Irf_En=0;
Auto_Display(Flag_Auto&&Flag_State);//自动显示,界面切换和字幕滚动
}//自动显示时,按键是失效的,有待于改进
}
}
//脉宽捕捉计数
voidTime0()interrupt1
{
tCount++;
}
//红外接收脉宽捕捉
voidInt0()interrupt0
{
TR0=0;//关闭计数
Led1=1;
if(tCount>=88&&tCount<93)//计数复位
{
pCount=0;
IC[pCount++]=tCount;//记录引导码测试结果:
引导码90,91数据码11,22
tCount=0;
Irf_En=1;//启动解调函数jt();
Led1=0;
}
else
{
if(pCount<39)//防止溢出
{
IC[pCount++]=tCount;
tCount=0;
}
else
{
IC[pCount]=tCount;
tCount=0;
}
}
TR0=1;
}
/**********************红外解码**********************/
voidInf_Dec()
{
uintBuf=0;
uchari,D[3];
TR0=0;
for(i=0;i<40;i++)
{
if(i>=17&&i<33)//测试数据码的正确性i>=17&&i<33
{//测试全部码的正确性i>=00&&i<40
Buf<<=1;
if(IC[i]>15)//T>2ms:
1T<2ms:
0
{//原码*256+反码
Buf=Buf+1;
}
}
IC[i]=0;
}
D[0]=Buf/256;//原码
D[1]=~(Buf%256);//反码还原
if(D[0]==D[1])//接收码校检
{
Irf_Data=D[1];
}
else
{
Irf_Data=0xff;//误码
}
///////////////测试数据码//////////////////-----------调试用:
///////////////可以通过串口调试软件查看按键接收码:
波特率:
9600
Buf=Irf_Data;
for(i=0;i<3;i++)
{
D[i]=Buf%10;
Buf=Buf/10;
}
for(i=0;i<3;i++)
{
Serial_Send(D[2-i]+48);//发送解码
}
Serial_Send(46);
Serial_Send(46);//测试结果:
////////////////////////////////////////////
}
/**********************红外遥控**********************/
voidInf_Con(ucharCommand)
{
//开机关机控制
if(Command==On_Off)//设置显示状态
{
Flag_State=~Flag_State;
Led2=~Flag_State;//开机指示灯
if(!
Flag_State)//显示标志复位
{
Char_count=3;//控制显示滚动
Flag_State=0;//0:
关闭显示1:
启动显示
Flag_Auto=0;//0:
关闭自动模式,1:
启动自动模式
Flag_Page=0;//界面标志界面1:
界面2,界面3
}
LCD_Init();//启动显示
}
if(Flag_State)//开机状态下使能
{
if(Command==Auto_Manu)//设置自动手动模式
{
Flag_Auto=!
Flag_Auto;//默认为自动模式
Led1=!
Flag_Auto;//自动模式下,Led2指示
}
if(!
Flag_Auto)//手动模式下使能
{
if(Command==Up)//界面上翻
{
if(Flag_Page<2)
{
Flag_Page++;
}
}
if(Command==Down)//界面下翻
{
if(Flag_Page>0)
{
Flag_Page--;
}
}
if(Flag_Page==1)//界面1有效
{
if(Command==Left)
{
if(Char_count>3)//汉字y坐标显示最左滚动到3
{
Char_count--;
}
}
if(Command==Right)
{
if(Char_count<22)//汉字y坐标显示最左滚动到3
{
Char_count++;
}
}
}
}
Manu_Display();
}
}
voidManu_Display()
{
Led2=!
Flag_State;//Led2指示显示状态
if(Flag_State)//显示打开
{
if(!
Flag_Auto)//手动模式
{
if(Flag_Page==0)
{
Start_Disp();//开机界面
}
if(Flag_Page==1)
{
Content_1(Char_count);//课题信息界面
}
if(Flag_Page==2)//结束界面
{
Content_2();
}
}
}
}
voidAuto_Display(biteN)//自动显示
{
if(eN)
{
Start_Disp();//开机界面
Dlay_1S
(2);
for(Char_count=3;Char_count<22;Char_count++)
{
Content_1(Char_count);//课题信息界面
Delay1mS(8000);
}
Char_count=3;
Content_1(Char_count);//课题信息界面
Dlay_1S
(1);
Content_2();
}
}
//串口调试,测试遥控器码
voidSerial()interrupt4
{
ucharch;
if(RI==1)
{
RI=0;
ch=SBUF;
if(ch==1)
{
}
}
}
#ifndef__LCD_H__
#define__LCD_H__
#include
#definesome_nop();_nop_();_nop_();_nop_();_nop_();
//本程序使用带中文字库的液晶显示器LCD12864
bitCheckBusy();//读BF标志位,检查LCD是否就绪
voidWait();//等待LCD就绪
voidWrite_Data(uchardat);//写一个字节数据
voidWrite_Command(uchardat);//写命令
voidWrite_String(ucharx,uchary,uchar*p);//写字符串
voidLcd_Init();//LCD初始化
voidSet_Position(ucharx,uchary);//设置待显示的位置
voidShut();//关显示
voidClear_Picture();//清除图片显示
//延时程序
voidDelay1mS(uinttt)//延时tt毫秒
{
uchari;
while(tt--)
for(i=100;i>0;i--);
}
//读BF标志位,检查LCD是否就绪
bitCheckBusy()
{
RS=0;
some_nop();
RW=1;
some_nop();
E=1;
some_nop();
if(LCD_DATA&0x80)
return1;
else
return0;
}
//等待LCD就绪
voidWait()
{
while(CheckBusy());
}
//写一个字节数据
voidWrite_Data(uchardat)
{
Wait();
RS=1;
RW=0;
E=1;
some_nop();
LCD_DATA=dat;
some_nop();
E=0;
some_nop();
}
//写命令
voidWrite_Command(uchardat)
{
Wait();
RS=0;
RW=0;
E=1;
some_nop();
LCD_DATA=dat;
some_nop();
E=0;
some_nop();
}
//写字符串
voidWrite_String(ucharx,uchary,uchar*p)
{
charcnt=0;
Set_Position(x,y);//显示位置
while(*(p+cnt)!
='\0')
{
Write_Data(*(p+cnt));
cnt++;
}
}
//字符串滚动
voidWrite_String_Roll(ucharx,uchary,ucharmove,ucharnum,uchar*p)
{//x,y显示位置,move,移动次数;num:
一次显示个数,*p调用显示字符
ucharcnt=0;
Set_Position(x,y);//显示位置
while((*(p+cnt+move*2)!
='\0')&&(cnt{
Write_Data(*(p+cnt+move*2));
cnt++;
}
}
//LCD初始化
voidLCD_Init()
{
Delay1mS(100);
Write_Command(0x30);//基本指令30H,扩充指令为34H
Delay1mS
(1);
Write_Command(0x0c);//显示开,关光标.开光标0X0E
Delay1mS
(1);
Write_Command(0x01);//清屏清除字符显示
Delay1mS(100);
Write_Command(0x34);//基本指令30H,扩充指令为34H
Delay1mS
(1);
Write_Command(0x3e);//扩充指令36H绘图开
Delay1mS
(1);
Clear_Picture();//清除图片显示
Shut();//关显示
}
//显示关
voidShut()
{
Write_Command(0x30);//基本指令30H,扩充指令为34H
Delay1mS
(1);
Write_Command(0x08);//显示关,关光标.开光标0X0E
Delay1mS
(1);
}
//设置待显示的位置
voidSet_Position(ucharx,uchary)
{
ucharp;
switch(x%4)
{
case0:
p=0x80;break;//第一行开始地址
case1:
p=0x90;break;//第二行
case2:
p=0x88;break;//第三行
case3:
p=0x98;break;//第四行
}
p+=y;
Write_Command(p);
}
//图片显示清屏
voidClear_Picture()
{
uchari,j;
for(i=0;i<64;i++)
{
Write_Command(0x80|(i%32));
Write_Command(0x80|(i/32*8));
for(j=0;j<16;j++)
{
Write_Data(0);
Delay1mS
(1);
}
}
}
//设置图形显示
voidSet_Picture_Dis()//设置图形显示
{
Write_Command(0x34);//基本指令30H,扩充指令为34H
Delay1mS
(1);
Write_Command(0x3e);//扩充指令36H绘图开
Delay1mS
(1);
Clear_Picture();//清屏
}
//设置字符显示
voidSet_Char_Dis()//设置字符显示
{
Write_Command(0x30);//基本指令30H,扩充指令为34H
Delay1mS
(1);
Write_Command(0x0c);//显示开,关光标.开光标0X0E
Delay1mS
(1);
Write_Command(0x01);//清屏
Delay1mS(100);
}
//开机界面
voidStart_Disp()
{
uchari,j;
LCD_Init();
Set_Picture_Dis();//设置图形显示
Clear_Picture();//清屏
//显示【毕业设计】
for(i=0;i<32;i++)
{
Write_Command(0x80|i);
Write_Command(0x80);
for(j=0;j<16;j++)
{
Write_Data(Picture_1[i][j]);
Delay1mS(100);
}
}
//显示【制作者:
蒋银】
for(i=0;i<24;i++)
{
Write_Command(0x80|i+4);
Write_Command(0x88);
for(j=0;j<16;j++)
{
Write_Data(Picture_2[i][j]);
Delay1mS(100);
}
}
}
//课题信息界面
voidContent_1(ucharcC)
{
Set_Char_Dis();//设置字符显示
Write_String(0,2,Tab1);
Write_String_Roll(1,0,0,3,Tab2);
Write_String_Roll(1,3,cC,4,Tab2);
Write_String(2,0,Tab3);
Write_String(3,0,Tab4);
}
//结束界面
voidContent_2()//显示【谢谢再见】
{
uchari,j;
LCD_Init();
Set_Picture_Dis();//设置图形显示
Clear_Picture();//清屏
for(i=16;i<32;i++)//上半屏显示
{
Write_Command(0x80|i);
Write_Command(0x80);
for(j=0;j<16;j++)
{
Write_Data(Picture_3[i-16][j]);
Delay1mS(100);
}
}
for(i=0;i<16;i++)//下半屏显示
{
Write_Command(0x80|i);
Write_Command(0x88);
for(j=0;j<16;j++)
{
Write_Data(Picture_3[i+16][j]);
Delay1mS(100);
}
}
}
#endif
#ifndef__GLOBAL_H__
#define__GLOBAL_H__
sbitLed1=P2^0;
sbitLed2=P2^1;
typedefunsignedcharuchar;
typedefunsignedintuint;
//遥控器键功能定义
#defineUp8
#defineDown136
#defineLeft200
#defineRight72
#defineAuto_Manu104
#defineOn_Off40
//红外解码全局变量定义
ucharIrf_Data=0;//解码
uinttCount=0;//波形计数
ucharIC[40];//红外脉宽计数值
ucharpCount=0;//计数
bitIrf_En=0;//解码控制
//LCD接口定义
#defineLCD_DATAP0//数据口
sbitRS=P2^7;//并行的指令/数据选择信号,H数据,L命令
sbitRW=P2^6;//并行读写选择信号,H读,L写
sbitE=P2^5;//并行使能端,H有效,L无效
sbitPSB=P2^4;//串并行选择端,H选择并行,L选择串行
bitFlag_State=0;//0:
关闭显示1:
启动显示
bitFlag_Auto=0;//0:
关闭自动模式,1:
启动自动模式
ucharFlag_Page=0;//界面标志界面1:
界面2,界面3
ucharChar_count=3;//控制显示滚动
ucharcodePicture_1[][16]=
{
//毕业设计
/*--宽度x高度=128x32--*/
0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0x80,0x00,0x00,0x00,0x00,0x3F,0x03,0xFC,0x00,
0x01,0xFF,0x3F,0xE0,0x00,0x7F,0xF3,0xC0,0x1F,0xC7,0xFF,0xC0,0x7F,0x87,0x9E,0x00,
0x03,0xC7,0xF8,0xF0,0x00,0x71,0xE1,0xC0,0x39,0xEF,0x01,0xE0,0xF3,0xC7,0x0E,0x00,
0x03,0xC7,0xF8,0x7F,0x80,0x70,0xE1,0xC0,0x78,0xFE,0x00,0xF0,0xE1,0xE7,0x0E,0x00,
0x03,0xC7,0xF8,0x73,0x80,0x70,0xE1,0xC0,0x78,0x7E,0x00,0xF0,0xF0,0xE7,0x0E,0x00,
0x03,0xC0,0x3C,0x03,0x80,0x70,0xE1,0xC0,0x3C,0x7E,0x00,0xF0,0xF0,0xF7,0x0E,0x00,
0x03,0xC0,0x3C,0x01,0x87,0xF0,0xE1,0xC0,0x1C,0x7E,0x01,0xF8,0x79,0xE7,0x0E,