#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar getcode(uchar o);
sbit P32=P3^2;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit P10=P1^0;
sbit P11=P1^1;
bit flag_tt0;
bit flag_c;
uchar chuanshu=0x00;
//sbit flag_cs=ACC^7;最好不要用acc来传数,因为中间数据极有可能变化,不是稳定的
/*精确延时,主要是用来产生880ms中断,用来判断*/
/*是高电平,还是低电平 */
/* 4740ms是用来判断9s过后的4.5ms是否完的
* /用中断来实现精确定时 */
/**///////////////////////////////////////////////
//uchar code tab1[]={0x10,0x03,0x01,0x06,0x09,0x1D,0x1F,0x0D,0x19};
//uchar code tab[]={0x28,0x7E,0xA2,0x62,0x74,0x61,0x21,0x7A,0x20,0x60,0x30,0x25,0xA7,0x26,0xA1,0xB1};
uchar a[4];
uchar x=0x00;//用来表示第一位验证码
uchar y=0xff;//第二位
uchar b=0x00;//用来装要显示的数的数码值,第三位
uchar z=0xff;//用来保存第四位,也就是第三位的反
//显示发过来的数,数码值放在i里面
void delay(uchar j)
{
while(j--);
}
void display(void)
{
uchar e,f,g,h,i,j,k,l;
e=x&0xf0;
e=e>>4;
f=x&0x0f;
g=y&0xf0;
g=g>>4;
h=y&0x0f;
i=b&0xf0;
i=i>>4;
j=b&0x0f;
k=z&0xf0;
k=k>>4;
l=z&0x0f;
P2=0x0ff;
P0=getcode(e);
P20=0;
delay(152);
P2=0x0ff;//数码管第二位开始显示
P0=getcode(f);
P21=0;
delay(152);
P2=0x0FF;
P0=getcode(g);
P22=0;
delay(152);
P2=0x0ff;
P0=getcode(h);
P23=0;
delay(152);
P2=0x0ff;
P0=getcode(i);
P24=0;
delay(152);
P2 =0x0ff;
P0 = getcode(j);
P25= 0;
delay(152);
P2 =0x0ff;
P0=getcode(k);
P26=0;
delay(152);
P2 =0x0ff;
P0 = getcode(l);
P27=0;
delay(152);
P2 =0x0ff;
}
uchar getcode(uchar o) {
uchar m;
switch(o)
{case 0: m=0x28;break;
case 1: m=0x7E;break;
case 2: m=0x0A2;break;
case 3: m=0x62;break;
case 4: m=0x74;break;
case 5: m=0x61;break;
case 6: m=0x21;break;
case 7: m=0x7A;break;
case 8: m=0x20;break;
case 9: m=0x60;break;
case 10:m=0x30;break;
case 11:m=0x25;break;
case 12:m=0xA7;break;
case 13:m=0x26;break;
case 14:m=0xA1;break;
case 15:m=0xB1;break;
default: break;
}
return(m);
}
void int00(void) interrupt 0
{uchar w=4;
uchar n=8;
uchar p=0;
EX0=0;
flag_tt0=0;
TH0=0xfc;
TL0=0xbd;
TR0=1;
//P10=0;
while(flag_tt0==0);
flag_tt0=0;
if(P32==0) {
TH0=0xe0;
TL0=0xfd;//定时8820减掉上面的882
TR0=1;
while(flag_tt0==0);
flag_tt0=0;
while(P32==0);
TH0=0xed;
TL0=0x7b;//定时4740
TR0=1;
while(flag_tt0==0);
flag_tt0=0;
if(P32==0) {
while(w--) {
while(n--){
chuanshu=chuanshu>>1;
while(P32==0);
TH0=0xfc;
TL0=0xb7;
TR0=1;
while(flag_tt0==0);
flag_tt0=0;
flag_c=P32;
while(P32==1);
if(flag_c==1)
chuanshu=chuanshu+0x80;
//通信的话一般是传送低位数据,再传送高位
a[p]=chuanshu; }
//P1=ACC;
chuanshu=0;
p++;
n=8;
}
// if(0x00^a[0]==0x00) {//用来判断结果是否正确
//if(0x00^a[1]==0x00) {
//if(a[2]==~a[3]) {
// ca2=a[2];
// }
// }
// }
}
}
EX0=1;
//P11=0;
}
void main(void)
{
while(1)
{uchar n=9;
IE=0x83;
IP=0x02;//t0设置为高优先级
TMOD=0x01;//设置t0的工作方式
IT0=1;
if(a[2]==~a[3]) {
x=a[0];
y=a[1];
b=a[2];
z=a[3];
}
display();
}
}
void tt0(void) interrupt 1
{
TR0=0;
flag_tt0=1;
}