#include <reg52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0X77,0X7c,0X39,0X5e,0X79,0X71,0x00};
sbit IR=P3^2;
sbit we1=P1^0;
sbit we2=P1^1;
sbit we3=P1^2;
sbit we4=P1^3;
uchar N[4]; //识别码,数据码存放
uchar X1,X2;
void XSQ(void);
void YS(uchar time);
/****************** 主函数 *******************/
void main(void)
{
X1=X2=0;
IT0 = 1;
EX0 = 1;
EA = 1;
while(1)
{
XSQ();
}
}
/**********************数码管显示函数************************/
void XSQ(void)
{
we1=0;
we2=0;
we3=0;
we4=0;
we1=0;P0=tab[X1];we2=1;YS(1);
we2=0;P0=tab[X2];we1=1;YS(1);
}
/********************** 外部中断函数************************/
void exint0() interrupt 0
{
uint cnt;
uchar i;
EX0 = 0;
cnt = 0;
while(!IR)
{
cnt++;
} //记录引导码时间
if(cnt < 1000)
{EX0=1;return;} //9ms的计数值(12MHz:1000< cnt <1500)
cnt = 0;
while(IR)
{
if(cnt++>400)
{EX0=1;return;}
} //防卡死,超时保护(12MHz: > 300)
if(cnt<200)
{EX0=1;return;}
//(12MHz不分频: <260)
for(i=0; i<32; i++) //读取32位位码
{
cnt = 0;
while(!IR);
while(IR)
if(cnt++ > 200)
{EX0=1;return;} //超时保护(12MHz:>=200)
N[i/8] >>= 1;
if(cnt>60) N[i/8] |= 0x80; //0和1的计数界线(12MHz:< 109)
}
if(N[0] == ~N[1] && N[2] == ~N[3]) //校验识别码,数据码
{
X1 = N[2]/16;
X2 = N[2]%16;
}
EX0 = 1;
}
/***************************************************************
延时程序
1ms×time (晶振=12MHz)
***************************************************************/
void YS(uchar time)
{
uchar i,j;
for(i=0; i<time; i++)
for(j=0; j<247; j++)_nop_();
}
|