#include<reg51.h> // 包含51单片机寄存器定义的头文件
# define uchar unsigned char
uchar xdata *keyin=0x8001;
uchar xdata *digit=0x8002;
uchar xdata *xians=0x8004;
uchar a1,a2,a3,a4,a5,a6;
int flag,flag1,flag2;
sbit q=P1^0;
sbit w=P1^1;
sbit e=P1^2;
sbit r=P1^3;
int flag11,count;
uchar hh,mm,ss;
unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
xdata unsigned char dat _at_ 0x8004;
xdata unsigned char key _at_ 0x8001;
xdata unsigned char led _at_ 0x8002;
uchar a1,a2,a3,a4,a5,a6;
unsigned int K=240;
sbit L=P1^4;
code unsigned char ledmap[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
code unsigned char keytable[]={
0x16,0x15,0x14,0xff,
0x13,0x12,0x11,0x10,
0x0d,0x0c,0x0b,0x0a,
0x0e,0x03,0x06,0x09,
0x0f,0x02,0x05,0x08,
0x00,0x01,0x04,0x07};
unsigned char pass[16];
unsigned char passbuf[16];
unsigned char sword[16]={0x00,0x01,0x02,0x03,0xff};
void delay(int a);
void ledoff(int success);
void ledsys();
void system();
unsigned char testkey()
{
led = 0;
return (~key&0x0f);
}
unsigned char getkey(int test,int success)
{
int pos;
int i;
int k;
if(test==0)
{
while(!testkey())
ledoff(success);
}
i=6;
pos=0x20;
do{
led=~pos;
pos>>=1;
k=~key&0x0f;
}while((--i!=0)&&(k==0));
if(k!=0)
{
i*=4;
if(k&2)
i+=1;
else if(k&4)
i+=2;
else if(k&8)
i+=3;
led=0;
do delay(4);while(testkey());
return(keytable[i]);
}
else return(0xff);
}
void setpassword()
{
unsigned char i;
for(i=0;i<16;i++)
{
pass[i]=getkey(0,0);
if(pass[i]==0xff)
break;
}
}
void delay(int a)
{
int i=0,j=0,q=0;
for(;i<a;i++)
for(;j<a;j++)
for(;q<a;q++)
{}
}
void ledoff(int success)
{success=0;
led=1;
dat=ledmap[success];
delay(4);
led=0x02;
dat=ledmap[0];
delay(4);
}
void system()
{
int q,x;
x=0;
K=240;
while(!testkey())
ledsys();
for(;1;)
{
for(q=0;q<16;q++)
{
passbuf[q]=getkey(1,0);
if (passbuf[q]==0xff)
break;
}
q=0;
while(sword[q]!=0xff&&q<16)
{
if(sword[q]!=passbuf[q])
break;
q++;
}
if(sword[q]==0xff)
{
K=240;
break;
}
}
}
void show1()
{
int i;
for(i=0;i<500;i++)
;
}
/*
void delay20ms(void)
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
;
}
*/
void delay2()
{
int i,j;
for(i=0;i<100;i++)
for(j=0;j<500;j++)
;
}
uchar keyscan(void)
{
uchar cord_h=0x00;
uchar cord_l=0xff;
*digit=0x3b;
*keyin=0xff;
cord_h=*keyin;
if(cord_h-0x0f!=0x00)
{
if(cord_h==0x0E)
cord_l=0x0d;
if(cord_h==0x0d)
cord_l=0x0c;
if(cord_h==0x0B)
cord_l=0x0b;
if(cord_h==0x07)
cord_l=0x0a;
P1=cord_h;
}
else
{
*digit=0x37;
*keyin=0xff;
cord_h=*keyin;
if(cord_h-0x0f!=0x00)
{
if(cord_h==0x0e)
cord_l=0x0e;
if(cord_h==0x0d)
cord_l=0x03;
if(cord_h==0x0b)
cord_l=0x06;
if(cord_h==0x07)
cord_l=0x09;
P1=cord_h;
}
else
{
*digit=0x2f;
*keyin=0xff;
cord_h=*keyin;
if(cord_h-0x0f!=0x00)
{
if(cord_h==0x0e)
cord_l=0x0f;
if(cord_h==0x0d)
cord_l=0x02;
if(cord_h==0x0b)
cord_l=0x05;
if(cord_h==0x07)
cord_l=0x08;
P1=cord_h;
}
else
{
*digit=0x1f;
*keyin=0xff;
cord_h=*keyin;
if(cord_h-0x0f!=0x00)
{
if(cord_h==0x0e)
cord_l=0x00;
if(cord_h==0x0d)
cord_l=0x01;
if(cord_h==0x0b)
cord_l=0x04;
if(cord_h==0x07)
cord_l=0x07;
P1=cord_h;
}
}
}
}
return cord_l;
}
void main(void)
{
int i;
uchar ww,gg;
EA=1; //开总中断
ss=mm=hh=0; //从0开始累计中断次数
ET1=1; //定时器T0中断允许
TMOD=0x10; //使用定时器T0的模式2
TH1=65500/256; //定时器T0的高8位赋初值
TL1=65500%256; //定时器T0的高8位赋初值
TR1=1;
flag11=1;
while(1)
{
flag11=1;
if(q)
{
flag11=0;
TR1=0;
setpassword();
hh=pass[0]*10+pass[1];
TR1=1;
for(i=0;i<1000;i++)
;
TR1=0;
setpassword();
mm=pass[0]*10+pass[1];
TR1=1;
for(i=0;i<2000;i++)
;
flag1=1;
}
}
}
void Time1(void) interrupt 3 using 2 //"interrupt"声明函数为中断服务函数 //显示计时
//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
{
TR1=0;
if(flag11)
{
count++;
if(hh>23)
hh=23;
if(mm>59)
mm=59;
}
else
count=0;
if(count>10)
{
count=0;
ss++;
if(ss==60)
{
ss=0;
mm++;
if(mm==60)
{
mm=0;
hh++;
if(hh==24)
hh=0;
}
}
}
a1=hh/10;
a2=hh%10;
a3=mm/10;
a4=mm%10;
a5=ss/10;
a6=ss%10;
*xians=dofly[a1];
*digit=0x20;
show1();
*xians=dofly[a2];
*digit=0x10;
show1();
*xians=dofly[a3];
*digit=0x08;
show1();
*xians=dofly[a4];
*digit=0x04;
show1();
*xians=dofly[a5];
*digit=0x02;
show1();
*xians=dofly[a6];
*digit=0x01;
show1();
TH1=65500/256; //定时器T0的高8位赋初值
TL1=65500%256; //定时器T0的高8位赋初值
TR1=1;
}
微机原理 数字时钟显示与修改课程设计lab8000实验台
最新推荐文章于 2022-01-03 16:52:31 发布