51单片机显示时间日期

#include<reg52.h>
#include<max7219.h>
#include<DS1302.h>

sbit p10=P1^0;

bit flag=0;      //调整控制标记
bit flagh=1;     //时间日期切换标记
uchar temp[7];	 //调整前的时间
uchar curtime1[8],curtime2[8]; //调整后的时间显示模式
uchar tab1[]={30,40,11,31,8,2,14};	 //DS1302初始化时间
uchar xingqi;					 //读取的星期
uchar code tab2[]={0xff,0xf9,0xA4,0xb0,0x99,0x92,0x82,0xf8}; 	 //显示星期的共阴极LED

 uchar   tab4[11]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x01};	  //显示时间与日期LED数码管显示代码

 
  void delay2(void)
{
	int i,j;
	for(i=0; i<=10; i++);
	for(j=0; j<=2; j++);
}


void  main(void)
   {   
    uchar i,temp0[8];	
    P3=0xff;
	Init_7219(); 							//初始化MAX7219
	set_rtc(tab1);							//初始化DS1302
  //  init_DS1302();
    temp0[2]=10;				  //固定位置显示“-”符号
	temp0[5]=10;
 while(1)
 {  
     get_1302();					//读取时间保存在temp中

	 if(p10==0)					   //判断按键释放按下
	  delay2();
     if( p10==0 )
       {
	    flagh=0;  	
		}
   if((flagh==1))						 //时间与日期显示切换标记
   {
    
    temp0[0]=temp[0]/16;
    temp0[1]=temp[0]%16;
    temp0[3]=temp[1]/16;
    temp0[4]=temp[1]%16;
    temp0[6]=temp[2]/16;
    temp0[7]=temp[2]%16;
    
   }
   else
   {   flagh=1;						//正常显示时间,按下p10口键,显示日期
	 temp0[0]=temp[3]/16;
     temp0[1]=temp[3]%16;
     temp0[3]=temp[4]/16;
     temp0[4]=temp[4]%16;
     temp0[6]=temp[6]/16;
     temp0[7]=temp[6]%16;    	
   }
   
  for(i=0;i<8;i++)
  {	  		
   Write_7219(i+1,tab4[temp0[i]]); 
  }

 
  }
 
 }

 

#include<reg52.h>
 #include<max7219.h>


/*-------------------------------------------------
	此函数是向MAX7219写数据(操作字或者显示数据)
		address是内部寄存器的地址;
		dat是操作字或者显示的数据
-------------------------------------------------*/
void Write_7219(uchar address,uchar dat)
{    uchar i;
	ACC=address;
    LOAD=0;    				//拉低片选线,选中器件
    						//发送地址
    for (i=0;i<8;i++)   	//移位循环8次              
    	{   
      	CLK=0;        		//清零时钟总线
       	DIN=A7;   			//每次取最高位 送max7219  
 	   	CLK=1;        		//时钟上升沿,发送地址   
       	address<<=1;             //左移一位      
    	}
							//发送数据
	ACC=dat;
    for (i=0;i<8;i++)               
    	{   
       	CLK=0;
       	DIN=A7;  
       	CLK=1;        		//时钟上升沿,发送数据
	   	dat<<=1; 
   	 	}
    LOAD=1;    				//发送结束,上升沿锁存数据                       
}
/*-------------------------------------------------
	这个是MAX7219的初始化程序
	DECODE_MODE  0x09   //译码控制寄存器
	INTENSITY    0x0A   //亮度控制寄存器
	SCAN_LIMIT   0x0B   //扫描界限寄存器
	SHUT_DOWN    0x0C   //关断模式寄存器
	DISPLAY_TEST 0x0F   //测试控制寄存器
-------------------------------------------------*/
void Init_7219(void)                 
{ 
    Write_7219(SHUT_DOWN,0x01);         	//开启正常工作模式(0xX1)
    Write_7219(DISPLAY_TEST,0x00);      	//选择工作模式(0xX0)
    Write_7219(DECODE_MODE,0x00);       	//选用不译码模式
    Write_7219(SCAN_LIMIT,0x07);        	//8只LED全用
    Write_7219(INTENSITY,0x04);         	//设置初始亮度      
}

 /*
void mul_write_7219( uchar *point)			//写多个数据
{
 uchar i;

 
 for (i=0;i<8;i++)
 {
  Write_7219(i+1,*point);
  point++;		   
  }
  
  }
*/

void set_rtc(uchar tab[])						
{	uchar ucaddr=0x80;				//向时间寄存器中写初始时间的初始地址
	uchar a,i;
	write_1302(0x8e,0x00);        	//,初始化里有去除写保护
	for(i=0;i<7;i++)	
		{ a=tab[i]/10;	 			//将十进制数转换为BCD码
		  tab[i]=tab[i]%10;
		  tab[i]=tab[i]+a*16;
		  write_1302(ucaddr,tab[i]);
		  ucaddr+=2;
		}
//	write_1302(0x8e,0x80);		   	//添加写保护
}

/*-------------------------------------------------
	这个函数是将1302的时间寄存器中的数据多字节一起读出,放到curtime数组里
		{0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};   
		从时间寄存器中读数据的初始地址
  		将读出的数据放到数组curtime中
-------------------------------------------------*/
void get_1302()				 	//将1302的时间寄存器中的数据多字节一起读出,放到curtime数组里
{	uchar ucaddr=0x81;			//从时间寄存器中读数据的初始地址
	uchar i=0;
	//for(i=0;i<7;i++)
	while(i<7)
	{
			temp[i]=read_1302(ucaddr);
			ucaddr+=2;
			i++;
		
		}
}
void init_DS1302(void)			//分别初始化,没用循环语句
{
write_1302(0x80,0x30);  
write_1302(0x82,0x25);  
write_1302(0x84,0x01); 	
write_1302(0x86,0x25); 
write_1302(0x88,0x02); 
write_1302(0x8A,0x04); 
write_1302(0x8c,0x14); 	
write_1302(0x8e,0x0);  //去写保护

}

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值