通过遥控改变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;
}
}
}