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

📄 翻页万年历.c

📁 一个LED点阵屏的通用单片机程序(595+138的那种)
💻 C
📖 第 1 页 / 共 3 页
字号:
/*****************************************************
       4字LED点阵屏+DS1302万年历电子钟 C 程序【改模对换/反显】
******************************************************
声明:
     本程序中DS1302读写部分是直接引用网上网友提供的共享程序,
	  本程序供大家学习之用,用勿用于商业用途。尊重作者版权。
	 
	 编写:邓椿薪
	 时间:2006年6月9日 晚
	 邮箱:love2151@xinhuanet.com
	 网址:www.89s51diy.com
*******************************************************

 DS1302 接线图

         Vcc2  CLK I/O  /RST 
           
            |   |   |   |
           -------------------
          | 8   7   6   5  |
          |   DS1302       |
          |                |
          | 1   2   3   4  |
           -------------------
            |   |   |   |
         VCC1           GND

1 脚接+5V    2,3脚32768HZ晶振  4脚接地  5脚接S51的P02 6脚接S51的P01 7接S51的P00
8脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容
电压在2.5V以上即可维持


595连级输出数据,138行驱动。*/



#include <AT89x51.H>
#define uchar unsigned char
#define uint unsigned int
#define light 3                        //定义亮度
uchar code hanzi[];					    //汉字字模

uchar code timer[12][16];				//0~9数字
uchar code sw[];	                    //138驱动数据

void Show_word();                      //待机显示按三秒间隔分别显示年、月日、星期、时分秒。
void Show_pass();			           //不显示一个字
void Send_data(unsigned char *d);      /*串口发送一行*/



/******************************************/
sbit resget=P1^4;			//时钟复位
sbit key_moda=P1^5;			//模式转换
sbit key_up=P1^6;			//时钟加
sbit key_Down=P1^7;			//时钟减

sbit T_CLK=P1^3;		    //DS1302引脚连接
sbit T_IO =P1^2;
sbit T_RST=P1^1;

sbit ACC0=ACC^0;           //1bit数据存储位
sbit ACC7=ACC^7;

uchar starts_time[7]={0x00,0x10,0x22,0x11,0x06,0x07,0x06};	 //初始化后设置
uchar Move,Speed,Flicker,line,Sec,Cent,Hour,Year,Month,Day,Week;  //时间变量
uchar a,b,f,h,msec,id,x;           //标志计数器 a为自动转换显示时间,b为手动与自动标志
uint zimuo;		                   //字模计数器
uchar BUFF[10];			           //缓存

void   RTInputByte(uchar);         /* 输入 1Byte */
uchar  RTOutputByte(void);         /* 输出 1Byte */
void   W1302(uchar, uchar);        // 向DS1302写入一个字节
uchar  R1302(uchar);               // 从DS1302读出一个字节
void   Set1302(uchar *);           // 写DS1302时间
void   du1302();                   // 读时间  
void   DelayMs(void);              // 延时
void   Set(uchar,uchar );          // 变量调整
void   in_data();				   // 调整移动数据
void   rxd_data();				   // 串口发送移动数据

