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

📄 disp1302.c

📁 单片机C语言15个实验附有原理图和程序 是我的课程作业 以经过实践验证
💻 C
字号:
#include<stdio.h>
#include<reg51.h>
#include<intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define hi1 0xff
#define lo1 0x00
#define hi 0x3c
#define lo 0xb0
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;//p2
unsigned char code ledk[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned char code al_r_addr[15]={0xc1,0xc5,0xc9,0xcd,0xd1,0xd5,0xd9,0xdd,
                              0xe1,0xe5,0xe9,0xed,0xf1,0xf5,0xf9};
unsigned char code al_w_addr[15]={0xc0,0xc4,0xc8,0xcc,0xd0,0xd4,0xd8,0xdc,
                              0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8};
unsigned char mask=0xee;disp[8],disp_set[8],key,key_0,
             key_flag,set_flag,al_set_flag,year_set_flag,alarm;
char set_no;
unsigned char al_i,al_i_max,al_hour,al_min,set_hour,set_min,set_sec;
unsigned char set_year,set_month,set_day,set_week;
unsigned char year_1302,month_1302,day_1302,
              hour_1302,min_1302,sec_1302,week_1302;
unsigned char t0_count,key_count,t1_count;
sbit P37=P3^7;sbit P10=P1^0;
sbit T_clk=P3^4;sbit T_io=P3^5;sbit T_rst=P3^6;
sbit clk=P0^7;sbit sda=P0^6;                                                                                      //p3
//=============================
void delay (unsigned int n)
{unsigned int i,j;
 for(i=0;i<n;i++)
   for(j=0;j<n ;j++);   }
void shift(dd)
  {unsigned char j=0;
	while(j<8){if((dd&0x80)!=0)sda=1;else sda=0;
				   clk=0; clk=1; dd<<=1;j++;}	}
//***** DS1302 *****************
void v_RTinputByte(unsigned char ucDA)
{unsigned char i;
  for(i=8;i>0;i--)
    {if((ucDA&0x01)!=0)T_io=1;
        else T_io=0;
     T_clk=1;T_clk=0;delay(4);
	 ucDA>>=1;}   }
unsigned char v_RToutputByte(void)
{unsigned char i,da=0;
  for(i=8;i>0;i--)
    {if(T_io!=0)da=da|0x80;
	      else da=da|0x00;
	 if(i>1)da>>=1;
     T_clk=1;T_clk=0;delay(4);}
  return da;}
unsigned char R1302(unsigned char address)
  {unsigned char ucDA; 
    T_rst=0;T_clk=0;T_rst=1;
    v_RTinputByte(address);
    ucDA=v_RToutputByte();delay(4);
    T_clk=1;T_rst=0;
	return ucDA;  }
void W1302(unsigned char address,ucDA)
  { T_rst=0;T_clk=0;T_rst=1;
    v_RTinputByte(address);
    v_RTinputByte(ucDA);delay(4);
    T_clk=1;T_rst=0;
	 }
//----------disptoclk-----------
void disptoclk(void)
  {set_hour=disp_set[7]*16+disp_set[6];
   set_min=disp_set[5]*16+disp_set[4]; 
   set_sec=disp_set[2]*16+disp_set[1];  }
void disptoalclk(void)
  {al_hour=disp_set[7]*16+disp_set[6];
   al_min =disp_set[5]*16+disp_set[4]; 
   al_i_max=disp_set[2];  }
void disptoyear(void)
  {set_year=disp_set[7]*16+disp_set[6];
   set_month=disp_set[5]*16+disp_set[4]; 
   set_day=disp_set[3]*16+disp_set[2];
   set_week=disp_set[0];}
//---------disp-----------
void clktodisp1(unsigned char j,xx)
 {unsigned char xx1;
  xx1=xx;
  disp[j]=(xx>>4)&0x0f;
  if(set_flag==1||al_set_flag==1||year_set_flag==1)disp_set[j]=disp[j];
  j--;
  disp[j]=xx1&0x0f;    
  if(set_flag==1||al_set_flag==1||year_set_flag==1)disp_set[j]=disp[j];
 }
void display_normal( )
{static unsigned char i;
 if(sec_1302>2){if(i==4||i==6)shift(ledk[disp[i]]|0x80);
                  else if(i==3||i==0)shift(ledk[16]);
                    else shift(ledk[disp[i]]); }
   else {if(i==6||i==4||i==2)shift(ledk[disp[i]]|0x80);
           else shift(ledk[disp[i]]);}
   P20=i&0x04;P21=i&0x02;P22=i&0x01;i++;if(i>7)i=0;} 
void display_1( )//display set_hour,min,sec or al_hour,al_min
{unsigned char i;
  for(i=0;i<8;i++)
   { if(t0_count<5 && i==set_no)shift(ledk[16]);
	  else if((i==3||i==0) && set_flag==1)shift(ledk[16]);
		 else if((i==3||i==1)&& al_set_flag==1)shift(ledk[16]);
           else if(i==0 && al_set_flag==1)shift(ledk[al_i]);
			 else if(al_set_flag==1)shift(ledk[disp_set[i]]|0x80); 
 			    else shift(ledk[disp_set[i]]);
	  P20=i&0x04;P21=i&0x02;P22=i&0x01;delay(15);} }
void display_2( )//display set_year,month,.....
 {unsigned char i;
  for(i=0;i<8;i++)
   { if(t0_count<5 && i==set_no)shift(ledk[16]);
	   else if(i==1)shift(ledk[16]);
         else if((i==6||i==4||i==2)||i==0)shift(ledk[disp_set[i]]|0x80); 
		   else shift(ledk[disp_set[i]]);
	   P20=i&0x04;P21=i&0x02;P22=i&0x01;delay(15);} }
void t0() interrupt 1 
 {TH0=hi;TL0=lo;t0_count++;key_count++;
   if(t0_count==20)t0_count=0;
   if(key_count>10)key_count=0; }
void t1() interrupt 3
  {TH1=hi1;TL1=lo1;t1_count++;
   if(t1_count==16){t1_count=0;display_normal( );}
   if(alarm==1 && t0_count<10)P10=!P10;
                       else P10=0;         }  
//---------key--------------
unsigned char get_char()
{unsigned char key_code;
 static unsigned char column=0;
   if(P37==0 && key_flag==1)
{key_code=column;key_flag=0;key_count=0;}
    else key_code=0xff;
   column++;if(column>3)column=0;
   mask=_crol_(mask,1);
   P27=mask&0x80;P26=mask&0x40;
P25=mask&0x20;P24=mask&0x10;
   return key_code;}
void key_func(key)
{switch (key)
  {case 0: set_no=7;key_0++; 
          if(key_0<3)
			 {set_flag=1;al_set_flag=0;year_set_flag=0;
              sec_1302=R1302(0x81); 
clktodisp1(2,sec_1302); delay(3);
		      min_1302=R1302(0x83);
 clktodisp1(5,min_1302); delay(3);
	          hour_1302=R1302(0x85);
clktodisp1(7,hour_1302);delay(3);}
            else if(key_0>=3 && key_0<20)
             {set_flag=0;al_set_flag=1;year_set_flag=0;
			  al_i_max=R1302(0xfd);
clktodisp1(3,al_i_max);delay(3);
			  al_i++;if(al_i>al_i_max)al_i=0;
			  al_min=R1302(al_r_addr[al_i]);
clktodisp1(5,al_min);delay(3);
              al_hour=R1302(al_r_addr[al_i]+2);
clktodisp1(7,al_hour);delay(3);  }
		    else {set_flag=0;al_set_flag=0;year_set_flag=1;
                 day_1302 =R1302(0x87); delay(3);  
                 month_1302=R1302(0x89);delay(3); 
                 year_1302 =R1302(0x8d);delay(3);  
                 week_1302 =R1302(0x8b);delay(3); 
			  clktodisp1(7,year_1302);
clktodisp1(5,month_1302);
              clktodisp1(3,day_1302); 
clktodisp1(1,week_1302); }
			  break;
    case 1:  set_no--;
             if(set_flag==1){if(set_no==3)set_no=2;
			                 if(set_no==0)set_no=7;}
             if(al_set_flag==1){if(set_no==3)set_no=2;
                                if(set_no==1)set_no=7;}
             if(year_set_flag==1)
			     {if(set_no<0)set_no=7;
				  if(set_no==1)set_no=0;}
             break;
    case 2:  disp_set[set_no]++;
	     if(set_flag==1||al_set_flag==1)
            {if(set_no==7 && disp_set[set_no]>2)
 disp_set[set_no]=0;
             if(set_no==6 && disp_set[set_no]>9) 
disp_set[set_no]=0;
             if(set_no==5 && disp_set[set_no]>5) 
disp_set[set_no]=0;
             if(set_no==4 && disp_set[set_no]>9)
 disp_set[set_no]=0;
             if(set_no==2&&al_set_flag==1&&disp_set[set_no]>14)
disp_set[set_no]=0;
			 if(set_no==2&&set_flag==1&&disp_set[set_no]>5)
disp_set[set_no]=0;
             if(set_no==1&&set_flag==1&&disp_set[set_no]>9)
disp_set[set_no]=0;}
          else if(year_set_flag==1)
	        {if(set_no==7 && disp_set[set_no]>9)
 disp_set[set_no]=0;
             if(set_no==6 && disp_set[set_no]>9) 
disp_set[set_no]=0;
             if(set_no==5 && disp_set[set_no]>1) 
disp_set[set_no]=0;
             if(set_no==4 && disp_set[set_no]>9)
 disp_set[set_no]=0;
             if(set_no==3 && disp_set[set_no]>3) 
disp_set[set_no]=0;
             if(set_no==2 && disp_set[set_no]>9)
 disp_set[set_no]=0;
			 if(set_no==0 && disp_set[set_no]>7) 
disp_set[set_no]=1;}
             break;
    case 3:  key_0=0;
             if(set_flag==1)
			     {disptoclk();W1302(0x8e,0);delay(2);W1302(0x8e,0);
                   W1302(0x80,sec_1302&0x7f);
                   W1302(0x80,set_sec);delay(2);W1302(0x80,set_sec);
				   W1302(0x82,set_min);delay(2);W1302(0x82,set_min);
                   W1302(0x84,set_hour);delay(2);W1302(0x84,set_hour); 
				   set_flag=0;TR1=1;}
             else if(al_set_flag==1)
                 {disptoalclk();W1302(0x8e,0);delay(2);W1302(0x8e,0);
                      W1302(0x80,sec_1302&0x7f);
				      W1302(al_w_addr[al_i],al_min);delay(2);
				      W1302(al_w_addr[al_i],al_min);
                      W1302(al_w_addr[al_i]+2,al_hour);delay(2);
				      W1302(al_w_addr[al_i]+2,al_hour); 
                      W1302(0xfc,al_i_max);delay(2);
				      W1302(0xfc,al_i_max); 
                   al_set_flag=0;TR1=1; } 
             else if(year_set_flag==1)
			     {disptoyear();W1302(0x8e,0);delay(2);W1302(0x8e,0);
                   W1302(0x80,sec_1302&0x7f);
                   W1302(0x8c,set_year);delay(2);W1302(0x8c,set_year);
				   W1302(0x88,set_month);delay(2);W1302(0x88,set_month);
                   W1302(0x86,set_day);delay(2);W1302(0x86,set_day);
                   W1302(0x8a,set_week);delay(2);W1302(0x8a,set_week);
				   year_set_flag=0;TR1=1;}
     		 break;
    default: break;               }  }

 //---------------------------
void main(void)
 {static unsigned char i;
   TMOD=0x11; TH0=hi;TL0=lo; TH1=hi1;TL1=lo1; 
EA=1;ET0=1;ET1=1;TR0=1;TR1=1;  
   W1302(0x8e,0);delay(2);W1302(0x8e,0);
   sec_1302=R1302(0x81);
   W1302(0x80,sec_1302&0x7f);delay(2);
W1302(0x80,sec_1302&0x7f);
   P10=0;
    while(1)
     {key=get_char( );key_func(key);
	  if(set_flag==1||al_set_flag==1){TR1=0;display_1( );}
            else if(year_set_flag==1){TR1=0;display_2( );}
         else {TR1=1;
               sec_1302  =R1302(0x81);delay(3);
               min_1302  =R1302(0x83);delay(3);
	           hour_1302 =R1302(0x85);delay(3);  
               day_1302  =R1302(0x87);delay(3);  
               month_1302=R1302(0x89);delay(3); 
               year_1302 =R1302(0x8d);delay(3);  
               week_1302 =R1302(0x8b);delay(3); 
               if(sec_1302<=2)
                  {clktodisp1(7,year_1302);
clktodisp1(5,month_1302);
                   clktodisp1(3,day_1302);
disp[1]=16;
disp[0]=week_1302&0x0f;}
               else{clktodisp1(2,sec_1302);clktodisp1(5,min_1302);
			        clktodisp1(7,hour_1302);}
              // display_normal( );
	           if(alarm==0)
                  {al_min=R1302(al_r_addr[i]); delay(3);
			       al_hour=R1302(al_r_addr[i]+2); delay(3);
			       i++;if(i>al_i_max)i=0;  }
               if(hour_1302==al_hour && min_1302==al_min)alarm=1;
			        else alarm=0;
			  }		 
	  if(key_flag==0 && key_count==10 && P37==1)key_flag=1;
       W1302(0x8e,0x80);
	  }		  
 }


⌨️ 快捷键说明

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