lcd12864显示遥控键值读取程序
扫描二维码
随时随地手机看文章
LCD12864显示遥控键值读取程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
/*TS12864A-3端口定义*/
#defineLCD_dataP0//数据口
sbitLCD_RS=P2^0;//寄存器选择输入
sbitLCD_RW=P2^1;//液晶读/写控制
sbitLCD_EN=P2^2;//液晶使能控制
sbitLCD_PSB=P2^3;//串/并方式控制
sbitLCD_RST=P2^5;//液晶复位端口
sbitIRIN=P3^2;//红外遥控
sbitBEEP=P3^7;//蜂鸣器
sbitRELAY=P1^3;//继电器
ucharcodedis1[]={"红外遥控码读取器"};
ucharcodedis2[]={"----------------"};
ucharcodedis3[]={"键值编码:--H"};
ucharcodedis4[]={"键值反码:--H"};
#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};
ucharIRDIS[2];
ucharIRCOM[4];
voiddelay0(ucharx);//x*0.14MS
voidbeep();
voiddataconv();
voidlcd_pos(ucharX,ucharY);//确定显示位置
/*******************************************************************/
/**/
/*延时函数*/
/**/
/*******************************************************************/
voiddelay(intms)
{
while(ms--)
{
uchari;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*******************************************************************/
/**/
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。*/
/**/
/*******************************************************************/
bitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&0x80);
LCD_EN=0;
return(result);
}
/*******************************************************************/
/**/
/*写指令数据到LCD*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。*/
/**/
/*******************************************************************/
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P0=cmd;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*******************************************************************/
/**/
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。*/
/**/
/*******************************************************************/
voidlcd_wdat(uchardat)
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*******************************************************************/
/**/
/*LCD初始化设定*/
/**/
/*******************************************************************/
voidlcd_init()
{
LCD_RST=0;//液晶复位
delay(30);
LCD_RST=1;
delay(5);
LCD_PSB=1;//并口方式
lcd_wcmd(0x34);//扩充指令操作
delay(5);
lcd_wcmd(0x30);//基本指令操作
delay(5);
lcd_wcmd(0x0C);//显示开,关光标
delay(5);
lcd_wcmd(0x01);//清除LCD的显示内容
delay(5);
}
/*********************************************************/
/**/
/*主程序*/
/**/
/*********************************************************/
main()
{
uchari;
IE=0x81;//允许总中断中断,使能INT0外部中断
TCON=0x01;//触发方式为脉冲负边沿触发
IRIN=1;//I/O口初始化
BEEP=1;
RELAY=1;
delay(10);//延时
lcd_init();//初始化LCD
lcd_pos(0,0);//设置显示位置为第一行的第1个字符
i=0;
while(dis1[i]!=’ ’)
{//显示字符
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(1,0);//设置显示位置为第二行的第1个字符
i=0;
while(dis2[i]!=’ ’)
{
lcd_wdat(dis2[i]);//显示字符
i++;
}
lcd_pos(2,0);//设置显示位置为第三行的第1个字符
i=0;
while(dis3[i]!=’ ’)
{
lcd_wdat(dis3[i]);//显示字符
i++;
}
lcd_pos(3,0);//设置显示位置为第四行的第1个字符
i=0;
while(dis4[i]!=’ ’)
{
lcd_wdat(dis4[i]);//显示字符
i++;
}
while(1);
}
/*********************************************************/
/**/
/*INT0外部中断子程序*/
/**/
/*********************************************************/
voidIR_IN()interrupt0using0
{
ucharj,k,N=0;
EX0=0;
delay0(15);
if(IRIN==1)
{EX0=1;
return;
}
//确认IR信号出现
while(!IRIN)//等IR变为高电平,跳过9ms的前导低电平信号。
{delay0(1);}
for(j=0;j<4;j++)//收集四组数据
{
for(k=0;k<8;k++)//每组数据有8位
{
while(IRIN);//等IR变为低电平,跳过4.5ms的前导高电平信号。
while(!IRIN);//等IR变为高电平
while(IRIN)//计算IR高电平时长
{
delay0(1);
N++;
if(N>=30)
{EX0=1;
return;}//0.14ms计数过长自动离开。
}//高电平计数完毕
IRCOM[j]=IRCOM[j]>>1;//数据最高位补“0”
if(N>=8){IRCOM[j]=IRCOM[j]|0x80;}//数据最高位补“1”
N=0;
}//endfork
}//endforj
if(IRCOM[2]!=~IRCOM[3])
{EX0=1;
return;}
IRDIS[0]=IRCOM[2]&0x0F;//取键码的低四位
IRDIS[1]=IRCOM[2]>>4;//取键码的高四位,右移4次,高四位变为低四位
dataconv();
lcd_pos(2,5);
lcd_wdat(IRDIS[1]);//第一位数显示
lcd_pos(2,6);
lcd_wdat(IRDIS[0]);//第二位数显示
IRDIS[0]=IRCOM[3]&0x0F;//取键码的低四位
IRDIS[1]=IRCOM[3]>>4;//取键码的高四位,右移4次,高四位变为低四位
dataconv();
lcd_pos(3,5);
lcd_wdat(IRDIS[1]);//第一位数显示
lcd_pos(3,6);
lcd_wdat(IRDIS[0]);//第二位数显示
beep();
EX0=1;
}
/*********************************************************/
/**/
/*转换为ASCII码*/
/**/
/*********************************************************/
voiddataconv()
{
uchart;
for(t=0;t<2;t++)
if(IRDIS[t]>9)
IRDIS[t]=IRDIS[t]+0x37;
else
IRDIS[t]=IRDIS[t]+0x30;
}
/*********************************************************/
/**/
/*蜂鸣器响一声子程序*/
/**/
/*********************************************************/
voidbeep()
{
uchari;
for(i=0;i<100;i++)
{
delay0(4);
BEEP=!BEEP;//BEEP取反
}
BEEP=1;//关闭蜂鸣器
}
/*********************************************************/
/**/
/*延时x*0.14ms子程序*/
/**/
/*********************************************************/
voiddelay0(ucharx)//x*0.14MS
{
uchari;
while(x--)
{
for(i=0;i<13;i++){}
}
}
/*********************************************************/
/**/
/*设定显示位置*/
/**/
/*********************************************************/
voidlcd_pos(ucharX,ucharY)
{
ucharpos;
if(X==0)
{X=0x80;}
elseif(X==1)
{X=0x90;}
elseif(X==2)
{X=0x88;}
elseif(X==3)
{X=0x98;}
pos=X+Y;
lcd_wcmd(pos);//显示地址
}