/*主函数*/
void main()
{
   Move=0;
   zimuo=0;
   TMOD=0x01;	//16位定时
   TH0=0x3c;    //25ms晶振为24M
   TL0=0xb0;
   EA=1;
   TR0=1;
   ET0=1; 
   SCON=0;             //初始化串口为工作方式0(同步通信方式,TxD输出同步脉冲)

   while(zimuo<512)
    { 
	 while(Move<16)				             //数据移位。
       {
	     for(Speed=0;Speed<10;Speed++)       //移动速度
	      {	
		    for(line=0;line<16;line++)
			  {
		         in_data();				     //调整移动数据
	             rxd_data();
			     P2_7=1;					 //锁存为高,595锁存信号
	             P2=sw[line];				 //输出行信号
	             DelayMs();	                 //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。*/
	             P2=0x7f;		             //关闭显示。
	          }
		 }
       Move++;				                 //移动一步
   	  }
     Move=0;
	 zimuo=zimuo+32;
    }	
   zimuo=0;
   while(1)             //重复循环显示
    {
	  if(resget==0)
	     {  DelayMs();
            if(resget==0)
	            Set1302(starts_time);    //初始化 
	        W1302(0x8e,0x00);            //控制命令,WP=0,写操作                
	        W1302(0x90,0xa5);            //打开充电二级管  一个二级管串联一个2K电阻 
	    }  
	  du1302();                           //读取 秒 分 时 日 月 星期 年	  	
 	  if (key_moda==0)	                 //设置和选择项目键
         {  DelayMs();
	        if(key_moda==0)
	           {
	              if(id++==9) {id=0;}
				  h=0;msec=0;            //清闪烁标志
		          while(key_moda==0){ Show_word();}    
               }						   
	     }

	  
      if(id!=0)
	  {
      if (key_up==0)                  //增加
         {
            DelayMs();
            if(key_up==0)
	           {
	   	          while(key_up==0)
						{Show_word();}	 //调用显示
		          h=0;msec=0;            //清闪烁标志
				 
		          Set(id,0);	         //调用时间调调整
		       }  
         }
   
      if (key_Down==0)  //减少
         {
            DelayMs();
            if(key_Down==0)
	            {
	              while(key_Down==0)
		              {Show_word();}   //调用显示
		          h=0;msec=0;          //清闪烁标志
		          Set(id,1);		   //调用时间调调整
		        }         
         }
	  }
	  else
	   {
	    if (key_up==0)                  //增加
          {
            DelayMs();
            if(key_up==0)
	           {
	   	          while(key_up==0)
						{Show_word();}	 //调用显示
		          h=0;msec=0;            //清闪烁标志  
	              if(b!=0)				 //手动调整显示的内容
		           { 
				     if(f++==3)			 //f为显示转换标志
			             f=0;
		           }
              }
	   	 }
	   }

   Show_word();	  //待机显示按三秒间隔分别显示年、月日、星期、时分秒。

   }	   
}
/************************************************/
void Show_word()		                 //串行输出显示
{  uchar h;		  
   for(h=0;h<16;h++)
      { 
	         if((id==0)&(f==0)|(id==1))			//f为三秒转换显示
			   {
		         Send_data(&timer[0][0]);	    //不显示
				 if((Flicker==1)&(id==1))       //闪烁标志为1时不亮,为零时亮
				    { Show_pass();			    //不显示一个字
					  Show_pass();
					}
				 else
				   {
			  	      Send_data(&timer[2][h]);        //20年   
		              Send_data(&timer[0][h]);
	                  Send_data(&timer[Year/16][h]);  //年值   
		              Send_data(&timer[Year%16][h]);
				   }
				 Send_data(&hanzi[h*2+641]);          //年字符  
		         Send_data(&hanzi[h*2+640]);
				 Send_data(&timer[0]);	              //不显示
			   }

		     if((id==0)&(f==1)|(id==2)|(id==3))			      
			  {
			     if((Flicker==1)&(id==2))		//闪烁标志为1时不亮,为零时亮
				    { Show_pass();			    //不显示一个字
					  
					}
				 else
				    {
					  if(Month/16<1)
					   	Send_data(&timer[0]);	             //月十位为零时不显示
					  else
				        Send_data(&timer[Month/16][h]);      //月值   
		              Send_data(&timer[Month%16][h]);
					}
				 Send_data(&hanzi[h*2+673]);	             //月字符
		         Send_data(&hanzi[h*2+672]);	
				 if((Flicker==1)&(id==3))		             //闪烁标志为1时不亮,为零时亮 
				    { Show_pass();			                 //不显示一个字
					  
					}
				 else
				    {				      
			  	      Send_data(&timer[Day/16][h]);          //日值   
		              Send_data(&timer[Day%16][h]);
					}
	             Send_data(&hanzi[h*2+961]);                 //日字符  
		         Send_data(&hanzi[h*2+960]);
			  }

		     if((id==0)&(f==2)|(id==4))			             //f为三秒转换显示
			  {
			     Send_data(&timer[0]);	                     //不显示
				 Send_data(&hanzi[h*2+705]);	             //星字符
		         Send_data(&hanzi[h*2+704]);
				 Send_data(&hanzi[h*2+737]);	             //期字符
		         Send_data(&hanzi[h*2+736]);
				 if((Flicker==1)&(id==4))		             //闪烁标志为1时不亮,为零时亮 
				    { Show_pass();			                 //不显示一个字
					}
				 else
				    {				 	    
			  	     Send_data(&hanzi[Week%16*32+h*2+737]);       //星期值
				     Send_data(&hanzi[Week%16*32+h*2+736]); 
					}     
		         Send_data(&timer[0][0]);	                 //不显示
			  }

			if((id==0)&(f==3)|(id>4))			             //f为三秒转换显示
			  {
			     if((Flicker==1)&(id==5))		             //闪烁标志为1时不亮,为零时亮 
				    { 
					  Show_pass();			                 //不显示一个字
					}
				 else
				    { 
					  if(Hour/16<1)
					    Send_data(&timer[0][0]);	           //时十位小于1时不显示  
			          else
					    Send_data(&timer[Hour/16][h]);         //时值
		              Send_data(&timer[Hour%16][h]);
					}
				 Send_data(&timer[10][h]);	                   //两个点
		         	
				 if((Flicker==1)&(id==6))		               //闪烁标志为1时不亮,为零时亮 
				    {
					  Show_pass();			                   //不显示一个字
					}
				 else
				    { 
					  Send_data(&timer[Cent/16][h]);   
			  	      Send_data(&timer[Cent%16][h]);           //分值
                    } 
				 Send_data(&timer[10][h]);                     //两个点
				 if((Flicker==1)&(id==7))		               //闪烁标志为1时不亮,为零时亮 
				    { 			                   

⌨️ 快捷键说明

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