微机原理 数字时钟显示与修改课程设计lab8000实验台

#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;
 }


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&小鹏鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值