⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 单片机并口实验
💻 C
字号:
#include <reg52.h>
#include <stdio.h>
#include "absacc.h"
#include "math.h"

#define port_a 0x0000
#define port_b 0x0100
#define port_c 0x0210
#define port_con 0x0300

#define key_null 0x00
#define key_set 0x06
#define key_add 0x05
#define key_sub 0x03




char key_num=0;
int scantimer=0;    //扫描计数单位
int counter=0;  //毫秒计数单位

char hour=5;
char mini=12;
char sec=4;

char state=0;//表示当前的状态,0表示工作,其他态表示设置

char key=key_null;   //输入的键盘至
char last_pressed_key=key_null;

char scan=1;
char show_loop=0;

char show_buffer[]={ 0x00,	0x00,0x00,0x00,0x00,0x00,0x00,0x00};
char code char_dot[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};


void moditimer(void);
void showchar(void);

void int0(void);
void main ()
{
int i=9;

EA=1;
ET0=1;//
TMOD=1;//计数器的工作模式
TH0=0xFC;
TL0=0x17;


TR0=1;//定时器的运行控制位
EX0=1;
IT0=1;//外部中断的触发方式选择位

P1=0xff;
XBYTE[port_con]=0x81;

XBYTE[port_a]=0x81;
XBYTE[port_b]=scan;
XBYTE[port_c]=0x8f;

//设置8255

while (i==9){
}

}


void int0( )interrupt 0
{
key=XBYTE[port_c]&0x07;

if (key==key_set){
                 state++;
                 if (state>=4){state=0;}}

if (state!=0)
{   
 
/////////////////////////////
     if (state==1)
     {
         if (key==key_add)
		 {
		    if (hour<100) hour++;else hour=0;
            //hour++;
		 }
         if (key==key_sub)
		 {
		   // if (hour==0) hour=23;else 
		   hour--;
		 }
     }

/////////////////////////////
     if (state==2)
     {
         if (key==key_add)
		 {
		    if (mini<12) mini++;else mini=1;
        
		 }
         if (key==key_sub)
		 {
		    if (mini==0) mini=12;else mini--;
		 }
     }

/////////////////////////////
     if (state==3)
     {
         if (key==key_add)
		 {
           if(mini==2)
               if(hour%400==0)
                  {if (sec<29) sec++;else sec=1; }
               else
                 if(hour%100==0)
                    {if (sec<28) sec++;else sec=1; }
                 else
                   if(hour%4==0)
                      {if (sec<29) sec++;else sec=1; }
                   else                       
                      {if (sec<28) sec++;else sec=1; }
           else
                if(mini<8&&mini%2==1||mini>=8&&mini%2==0)
		            {if (sec<31) sec++;else sec=1;}
		       else
		           {if (sec<30) sec++;else sec=1;}
          

		 }
         if (key==key_sub)
		 {   if(mini==2)
               if(hour%400==0)
                 {if (sec==1) sec=29;else sec--;}
               else
                 if(hour%100==0)
                   {if (sec==1) sec=28;else sec--;}
                 else
                   if(hour%4==0)
                     {if (sec==1) sec=29;else sec--;}
                   else                       
                     {if (sec==1) sec=28;else sec--;}
             else
                if(mini<8&&mini%2==1||mini>=8&&mini%2==0)
                   {if (sec==1) sec=31;else sec--;}
                else
                   {if (sec==1) sec=30;else sec--;} 
          
		 }
     }
	 
}//非零状态结束标志

showchar();

}


void timeron( )interrupt 1
{

TH0=0xFC;
TL0=0x17;


//判断是否需要增加一秒
 
if (state==0)
{   
   if(counter<1000){ counter=counter+1;}
   else
     { 
	 counter=0;
	 moditimer(); 
	 show_buffer[2]=0x40;
	 show_buffer[5]=0x40;

  showchar();
  }
  
  if (counter==500)
     {
	 show_buffer[2]=0x00;
	 show_buffer[5]=0x00;
	 }

  
  }

 if( state!=0)
 {
	 show_buffer[2]=0x00;
	 show_buffer[5]=0x00;

  if(counter<800 )counter=counter+1;else counter=0;
   
  if (counter==0) showchar();
  if (counter==500)
     {
       if (state==1){show_buffer[0]=0;show_buffer[1]=0; };  
       if (state==2){show_buffer[3]=0;show_buffer[4]=0; };  
       if (state==3){show_buffer[6]=0;show_buffer[7]=0; };  
  
     }

 }



  
// 循环显示并且扫描键盘

if (scantimer<2)
{
scantimer++;
}
else
{
  //循环的次数并执行显示

  if (show_loop<8){show_loop++;}  else{show_loop=0 ;}  

    XBYTE[port_a]=show_buffer[show_loop];

    XBYTE[port_b]=~(scan<<show_loop);

	scantimer=0;
}


}

void moditimer(void)
{
//先加上秒
sec++;
if(mini==2)
  if(hour%400==0)
        { if (sec==30)
             { sec=1; 
               mini++;
               if (mini==13)
	           {mini=1;
		        hour++;
	            if (hour==100){ hour=0; }
    		   } 
              }}
  else
     if(hour%100==0)
           { if (sec==29)
             { sec=1; 
               mini++;
               if (mini==13)
	           {mini=1;
		        hour++;
	            if (hour==100){ hour=0; }
    		   } 
              } }     
     else
        if(hour%4==0)
             { if (sec==30)
              { sec=1; 
               mini++;
               if (mini==13)
	           {mini=1;
		        hour++;
	            if (hour==100){ hour=0; }
    		   } 
              } }     
         else                       
             {if (sec==29||sec>30)
             { sec=1; 
               mini++;
               if (mini==13)
	           {mini=1;
		        hour++;
	            if (hour==100){ hour=0; }
    		   } 
              } }      
else
      if(mini<8&&mini%2==1||mini>=8&&mini%2==0)
		{ if (sec==32)
          {  sec=1; 
            mini++;
            if (mini==13)
         	{ mini=1;
	          hour++;
              if (hour==100){ hour=0; }
	        } 
           }}
	else
	if (sec==31)
     {  sec=1; 
    mini++;
      if (mini==13)
    	{ mini=1;
	    hour++;
        if (hour==100){ hour=0; }
	    } 
     }	        



 }//---





void showchar(void)
{
char index=0;
index=sec / 10;
show_buffer[6]=char_dot[index];
index=sec % 10;
show_buffer[7]=char_dot[index];

index=mini / 10;
show_buffer[3]=char_dot[index];
index=mini % 10;
show_buffer[4]=char_dot[index];

index=hour / 10;
show_buffer[0]=char_dot[index];
index=hour % 10;
show_buffer[1]=char_dot[index];


}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -