自己也不知道看了多少遍了 眼睛都花了 问题就是看不出来 或许我犯的错误比较幼稚 恳请知道的朋友们 能够指点一二
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define lcd_data_port P0
sbit lcd_en_port=P3^4;
sbit lcd_rs_port=P3^5;
sbit lcd_rw_port=P3^6;
uchar code line0[16]={" user: "};
uchar code line1[16]={" data: "};
/*****************************************/
uchar irtime;
uchar irdata[33],ircode[4];
bit ir_ok,startflag,ir_process_ok;
uchar code lcd_num_to_char[16]={"0123456789ABCDEF"}
/*****************************************/
/************红外线部分*******************/
/*****************************************/
void timer0() interrupt 1 //定时器0的服务函数
{
irtime++; //一共多少个256us
}
void EX0_init() //外部中断0的初始化函数
{
EA=1;
EX0=1;
IT0=1; //下降沿触发
}
void ex0() interrupt 0//外部中断0的服务函数
{
uchar num;
if(startflag)
{
if(irtime>33&&irtime<63)
{
num=0;
}
irdata[num]=irtime;
num++;
if(num==33)
{
num=0;
ir_ok=1;
}
}
else
{
irtime=0;
startflag=1;
}
}
void ir_process() //红外码值处理
{
uchar i,j,temp,k=0;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
temp=irdata[k+1];
temp=temp>>1;
if(irtime>7)
{
temp=temp|0x80;
}
k++;
}
temp=0;
ircode[j]=temp;
}
ir_process_ok=1;
}
/*****************************************/
/***********LCD1602部分*******************/
/*****************************************/
void delay_ms(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void lcd_busy_wait()
{
lcd_rs_port=0;
lcd_rw_port=1;
lcd_en_port=1;
lcd_data_port=0xff;
_nop_();
_nop_();
_nop_();
_nop_();
while(lcd_data_port&0x80);
_nop_();
_nop_();
_nop_();
_nop_();
lcd_en_port=0;
}
void write_com(uchar com)
{
lcd_busy_wait();
lcd_rs_port=0;
lcd_rw_port=0;
lcd_en_port=0;
lcd_data_port=com;
lcd_en_port=1;
lcd_en_port=0;
}
/*void write_dat(uchar dat)
{
lcd_busy_wait();
lcd_rs_port=1;
lcd_rw_port=0;
lcd_en_port=0;
lcd_data_port=dat;
lcd_en_port=1;
lcd_en_port=0;
} */
void lcd_init()
{
delay_ms(15);
write_com(0x38);
delay_ms(5);
write_com(0x38);
delay_ms(5);
write_com(0x38);
delay_ms(10);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
void write_dat(uchar x_pos,y_pos,dat)
{
x_pos=x_pos&0x0f;
y_pos=y_pos&0x01;
if(y_pos==1)
{
x_pos=x_pos+0x40;
}
x_pos=x_pos+0x80;
write_com(x_pos);
lcd_busy_wait();
lcd_rs_port=1;
lcd_rw_port=0;
lcd_en_port=0;
lcd_data_port=dat;
lcd_en_port=1;
lcd_en_port=0;
}
/*****************************************/
/***********LCD1602部分*******************/
/*****************************************/
void main()
{
uchar i;
lcd_init();
for(i=0;i<16;i++)
{
write_dat(i,0,line0[i]);
}
for(i=0;i<16;i++)
{
write_dat(i,1,line1[i]);
}
// EX0_init();
// T0_init();
while(1)
{
if(ir_ok==1)
{
ir_ok=0;
ir_process();
}
if(ir_process_ok==1)
{
write_dat(8,0,lcd_num_to_char[ircode[0]/0x10]);
write_dat(9,0,lcd_num_to_char[ircode[0]%0x10]);
write_dat(10,0,lcd_num_to_char[ircode[1]/0x10]);
write_dat(11,0,lcd_num_to_char[ircode[1]/0x10]);
write_dat(8,1,lcd_num_to_char[ircode[2]/0x10]);
write_dat(9,1,lcd_num_to_char[ircode[2]%0x10]);
write_dat(10,1,lcd_num_to_char[ircode[3]/0x10]);
write_dat(11,1,lcd_num_to_char[ircode[3]%0x10]);
}
}
}
|