|
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar duan[11]={0xbf,0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //所需的段的位码
//uchar wei[6]={0X7f,0Xbf,0Xdf,0Xef,0xf7,0xfb}; //位的控制端 (开发板)
uchar wei[6]={0X80,0X40,0X20,0X10,0x08,0x04}; //位的控制端 (仿真)
uchar aj[6]={0xbf,0Xbf,0xbf,0xbf,0xbf,0xbf};
uchar z,x,c,v,b,n; //定义数据类型
uchar count;
uchar pwflag;//密码是否正确的标志位
uchar pwflag;//密码是否正确的标志位
uchar m[]={1,2,3,4,5,6}; //初始密码
static uchar mbuf[6];///输入的密码
/******************************************************************
延时函数
******************************************************************/
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
{
for(j=1000;j>0;j--);
{ ;
}
}
}
/**********************************************************************
数码管动态扫描
*********************************************************************/
void xianshi()
{
/*****************数据转换*****************************/
P2=wei[0];
P0=duan[mbuf[0]];
delay(1);
P2=wei[1];
P0=duan[mbuf[1]];
delay(1);
P2=wei[2];
P0=duan[mbuf[2]];
delay(1);
P2=wei[3];
P0=duan[mbuf[3]];
delay(1);
P2=wei[4];
P0=duan[mbuf[4]];
delay(1);
P2=wei[5];
P0=duan[mbuf[5]];
delay(1);
}
/*************************************************************************
密码对错判断
**************************************************************************/
bit pwcmp(void)
{
bit flag;
uchar i;
for (i=0;i<6;i++)
{
if (m==mbuf) flag = 1; //*密码正确*/
else { flag = 0; i=6; } //*密码错误*/
}
return(flag);
}
/*************************************************************************
取键值
**************************************************************************/
uchar getkey(void)///得到键值
{
uchar h,l,k;
while(P1!=0x0f)
{
h=P1&0x0f;
P1=0xf0;
l=P1&0xf0;
k=h|l;
return(k);
}
}
/*************************************************************************
串口发送数据
**************************************************************************/
void disp(void)
{
uchar i;
for(i=6;i>=0;i--)
{
SBUF=68;//mbuf;
while(!TI);
TI=0;
}
}
/*************************************************************************
恢复初始值
**************************************************************************/
void chushiz(void)
{ count=0;
P2=wei[0];
P0=duan[mbuf[0]];
delay(1);
P2=wei[1];
P0=duan[mbuf[1]];
delay(1);
P2=wei[2];
P0=duan[mbuf[2]];
delay(1);
P2=wei[3];
P0=duan[mbuf[3]];
delay(1);
P2=wei[4];
P0=duan[mbuf[4]];
delay(1);
P2=wei[5];
P0=duan[mbuf[5]];
delay(1);
}
/*************************************************************************
判断键值
**************************************************************************/
void Getch (uchar i)
{
switch (i) //判断键值(那一个键按下)
{
case 0xe7: if (count<6) { mbuf[count]=1; count++;SBUF=65;while(!TI);TI=0;}break;
case 0xd7: if (count<6) { mbuf[count]=2; count++;SBUF=66;while(!TI);TI=0;}break;
case 0xb7: if (count<6) { mbuf[count]=3; count++;SBUF=67;while(!TI);TI=0;}break;
case 0x77: if (count<6) { mbuf[count]=4; count++;SBUF=68;while(!TI);TI=0;}break;
case 0xeb: if (count<6) { mbuf[count]=5; count++;SBUF=69;while(!TI);TI=0;}break;
case 0xdb: if (count<6) { mbuf[count]=6; count++;SBUF=70;while(!TI);TI=0;}break;
case 0xbb: if (count<6) { mbuf[count]=7; count++;SBUF=71;while(!TI);TI=0;}break;
case 0x7b: if (count<6) { mbuf[count]=8; count++;SBUF=72;while(!TI);TI=0;}break;
case 0xed: if (count<6) { mbuf[count]=9; count++;SBUF=73;while(!TI);TI=0;}break;
case 0xdd: if (count<6) { mbuf[count]=10;count++;SBUF=74;while(!TI);TI=0;}break;
case 0xbd: if (count==6) { pwflag = pwcmp();} else pwflag = 0;
if(pwflag) {P3=0Xaa;} else {P3=0X00;}break;
case 0x7d: if (count<=6) {count=0;}break;
} }
/*************************************************************************
串口初始化,波特率9600,方式1
**************************************************************************/
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
/*************************************************************************
主函数
**************************************************************************/
void main()
{
uchar key;
Init_Com();//串口初始化
count=0;
P0=0xbf;
while(1)
{
P1=0x0f;
if(P1!=0x0f)
{
delay(400);
key=getkey();
Getch(key);
delay(400);
} /*
if ( RI ) //扫描判断是否接收到数据,
{
date = SBUF; //接收数据SBUF赋与dat
RI=0; //RI 清零。
SBUF = date; //在原样把数据发送回去
} */
xianshi();
}
}
|
|