#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 编辑