51编程问题:用红外接收头VS1838接收红外遥控器6122并显示编码,各位大侠帮小弟看看哪里错了
执行外部中断程序时我关闭外部中断(EX1=0),退出外部中断前我开中断(EX1=1),防止执行外部中断子程序时遇到下降沿又重新执行外部中断,为什么1602就没有显示了#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit echo=P3^3;sbit rs=P3^5;sbit en=P3^4;sbit dula=P2^6;sbit wela=P2^7;uchar flag,temp;uchar dat[4];void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){rs=0;delay(2);en=1;P0=com;delay(10);en=0;}void write_dat(uchar dat){rs=1;delay(2);en=1;P0=dat;delay(10);en=0;}void lcd_init(){write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);}void timer0_init(){TMOD=0x01; //工作方式1TH0=0;TL0=0;EA=1;ET0=1;}void ex_init(){IT1=1;EX1=1;}void display(){uchar ge,shi,bai;write_com(0x80);bai=dat[0]/100;shi=dat[0]%100/10;ge=dat[0]%10;write_dat(0x30+bai);write_dat(0x30+shi);write_dat(0x30+ge);write_dat(✀ ✀);bai=dat[1]/100;shi=dat[1]%100/10;ge=dat[1]%10;write_dat(0x30+bai);write_dat(0x30+shi);write_dat(0x30+ge);write_dat(✀ ✀);bai=dat[2]/100;shi=dat[2]%100/10;ge=dat[2]%10;write_dat(0x30+bai);write_dat(0x30+shi);write_dat(0x30+ge);write_dat(✀ ✀);bai=dat[3]/100;shi=dat[3]%100/10;ge=dat[3]%10;write_dat(0x30+bai);write_dat(0x30+shi);write_dat(0x30+ge);write_dat(✀ ✀);}void main(){flag=0;wela=0;//关数码管显示dula=0;//关数码管显示lcd_init();ex_init();timer0_init();while(1){if(flag)//接收完成{flag=0;display();//显示16位用户编码、8位键数据码、8位键数据码的反码}}}void ex() interrupt 2{uchar temp,i,j;EX1=0; //关外部中断TH0=0;TL0=0;TR0=1;while(!echo);TR0=0;if((TH0<30)||(TH0>40)) return; //跳过9ms引导码TH0=0;TL0=0;TR0=1;while(echo);TR0=0;if((TH0<10)||(TH0>20)) return; //跳过4.5ms引导码dat[0]=0;dat[1]=0;dat[2]=0;dat[3]=0;for(i=0;i<4;i++) //接收4字节数据{temp=0;for(j=0;j<8;j++){TH0=0;TL0=0;while(!echo);TR0=1;while(echo);TR0=0;if((TH0<5)&&(TH0>0)) {temp>>=1;temp=temp&0x7f;}else if((TH0>=5)&&(TH0<10)) {temp>>=1;temp|=0x80;}}dat[i]=temp;}flag=1;EX1=1; //开外部中断}