微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 1602屏配合红外遥控(实现光标移动)与对1602新的认识

1602屏配合红外遥控(实现光标移动)与对1602新的认识

时间:12-01 来源:互联网 点击:
1、效果图
2、代码
3、对1602新的认识(小结)

效果图

代码
工程文件下载:http://www.51hei.com/f/gxde_c.rar

#include

#include

sbit RS = P2^4; //定义端口

sbit RW = P2^5;

sbit EN = P2^6;

unsigned char sj[33]; //接收脉冲时间数组

unsigned char ac; //l602AC值,(显示缓存地址)

unsigned char i; //脉冲个数记录

unsigned char mcsj; //脉冲时间(大于0.56ms小于1.125ms为0,大于1.125ms小于2.25ms)

bit MC=0; //接收红外脉冲开始标志(0:脉冲已经结束,1:脉冲刚开始)

bit JS=0; //脉冲接收结束标志位(1标志接收结束)

bit JM=0; //解码完成标志位(1:解码完成)

void Delay(unsigned char f);

void dsq_0() interrupt 1 using 1 //定时器T0中断服务函数

{

mcsj++; //256

}

void wbzd_0() interrupt 0 //外部中断服务函数

{

if(MC)

{

if(mcsj>32) //判断是不是引导码。(如果是i=0)

i=0;

sj[i]=mcsj; //把脉冲时间存入sj这个数组里

mcsj=0; //清空脉冲时间准备接收下一个脉冲时间

i++;

if(i==33) //判断是否接收完脉冲时间

{

i=0;

JS = 1; //接收完成标志位置1

MC=0; //红外脉冲结束

}

}

else

{

MC=1; //红外脉冲开始

mcsj=0; //清空脉冲时间

}

}

void csh_dsq_0() //初始化定时器0

{

TMOD = 0x02;

TH0=0x00; //定时器0的重装数据

TL0=0x00; //初始化

ET0=1; //打开定时器0中断

TR0=1; //启用定时器0

}

void csh_wbzd_0() //初始化外部中断0

{

IT0=1; //外部中断0下降沿触发

EX0=1; //启用外部中断0

EA=1; //打开总中断

}

void hwjm(unsigned char *p) //红外解码函数

{

unsigned char i,j,k=1;

for(i=0;i<4;i++) //4组数据的计数

{

for(j=0;j<8;j++) //每组数据中的8位数据计算

{

p[i] >>= 1; //数据右移一位

if(sj[k]>7) //脉冲时间大于7的就是1

p[i] |= 0x80;

k++;

}

}

JS = 0; //分析完成清零JS

JM = 1; //解码完成JM置1

}

void Delayus(unsigned char t) // us级别延时

{

while(--t);

}

void Delayms(unsigned char t)// ms级别延时

{

while(t--)

{

//大致延时1mS

Delayus(245);

Delayus(245);

}

}

bit m_1602(bit i) //判断1602是否忙(参数i=1:读取AC值。i=0:不读AC值)

{

P0 = 0xFF; //准备读取

RS = 0;

RW = 1;

EN = 0;

_nop_();

EN = 1; //产生高电平

if(i)

ac = P0 & 0x7f; //读取AC值

return (bit)(P0 & 0x80);

}

void x_1602(bit i,unsigned char j) //参数一是写(0、写指令 1、写数据),参数二是写入的8位数据

{

while(m_1602(0))

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

RS = i;

RW = 0;

EN = 1;

P0 = j;

_nop_();

EN = 0; //产生下降沿

}

void qp_1602() //清屏函数

{

x_1602(0,0x01); //第一个参数是:写入的类型(0、写指令 1、写数据),第一个参数是:写入的数据

Delayms(5);

}

//显示字符

void zf_1602(unsigned char x,unsigned char y,unsigned dat) //参数一是显示的列,参数二是显示的行,参数三是显示的数据

{

if(y==0)

{

x_1602(0,(0x80+x)); //第一行

}

else

{

x_1602(0,(0xc0+x)); //第二行

}

x_1602(1,dat); //写入数据

}

void zfc_1602(unsigned char x,unsigned char y,unsigned char *dat)//参数一是显示的列,参数二是显示的行,参数三是显示的数据(注:数据用结尾)

{

if(y==0)

{

x_1602(0,(0x80+x)); //第一行

}

else

{

x_1602(0,(0xc0+x)); //第二行

}

while(*dat) //&:取地址 *:取值

{

x_1602(1,*dat);

dat ++;

}

}

void xhc(unsigned char *p) //红外按键匹配函数

{

switch(p[2]) //匹配按键

{

case 0x16:x_1602(1,0);break; //按键0

case 0x0c:x_1602(1,1);break; //按键1

case 0x18:x_1602(1,2);break; //按键2

case 0x5e:x_1602(1,3);break; //按键3

case 0x08:x_1602(1,4);break; //按键4

case 0x1c:x_1602(1,5);break; //按键5

case 0x5a:x_1602(1,6);break; //按键6

case 0x42:x_1602(1,7);break; //按键7

case 0x52:x_1602(1,8);break; //按键8

case 0x4a:x_1602(1,9);break; //按键9*/

case 0x44: //光标左移

{

m_1602(1); //读取AC值(此函数也是读忙值函数)

if(ac != 0x00 && ac != 0x40) //限制光标左移的边界

x_1602(0,0x10); //光标左移

break;

}

case 0x40: //光标右移

{

m_1602(1); //读取AC值(此函数也是读忙值函数)

if(ac != 0x0f && ac != 0x4f)//限制光标右移的边界

x_1602(0,0x16); //光标右移

break;

}

case 0x43: //换行

{

unsigned char io1; //记录光标所在的列

bit io2; //记录光标所在的行

m_1602(1); //读取ac值

io2 = ac & 0x40; //取出行

io1 = ac & 0x0f; //取出列

if(io2) //io2=1是第一行,io2=0是第二行

{

x_1602(0,(0x80+io1));

}

else

x_1602(0,(0xC0+io1));

break;

}

case 0x09:x_1602(0,0x1);break; //清屏

}

JM=0;

}

void

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top