//该程序使用LCD1602显示
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
////////////////////////////////////////////////
#define 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 TimeNum[]=" ";
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);
////////////////////////////////////////////
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)
{
us=0xf0;
while (us!=0) {us--;};
usn--;
}
mS--;
}
}
/////////////////////////////////////////////
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<63&&irtime>=33)//引导码 TC9012的头码
i=0;
irdata[i]=irtime;
irtime=0;
i++;
if(i==33){irok=1;i=0;}
}
else
{irtime=0;startflag=1;}
}
////////////////////////////////////////////////////////
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 falling edge on /INT0 (P3.2)
EX0 = 1; //Enable EX0 Interrupt
EA = 1;
}
////////////////////////////////////////////////////////
void Ir_work(void)//红外键值散转程序
{
TimeNum[5] = Tab[IRcord[0]/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,TimeNum);
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位
{
cord=irdata[k];
if(cord>7){value=value|0x80;}//大于某值为1
else{value=value;}
if(j<8){value=value>>1;}
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1; //处理完毕标志位置1
}
////////////////////////////////////////////////////////
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1; /* Crystal frequency in 12MHz*/
while(--uscnt);
}
////////////////////////////////////////////////////////
void DelayMs(unsigned char ms)//delay Ms
{while(--ms){DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250);}}
void WriteCommand(unsigned char c)
{
DelayMs(5);
E=0;RS=0;RW=0;
_nop_();
E=1;Data=c;E=0;
}
////////////////////////////////////////////////////////
void WriteData(unsigned char c)
{
DelayMs(5);
E=0;RS=1;RW=0;
_nop_();
E=1;Data=c;E=0;
RS=0;
}
////////////////////////////////////////////////////////
void ShowChar(unsigned 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
}
////////////////////////////////////////////////////////
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
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //显示光标移动位置
WriteCommand(0x0c); //显示开及光标设置
WriteCommand(0x01); //显示清屏
}
////////////////////////////////////////////////////////
void main(void)
{
EX0init();
TIM0init();
InitLcd();
DelayMs(15);
sprintf(Test1," wlecome you "); //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){Ir_work();}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
51单片机开发板实验:红外解码LCD1602显示程序源代码.rar (10个子文件)
51单片机开发板实验:红外解码LCD1602显示程序源代码
main.OBJ 13KB
红外解码.uvopt 71KB
红外解码.plg 1KB
main.LST 9KB
红外解码 12KB
红外解码.lnp 44B
红外解码.hex 5KB
红外解码.uvproj 13KB
main.c 5KB
红外解码.M51 16KB
共 10 条
- 1
资源评论
霹雳巴拉
- 粉丝: 4
- 资源: 97
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功