基于51单片机的红外遥控+液晶LCD1602显示
程序源代码
/*******************红外遥控+液晶LCD1602测试程序源代码********************  单片机型号:STC15W4K56S4,内部晶振:22.1184M。
功能:红外遥控+液晶LCD1602显示功能测试。
操作说明:
按下红外遥控器上的“CH-”键,液晶LCD1602上显示“CH-”。
按下红外遥控器上的“CH”键,液晶LCD1602上显示“CH”。
按下红外遥控器上的“CH+”键,液晶LCD1602上显示“CH+”。
按下红外遥控器上的“|<<”键,液晶LCD1602上显示“|<<”。
按下红外遥控器上的“>>|”键,液晶LCD1602上显示“>>|”。
按下红外遥控器上的“>||”键,液晶LCD1602上显示“>||”。
按下红外遥控器上的“-”键,液晶LCD1602上显示“-”。
按下红外遥控器上的“+”键,液晶LCD1602上显示“+”。
按下红外遥控器上的“EQ”键,液晶LCD1602上显示“EQ”。
按下红外遥控器上的“0”键,液晶LCD1602上显示“0”。
按下红外遥控器上的“100+”键,液晶LCD1602上显示“100+”。
按下红外遥控器上的“200+”键,液晶LCD1602上显示“200+”。
按下红外遥控器上的“1”键,液晶LCD1602上显示“1”。
按下红外遥控器上的“2”键,液晶LCD1602上显示“2”。
按下红外遥控器上的“3”键,液晶LCD1602上显示“3”。
按下红外遥控器上的“4”键,液晶LCD1602上显示“4”。
按下红外遥控器上的“5”键,液晶LCD1602上显示“5”。
按下红外遥控器上的“6”键,液晶LCD1602上显示“6”。
按下红外遥控器上的“7”键,液晶LCD1602上显示“7”。
按下红外遥控器上的“8”键,液晶LCD1602上显示“8”。
按下红外遥控器上的“9”键,液晶LCD1602上显示“9”。
红外遥控器键码;
“CH-”键对应键码:0x45      “CH”键对应键码:0x46
“CH+”键对应键码:0x47      “|<<”键对应键码:0x44
“>>|”键对应键码:0x40      “>||”键对应键码:0x43
“-”键对应键码:0x07      “+”键对应键码:0x15
“EQ”键对应键码:0x09      “0”键对应键码:0x16
“100+”键对应键码:0x19      “200+”键对应键码:0x0d
“1”键对应键码:0x0c      “2”键对应键码:0x18
“3”键对应键码:0x5e      “4”键对应键码:0x08
“5”键对应键码:0x1c      “6”键对应键码:0x5a
“7”键对应键码:0x42      “8”键对应键码:0x52
“9”键对应键码:0x4a
**************************************************************************/
#include "stc15.h"                              //包含头文件stc15.h
#include <intrins.h> //包含头文件intrins.h
#define Busy 0x80 //LCD忙
sbit LCD_D0 = P0^0;                  //LCD_D0对应P0.0
sbit LCD_D1 = P0^1;                  //LCD_D1对应P0.1
sbit LCD_D2 = P0^2;                  //LCD_D2对应P0.2
sbit LCD_D3 = P0^3;                      //LCD_D3对应P0.3
sbit LCD_D4 = P0^4;                  //LCD_D4对应P0.4
sbit LCD_D5 = P0^5;                  //LCD_D5对应P0.5
sbit LCD_D6 = P0^6;                  //LCD_D6对应P0.6
sbit LCD_D7 = P0^7;                      //LCD_D7对应P0.7
sbit LCD_RS = P1^0;                  //LCD_RS对应P1.0
sbit LCD_RW = P1^1;                  //LCD_RW对应P1.1
sbit LCD_EN = P3^4;                  //LCD_EN对应P3.4
sbit IR = P3^2;  //红外遥控信号接收管脚P3.2
4k电影源代码bit timer1_counter = 0;  //变量
void delay(unsigned int t);  //delay延时函数
void delay_us(unsigned int t);      //delay_us延时函数
void delay_ms(unsigned int t);          //delay_ms延时函数
void Delay5Ms(void); //5Ms延时函数
void GPIO_1602_Configuration(void);  //LCD1602液晶IO口初始化
void WriteDataLCD(unsigned char WDLCD);  //LCD写数据函数
void WriteCommandLCD(unsigned char WCLCD,BuysC);//LCD写命令函数
unsigned char ReadDataLCD(void); //LCD读数据函数
unsigned char ReadStatusLCD(void); //LCD读状态函数
void LCDInit(void);  //LCD初始化
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
/
/LCD显示一个字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); //LCD显示一个字符串
void TIM0init(void);                            //定时器0初始化函数
void EX0init(void);              //外部中断初始化函数
void Ir_work(void);              //红外遥控相关函数
void Ircordpro(void);            //红外遥控相关函数
unsigned char code welcome[]    = {"Hello My Friends"};
unsigned char code irremotekey[] = {"IR REMOTE:      "};
unsigned char code space[]      = {"    "};
unsigned char code KEY_FH1[]    = {" CH-"};
unsigned char code KEY_FH2[]    = {"  CH"};
unsigned char code KEY_FH3[]    = {" CH+"};
unsigned char code KEY_FH4[]    = {" |<<"};
unsigned char code KEY_FH5[]    = {" >>|"};
unsigned char code KEY_FH6[]    = {" >||"};
unsigned char code KEY_FH7[]    = {"  -"};
unsigned char code KEY_FH8[]    = {"  +"};
unsigned char code KEY_FH9[]    = {"  EQ"};
unsigned char code KEY_NUMB0[]  = {"  0"};
unsigned char code KEY_FH10[]    = {"100+"};
unsigned char code KEY_FH11[]    = {"200+"};
unsigned char code KEY_NUMB1[]  = {"  1"};
unsigned char code KEY_NUMB2[]  = {"  2"};
unsigned char code KEY_NUMB3[]  = {"  3"};
unsigned char code KEY_NUMB4[]  = {"  4"};
unsigned char code KEY_NUMB5[]  = {"  5"};
unsigned char code KEY_NUMB6[]  = {"  6"};
unsigned char code KEY_NUMB7[]  = {"  7"};
unsigned char code KEY_NUMB8[]  = {"  8"};
unsigned char code KEY_NUMB9[]  = {"  9"};
unsigned char IRcord[4]; //红外遥控接收信号用数组unsigned char IRdata[33]; //红外遥控接收信号用数组unsigned char irtime; //用于红外遥控计数
bit IRpro_ok; //用于红外遥控变量
bit IR_ok; //用于红外遥控变量
void delay(unsigned int t)      //delay延时函数
{while(t--);}
void delay_us(unsigned int t)      //delay_us延时函数
{
unsigned char i;
while(t--)
{i=3;while(i--)delay(1);}
}
void delay_ms(unsigned int t)          //delay_ms延时函数
{
while(t--)
{delay_us(t);}
}
void Delay5Ms(void)  //5ms延时函数
{
unsigned int TempCyc = 3552;
while(TempCyc--);
}
void GPIO_1602_Configuration(void)                  //LCD1602液晶IO口初始化{
P0M1 = P3M1&0x00;
P0M0 = P3M0&0x00;
P1M1 = P3M1&0xfc;
P1M0 = P3M0&0xfc;
P3M1 = P4M1&0xef;
P3M0 = P4M0&0xef;
}
unsigned char ReadStatusLCD(void)            //测试LCD忙碌状态
{
LCD_D7 = 1;        //LCD的D7置1
LCD_RS = 0;        //LCD管脚RS设置成低电平 LCD_RW = 1;        //LCD管脚RW设置成高电平 LCD_EN = 0;            //LCD管脚E设置成低电平 LCD_EN = 0;        //LCD管脚E设置成低电平 LCD_EN = 1;          //LCD管脚E设置成高电平 while(LCD_D7);          //检测忙信号
return(Busy);        //表示当前忙
}
void WriteCommandLCD(unsigned char WCLCD,BuysC)    //BuysC为0时忽略忙检测{
if(BuysC) ReadStatusLCD();                        //根据需要检测忙
LCD_EN = 0;                                        //LCD管脚E设置成低电平 _nop_(); //空操作,延时
_nop_();                                        //空操作,延时
_nop_();                                        //空操作,延时
_nop_();                                    //空操作,延时
_nop_();                                    //空操作,延时
_nop_();                                    //空操作,延时
_nop_();                                    //空操作,延时
_nop_();                                    //空操作,延时
LCD_RS = 0;    //LCD管脚RS设置成低电平 LCD_RW = 0;        //LCD管脚RW设置成低电平 _nop_();            //空操作,延时
_nop_();                                          //空操作,延时
P0 = WCLCD;                                        //将数据送入P0口
_nop_();        //空操作,延时
_nop_();        //空操作,延时
_nop_();        //空操作,延时
_nop_();                                          //空操作,延时
LCD_EN = 1;                                        //E置高电平
_nop_();            //空操作,延时
_nop_();        //空操作,延时
_nop_();            //空操作,延时
_nop_();                                          //空操作,延时
LCD_EN = 0;
//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
void WriteDataLCD(unsigned char WDLCD) //LCD写数据函数
{
ReadStatusLCD(); //读取LCD状态
LCD_EN  = 0;                                  //LCD管脚E设置成低电平 _nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
LCD_RS = 1;  //LCD管脚RS设置成高电平 LCD_RW = 0; //LCD管脚RW设置成低电平 P0 = WDLCD;                                    //将数据送入P0口
_nop_();    //空操作,延时
_nop_();      //空操作,延时
_nop_();        //空操作,延时
_nop_();                                      //空操作,延时
LCD_EN = 1;                                    //E置高电平
_nop_();    //空操作,延时
_nop_();    //空操作,延时
_nop_();        //空操作,延时
_nop_();                                      //空操作,延时
LCD_EN = 0;
//当E由高电平跳变成低电平时,液晶模块开始执行命令
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。