[求助] 为什么,我这个main函数,不可以在tft显示红外处理结果

嵌入式追溯者   2016-5-26 22:21 楼主
#include #include #include #include"wendu.h" #include"NBCTFT.h" #include"ds1302.h" #define Green 0x07E0 uchar dis2[16]; //解码结果 uchar IRQ_num; //定时中断进入次数,用判断高低电平的计时 uchar T_num[33]; bit IRF_ok; //解码1次完成标志位 bit irpro_ok,IRF_ok; unsigned char decode[4]; char code Tab[16]="0123456789ABCDEF"; #define uchar unsigned char #define uint unsigned int sbit p37=P1^7; sbit IFR_in=P3^2; //红外触发外部中断管脚 #define White 0xFFFF #define Black 0x0000 #define Blue 0x001F #define Blue2 0x051F #define Red 0xF800 #define Magenta 0xF81F #define Green 0x07E0 #define Cyan 0x7FFF #define Yellow 0xFFE0 extern cur_time[24]; extern dis_wendu[15]; uchar buf_wendu[15]="温度:+ 00.0"; extern buf_maxwendu[15]; extern buf_minwendu[15]; void delay_ms(uint j) { uchar i=0; for(;j>0;j--) for(i=0;i<125;i++); } void display_wendu() { chuli_wendu(); LCD_PutString(16,16,dis_wendu,Magenta,Blue); } void display_maxwendu() { LCD_PutString(16,16,buf_maxwendu,Magenta,Blue); } void display_minwendu() { LCD_PutString(16,16,buf_minwendu,Magenta,Blue); } void display_time() { xian_ds1302(); LCD_PutString(16,16,cur_time,Magenta,Blue); } //定时中断0处理函数 //************************************************************************************************** void IRQ_timer0(void) interrupt 1 using 1 { IRQ_num++; //计数1个周期时间,即2个下降沿之间的时间 } //************************************************************************************************** //外部中断0处理函数 //************************************************************************************************** void IRQ_EX0(void) interrupt 0 { static uchar i; //接收红外信号处理 static bit flag; //第二次进入中断时,完成第1个周期计时 if(flag) { if(IRQ_num<63&&IRQ_num>=33)//按下一次按键,先来一个13.5ms(9ms+4.5ms)引导码 i=0; //数组重新开始存储接下来的32位数的周期长度 T_num=IRQ_num; //存储每个每个周期的持续时间,用来判断高低电平 IRQ_num=0; //定时中断次数置0,以便开始计数下一个周期的持续时间 i++; //i加1 if(i==33) { IRF_ok=1; //解码1次完成,置标志位 i=0; //数组重新开始存储接下来的32位数的周期长度 } } else { IRQ_num=0; //定时中断次数置0 flag=1; //第一次进入中断,置标志位 } } //************************************************************************************************** //定时0初始化 //************************************************************************************************** void timer0_init(void)//定时器0初始化 { TMOD=0x02; //定时器0工作方式2,自动装入时间常数的8位定时器/计数器 TH0=0x00; TL0=0x00; //置初值,(256-0)x12/12000000=0.256ms ET0=1; //开定时器0中断 TR0=1; //启动定时器0 } //************************************************************************************************** //外部中断0初始化 //************************************************************************************************** void EX0init(void) { IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2) EX0 = 1; //使能外部中断 EA = 1; //开总中断 } //************************************************************************************************** //32位二进制得4字节数据 //************************************************************************************************** void bit_byte(void) { uchar i, j, k=1; uchar temp,value; for(i=0;i<4;i++) //循环4次得4字节 { for(j=1;j<=8;j++) //循环取8位得1字节 { value>>=1; //左移1位,依次从低位到高位 temp=T_num[k]; //由于第1个数据为引导码,舍去,所以从第2开即是提取后面的32位 if(temp>7) //大于7*0.256=1.8ms为1,周期1.125ms表示"0";周期2.25ms表示"1" value|=0x80; //为1则最高位赋1 k++; //k加1,准备提取下1位 } decode=value; //获取到1字节 value=0; //清0,准备提取下1字节 } } //************************************************************************************************** //码值处理函数 //************************************************************************************************** void code_pro(void) { //处理16位用户码 dis2[0] = Tab[decode[0]/16]; //取用户码第1字节的高4位 dis2[1] = Tab[decode[0]%16]; //取用户码第1字节的低4位 dis2[2] = Tab[decode[1]/16]; //取用户码第2字节的高4位 dis2[3] = Tab[decode[1]%16]; //取用户码第2字节的低4位 dis2[4] = '-'; //符号 dis2[5] = '('; //符号 dis2[6] = Tab[decode[2]/16]; //处理数据码的高4位 dis2[7] = Tab[decode[2]%16]; //处理数据码的低4位 dis2[8] = '/'; //符号 dis2[9] = Tab[decode[3]/16]; //处理数据反码的高4位,用于核对数据是否接收准确 dis2[10] = Tab[decode[3]%16]; //处理数据反码的低4位 dis2[11] =')'; //符号 } //************************************************************************************************** void display_hongwai() { EX0init(); //初始化外部中断0 timer0_init(); //初始化定时器0 while(1) //死循环 { if(IRF_ok) //接收完1次后处理 { bit_byte(); //提取到32位数据 code_pro(); //码值处理 LCD_PutString(16,16,dis2,Magenta,Blue); //显示码值 IRF_ok=0; //清标志位 } } } void main() { uint flag=0; InitDS1302(); TFT_Initial(); //tft初始化 CLR_Screen(Blue); //清屏 Show_RGB(0,240,0,320,Blue); while(1) { switch(flag) { case 0:display_wendu();break; case 1:display_maxwendu();break; case 2:display_minwendu();break; case 3:display_time();break; case 4:LCD_DrawCricle(150,80,80,Green);break; case 5:display_hongwai();break; default: LCD_PutString(16,16,"Error please check program!",Magenta,Blue); } if(p37==0) { delay_ms(1000); CLR_Screen(Blue); //清屏 flag=(flag+1)%5; } } } 本帖最后由 嵌入式追溯者 于 2016-5-26 22:22 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复