4869
- 收藏
- 点赞
- 分享
- 举报
1602液晶显示及红外编解码程序
[code]// 本程序主要是遥控器解码和1602驱动程序
//-------------------------------------------------------
// LCD1602 IR-DECODE
// writed by nxp---2006.12.29
//-------------------------------------------------------
// 连线表: CPU=89S52
// SysClock=12MHz
// LCD: 1602
// 功能:解码红外遥控器
// 遥控器芯片:tc9012-011
#include
#define uchar unsigned char
#define uint unsigned int
/*----------------------------控制I/O口设置,根据实际而定---------------*/
#define RS P0_7 //RS数据命令选择端,高电平数据,低电平命令
#define RW P0_6 //RW读写选择端,高电平读操作,低电平写操作
#define E P0_5 //E使能控制端,E高电平跳变为低电平时LCD执行命令
#define DATA P2 //数据端口定义
#define D0 P2_0
#define D1 P2_1
#define D2 P2_2
#define D3 P2_3
#define D4 P2_4
#define D5 P2_5
#define D6 P2_6
#define D7 P2_7
#define KEY1 P1_0
#define KEY2 P1_1
#define IR_RE P3_2
/*------------------------------------------------------------------------------*/
bit k=0; //红外解码判断标志位,为0则为有效信号,为1则为无效
uchar n=0; //用来控制外部中断
uchar code str0[16]=" REMOTE CONTROL"; //开机画面显示
uchar code str1[16]=" IR-CODE: ";
uchar code str2[16]="ERROR";
uchar *p0=str0;
uchar *p1=str1;
uchar *p2=str2;
delay1ms(uint k);
void disp(void); //红外键值显示程序
uchar data date[4]; //date数组为存放地址原码,反码,数据原码,反码
/*------------------------LCD忙判断子程序--------------------------------------*/
void busy()
{
RS=0;RW=1;
E=0;E=1;DATA=0xff;
while(D7);
}
/*----------------------- 写命令子程序-----------------------------------------*/
void wcom(uchar com)
{
busy();
RS=0;RW=0;
E=1;
DATA=com;
E=0;
}
/*-------------------------写数据子程序--------------------------------------*/
void wdata(uchar dat)
{
busy();
RS=1;RW=0;
E=1;
DATA=dat;
E=0;
}
/*--------------------------读命令子程序-----------------------------------*/
uchar rcom(void)
{
uchar com;
busy();
RS=0;RW=1;
DATA=0xff;
E=1;
com=DATA;
E=0;
return(com);
}
/*----------------------------读数据子程序-----------------------------*/
uchar rdat(void)
{
uchar dat;
busy();
RS=1;RW=1;
DATA=0xff;
E=1;
dat=DATA;
E=0;
return(dat);
}
/*--------------------------延时1ms程子程序-----------------------*/
delay1000()
{
uint i,j;
for(i=0;i<1;i++)
for(j=0;j<124;j++)
;
}
/*---------------------------延时882us子程序-----------------------*/
delay882()
{
uint i,j;
for(i=0;i<1;i++)
for(j=0;j<109;j++)
;
}
/*--------------------------延时2400ms程子程序-----------------------*/
delay2400()
{
uint i,j;
for(i=0;i<3;i++)
for(j=0;j<99;j++)
;
}
/*--------------------------以下为初始化程序,由上面子程序组成,根据个人爱好-----------*/
/******************************清屏程序***********************************/
void clear()
{ wcom (0x01);}
/******************************归位程序********************************/
void rehome()
{ wcom(0x02); }
/*******************8*****888**88888显示模式设定8888888888888888888888*/
void mode(bit x)
{
if(x==1)wcom(0x38); //两行5*8 mode
else wcom(0x34); //一行5*10 mode
}
/*------------------------显示开关控制命令----------------------------*/
void on_off(bit x)
{
if(x==1)wcom(0x0f); //显示开,光标开,光标闪烁
else wcom(0x0c); //显示开,光标关
}
/*------------------------init初始化组合-------------------------*/
void init()
{
clear(); //清屏
mode(1); //模式设置
on_off(1); //显示设置
wcom(0x06); //移动方式
}
/*---------------------------对字符串的处理------------------------*/
void strchar(uchar *p)
{
while(*p!='\0')
{
wdata(*p);
p++;
}
}
/*----------------------------------------------------------*/
/*-----------------------红外解码程序(核心)-----------------*/
/*----------------------------------------------------------*/
void IR_decode()
{
uchar i,j;
while(IR_RE==0);
delay2400();
if(IR_RE==1) //延时2.4ms后如果是高电平则是新码
{
delay2400(); //延时4.8ms避开4.5ms的高电平
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR_RE==0); //等待地址码第1位高电平到来
delay882(); //延时882ms判断此时引脚电平
///CY=IR_RE;
if(IR_RE==0)
{
date>>=1;
date=date&0x7f;
}
else if(IR_RE==1)
{
delay1000();
date>>=1;
date=date|0x80;
}
} //1位数据接收结束
} //32位二进制码接收结束
}
}
/*------------------二进制码转换为压缩型BCD码,并显示---------------*/
void two_2_bcd(uchar date)
{
uchar temp;
temp=date;
date&=0xf0;
date>>=4; //右移四位得到高四位码
date&=0x0f; //与0x0f想与确保高四位为0
if(date<=0x09)
{
// wcom(0xcb);
wdata(0x30+date); //lcd显示键值高四位
}
else
{
date=date-0x09;
//wcom(0xcb);
wdata(0x40+date);
}
date=temp;
date&=0x0f;
if(date<=0x09)
{
wdata(0x30+date); //lcd显示低四位值
}
else
{
date=date-0x09;
wdata(0x40+date);
}
wdata(0x48); //显示字符'H'
}
//////////////////////////////转换程序结束///////////////////////////
/*----------------------解码成功后,1602显示键值子程序---------------*/
void disp()
{
uchar date1;
date1=date[3]^0xff; //如果得到的数据原码和数据反码相反
if(date[2]==date1) //显示键值
{
wcom(0xc0);
two_2_bcd(date[0]);
wdata(0x20);
two_2_bcd(date[1]);
wdata(0x20);
two_2_bcd(date[2]);
wdata(0x20);
two_2_bcd(date[3]);
}
}
/*------------------------外部中断0程序-------------------------*/
/*------------------主要用于处理红外遥控键值--------------------*/
void int0() interrupt 0
{
uint i;
for(i=0;i<4;i++)
{
delay1000();
if(IR_RE==1){k=~k;} //刚开始为4.5ms的引导码,如果4ms内出现高电平则退出解码程序
}
if(k==0)
{
EX0=0; //检测到有效信号关中断,防止干扰
IR_decode(); //如果接收到的是有效信号,则调用解码程序
disp(); //解码成功,调用显示程序,显示该键值
}
EX0=1; //开外部中断,允许新的遥控按键
}
/*---------------------------------------------------------------*/
/* 以下为主程序,主要对LCD初始化,开始界面设置 */
/*---------------------------------------------------------------*/
void main(void)
{
SP=0x60; //堆栈指针
TMOD=0x11; //定时器模式设置所选为 模式1
TH0=0xd8; //定时器初值理论为 10ms;
TL0=0xf7; //实际取d8f7
ET0=1; //允许定时器0中断
EX0=1; //允许外部中断0,用于检测红外遥控器按键
EA=1; //总中断开
init(); //初始化LCD
wcom(0x80); //写入字符的地址为第1行第1列
strchar(p0); //调用显示字符串函数
wcom(0xc0);
//strchar(p1);
while(1);
}[/code]
//-------------------------------------------------------
// LCD1602 IR-DECODE
// writed by nxp---2006.12.29
//-------------------------------------------------------
// 连线表: CPU=89S52
// SysClock=12MHz
// LCD: 1602
// 功能:解码红外遥控器
// 遥控器芯片:tc9012-011
#include
#define uchar unsigned char
#define uint unsigned int
/*----------------------------控制I/O口设置,根据实际而定---------------*/
#define RS P0_7 //RS数据命令选择端,高电平数据,低电平命令
#define RW P0_6 //RW读写选择端,高电平读操作,低电平写操作
#define E P0_5 //E使能控制端,E高电平跳变为低电平时LCD执行命令
#define DATA P2 //数据端口定义
#define D0 P2_0
#define D1 P2_1
#define D2 P2_2
#define D3 P2_3
#define D4 P2_4
#define D5 P2_5
#define D6 P2_6
#define D7 P2_7
#define KEY1 P1_0
#define KEY2 P1_1
#define IR_RE P3_2
/*------------------------------------------------------------------------------*/
bit k=0; //红外解码判断标志位,为0则为有效信号,为1则为无效
uchar n=0; //用来控制外部中断
uchar code str0[16]=" REMOTE CONTROL"; //开机画面显示
uchar code str1[16]=" IR-CODE: ";
uchar code str2[16]="ERROR";
uchar *p0=str0;
uchar *p1=str1;
uchar *p2=str2;
delay1ms(uint k);
void disp(void); //红外键值显示程序
uchar data date[4]; //date数组为存放地址原码,反码,数据原码,反码
/*------------------------LCD忙判断子程序--------------------------------------*/
void busy()
{
RS=0;RW=1;
E=0;E=1;DATA=0xff;
while(D7);
}
/*----------------------- 写命令子程序-----------------------------------------*/
void wcom(uchar com)
{
busy();
RS=0;RW=0;
E=1;
DATA=com;
E=0;
}
/*-------------------------写数据子程序--------------------------------------*/
void wdata(uchar dat)
{
busy();
RS=1;RW=0;
E=1;
DATA=dat;
E=0;
}
/*--------------------------读命令子程序-----------------------------------*/
uchar rcom(void)
{
uchar com;
busy();
RS=0;RW=1;
DATA=0xff;
E=1;
com=DATA;
E=0;
return(com);
}
/*----------------------------读数据子程序-----------------------------*/
uchar rdat(void)
{
uchar dat;
busy();
RS=1;RW=1;
DATA=0xff;
E=1;
dat=DATA;
E=0;
return(dat);
}
/*--------------------------延时1ms程子程序-----------------------*/
delay1000()
{
uint i,j;
for(i=0;i<1;i++)
for(j=0;j<124;j++)
;
}
/*---------------------------延时882us子程序-----------------------*/
delay882()
{
uint i,j;
for(i=0;i<1;i++)
for(j=0;j<109;j++)
;
}
/*--------------------------延时2400ms程子程序-----------------------*/
delay2400()
{
uint i,j;
for(i=0;i<3;i++)
for(j=0;j<99;j++)
;
}
/*--------------------------以下为初始化程序,由上面子程序组成,根据个人爱好-----------*/
/******************************清屏程序***********************************/
void clear()
{ wcom (0x01);}
/******************************归位程序********************************/
void rehome()
{ wcom(0x02); }
/*******************8*****888**88888显示模式设定8888888888888888888888*/
void mode(bit x)
{
if(x==1)wcom(0x38); //两行5*8 mode
else wcom(0x34); //一行5*10 mode
}
/*------------------------显示开关控制命令----------------------------*/
void on_off(bit x)
{
if(x==1)wcom(0x0f); //显示开,光标开,光标闪烁
else wcom(0x0c); //显示开,光标关
}
/*------------------------init初始化组合-------------------------*/
void init()
{
clear(); //清屏
mode(1); //模式设置
on_off(1); //显示设置
wcom(0x06); //移动方式
}
/*---------------------------对字符串的处理------------------------*/
void strchar(uchar *p)
{
while(*p!='\0')
{
wdata(*p);
p++;
}
}
/*----------------------------------------------------------*/
/*-----------------------红外解码程序(核心)-----------------*/
/*----------------------------------------------------------*/
void IR_decode()
{
uchar i,j;
while(IR_RE==0);
delay2400();
if(IR_RE==1) //延时2.4ms后如果是高电平则是新码
{
delay2400(); //延时4.8ms避开4.5ms的高电平
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR_RE==0); //等待地址码第1位高电平到来
delay882(); //延时882ms判断此时引脚电平
///CY=IR_RE;
if(IR_RE==0)
{
date>>=1;
date=date&0x7f;
}
else if(IR_RE==1)
{
delay1000();
date>>=1;
date=date|0x80;
}
} //1位数据接收结束
} //32位二进制码接收结束
}
}
/*------------------二进制码转换为压缩型BCD码,并显示---------------*/
void two_2_bcd(uchar date)
{
uchar temp;
temp=date;
date&=0xf0;
date>>=4; //右移四位得到高四位码
date&=0x0f; //与0x0f想与确保高四位为0
if(date<=0x09)
{
// wcom(0xcb);
wdata(0x30+date); //lcd显示键值高四位
}
else
{
date=date-0x09;
//wcom(0xcb);
wdata(0x40+date);
}
date=temp;
date&=0x0f;
if(date<=0x09)
{
wdata(0x30+date); //lcd显示低四位值
}
else
{
date=date-0x09;
wdata(0x40+date);
}
wdata(0x48); //显示字符'H'
}
//////////////////////////////转换程序结束///////////////////////////
/*----------------------解码成功后,1602显示键值子程序---------------*/
void disp()
{
uchar date1;
date1=date[3]^0xff; //如果得到的数据原码和数据反码相反
if(date[2]==date1) //显示键值
{
wcom(0xc0);
two_2_bcd(date[0]);
wdata(0x20);
two_2_bcd(date[1]);
wdata(0x20);
two_2_bcd(date[2]);
wdata(0x20);
two_2_bcd(date[3]);
}
}
/*------------------------外部中断0程序-------------------------*/
/*------------------主要用于处理红外遥控键值--------------------*/
void int0() interrupt 0
{
uint i;
for(i=0;i<4;i++)
{
delay1000();
if(IR_RE==1){k=~k;} //刚开始为4.5ms的引导码,如果4ms内出现高电平则退出解码程序
}
if(k==0)
{
EX0=0; //检测到有效信号关中断,防止干扰
IR_decode(); //如果接收到的是有效信号,则调用解码程序
disp(); //解码成功,调用显示程序,显示该键值
}
EX0=1; //开外部中断,允许新的遥控按键
}
/*---------------------------------------------------------------*/
/* 以下为主程序,主要对LCD初始化,开始界面设置 */
/*---------------------------------------------------------------*/
void main(void)
{
SP=0x60; //堆栈指针
TMOD=0x11; //定时器模式设置所选为 模式1
TH0=0xd8; //定时器初值理论为 10ms;
TL0=0xf7; //实际取d8f7
ET0=1; //允许定时器0中断
EX0=1; //允许外部中断0,用于检测红外遥控器按键
EA=1; //总中断开
init(); //初始化LCD
wcom(0x80); //写入字符的地址为第1行第1列
strchar(p0); //调用显示字符串函数
wcom(0xc0);
//strchar(p1);
while(1);
}[/code]
我来回答
回答0个
时间排序
认可量排序
暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2013-08-25 13:14:46
-
2013-08-27 13:36:22
-
2019-01-04 16:56:35
-
2016-11-24 20:36:21
-
2016-09-03 13:01:32
-
2016-03-17 20:04:10
-
2008-07-24 01:33:17
-
2008-07-15 17:50:27
-
02020-06-30 10:27:01
-
22017-03-15 18:07:39
-
2021-05-12 15:13:23
-
02012-12-24 14:23:17
-
2013-10-30 16:37:54
-
2010-01-21 11:12:15
-
2015-07-17 15:21:20
-
162017-04-12 15:34:42
-
2018-05-11 14:35:46
-
2016-08-25 15:27:02
-
2013-08-27 22:04:40
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
50帮忙解决个交叉编译的问题
-
20帮忙交叉编译个源码
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认