2553|0

23

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

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

本帖最后由 嵌入式追溯者 于 2016-5-26 22:22 编辑

#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;   
  }   
  }
}

此帖出自单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表