lcd1602显示接收红外信号

通过遥控改变lcd1602上显示的数值

lcd1602头文件

#ifndef __LCD_H_
#define __LCD_H_

/**********************************
包含头文件
**********************************/
#include<reg52.h>
#include"intrins.h"

//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint 
#define uint unsigned int
#endif

/**********************************
PIN口定义
**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;

/**********************************
函数声明
**********************************/

/*在51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c);

void Busy(void);//忙检测函数

/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);

/*LCD1602写入8位数据子函数*/	
void LcdWriteData(uchar dat);

/*LCD1602初始化子程序*/		
void LcdInit();

void LcdSetCursor(uchar x,uchar y);
void DisplayOneChar(uchar X, uchar Y, uchar DData);
void LcdShowStr(uchar x,uchar y,uchar *str);						  

#endif

lcd1602模块

#include "lcd.h"

/*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能		   : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
void Lcd1602_Delay1ms(uint c)   
{
    uchar a,b;
	for (; c>0; c--)
	{
		 for (b=199;b>0;b--)
		 {
		  	for(a=1;a>0;a--);
		 }      
	}
    	
}
/*******************************************************************************
* 函 数 名         : Busy
* 函数功能		   : 忙检查函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Busy(void)
{
   uchar temp=0;
   do{
	   LCD1602_RW = 1;
	   LCD1602_RS = 0;
	   LCD1602_E = 0;     //使能
	   _nop_();
	   LCD1602_E = 1;
	   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//一个机器周期1us,大于150ns即可
       _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//为了仿真出来,延长脉宽,28us
	   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	   LCD1602_E = 0;
	   temp=LCD1602_DATAPINS;
     }while(temp&0x80);
}
/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能		   : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/
void LcdWriteCom(uchar com)	  //写入命令
{
	LCD1602_DATAPINS = com;     //放入命令
	LCD1602_E = 0;     //使能
	LCD1602_RS = 0;	   //选择发送命令
	LCD1602_RW = 0;	   //选择写入
	_nop_();//一个机器周期1us,大于30ns即可
	LCD1602_E = 1;	          //写入时序
	Lcd1602_Delay1ms(1);
	LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能		   : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/		   		   
void LcdWriteData(uchar dat)			//写入数据
{
	LCD1602_DATAPINS = dat; //写入数据
	LCD1602_E = 0;     //使能
	LCD1602_RS = 1;	   //选择发送数据
	LCD1602_RW = 0;	   //选择写入
	_nop_();//一个机器周期1us,大于30ns即可
	LCD1602_E = 1;	          //写入时序
	Lcd1602_Delay1ms(1);
	LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能		 : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/		   
void LcdInit()						  //LCD初始化子程序
{
	Lcd1602_Delay1ms(1);
 	LcdWriteCom(0x38);  //设置功能,8位,两行,5X7
	Busy();
	LcdWriteCom(0x0c);   //开显示不显示光标
	Busy();
	LcdWriteCom(0x06);  //写一个AC指针加1
	Busy();
	LcdWriteCom(0x01);  //清屏
	Busy();
	LcdWriteCom(0x80);  //设置数据指针起点
}
//指定坐标
void LcdSetCursor(uchar x,uchar y) 
{
    uchar addr;
	y &= 0x01;
	x &= 0x0F; //限制X不能大于15,Y不能大于1
    if(y == 0)
        addr = 0x00 + x;
    else
        addr = 0x40 + x;
    
    LcdWriteCom(addr|0x80);
}

//按指定位置显示一个字符
void DisplayOneChar(uchar x, uchar y, uchar DData)
{
	LcdSetCursor(x,y);   //当前字符的坐标
	LcdWriteData(DData); //发数据
}

//显示字符串
void LcdShowStr(uchar x,uchar y,uchar *str)   
{
    LcdSetCursor(x,y); //当前字符的坐标
    while(*str != '\0')
    {
        LcdWriteData(*str++);
    }
}

主函数部分

#include "reg52.h"		//定义特殊寄存器 
#include "lcd.h"      //调用lcd头文件
#include "intrins.h"   

typedef unsigned int u16;	  
typedef unsigned char u8;


sbit IRIN=P3^2;
u8 IrValue[6];
int Time,n=0,m;
u8 xh[]="21";
u8 code ASCII[13] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};



void delay(u16 i)
{
while(i--);

}
/***********************
*函数名称:xianshi
*函数功能:接受红外信号,经过转码显示在1602上
***********************/
void xianshi()          
{	u16 read1,read2;
   read1=IrValue[2]/16;
   read2=IrValue[2]%16;
  if((read1==4)&&(read2==0))
   n++;
    if((read1==1)&&(read2==9))
   n--;
    if((read1==0)&&(read2==12))
   n=1;
    if((read1==1)&&(read2==8))
   n=2;
    if((read1==5)&&(read2==14))
   n=3;
    if((read1==0)&&(read2==8))
   n=4;
    if((read1==1)&&(read2==12))
   n=5;
    if((read1==5)&&(read2==10))
   n=6;
    if((read1==4)&&(read2==2))
   n=7;
    if((read1==5)&&(read2==2))
   n=8;
   if((read1==4)&&(read2==10))
   n=9;
	m=-n;

   IrValue[2]=0;
  	if(n>=0)
	{
   DisplayOneChar(4, 1, ASCII[n/10]);
   DisplayOneChar(5, 1, ASCII[n%10]); 
   }

   else
   { 
	   DisplayOneChar(4, 1, ASCII[11]);
	  DisplayOneChar(5, 1, ASCII[m/10]);
      DisplayOneChar(6, 1, ASCII[m%10]); 
   
   
   }
  
}

/*******************************************************************************
* 函 数 名         : main
* 函数功能		   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{	
//	TMOD=0x01;		   //设T0为方式1
//	TH0=0;
//	TL0=0;          
//	ET0=1;             //允许T0中断
	EA=1;				  //开启总中断
	IT0=1;
	EX0=1;			  
	LcdInit();
	LcdShowStr(4,0,xh); 
	while(1)
	{
		 xianshi();
		 Lcd1602_Delay1ms(100);//使用LCD中的函数延时
	}
}


void ReadIr() interrupt 0
{
	u8 j,k;
	u16 err;
	Time=0;					 
	delay(700);	//7ms
	if(IRIN==0)		//确认是否真的接收到正确的信号
	{	 
		
		err=1000;				//1000*10us=10ms,超过说明接收到错误的信号
		/*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
		侯,程序死在这里*/	
		while((IRIN==0)&&(err>0))	//等待前面9ms的低电平过去  		
		{			
			delay(1);
			err--;
		} 
		if(IRIN==1)			//如果正确等到9ms低电平
		{
			err=500;
			while((IRIN==1)&&(err>0))		 //等待4.5ms的起始高电平过去
			{
				delay(1);
				err--;
			}
			for(k=0;k<4;k++)		//共有4组数据
			{				
				for(j=0;j<8;j++)	//接收一组数据
				{

					err=60;		
					while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
					{
						delay(1);
						err--;
					}
					err=500;
					while((IRIN==1)&&(err>0))	 //计算高电平的时间长度。
					{
						delay(10);	 //0.1ms
						Time++;
						err--;
						if(Time>30)
						{
							return;
						}
					}
					IrValue[k]>>=1;	 //k表示第几组数据
					if(Time>=8)			//如果高电平出现大于565us,那么是1
					{
						IrValue[k]|=0x80;
					}
					Time=0;		//用完时间要重新赋值							
				}
			}
		}
		if(IrValue[2]!=~IrValue[3])
		{
			return;
		}
	}			
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老尚嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值