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

📄 task.c.svn-base

📁 单片机驱动32X64点阵资料
💻 SVN-BASE
字号:
#include "NEW_8051.H"
#include"task.h"
#include <intrins.h>
#include"sbit.h"
//#include " uart.h"
/*****************************************************
       4字LED点阵屏+DS1302万年历电子钟 C 程序

*******************************************************

 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行驱动。*/

uchar Move;  //时间温度变量
uchar Speed;
uchar Flicker;
uchar line;
uint zimuo;
uchar ucLastSec;
bit c_moon;
bit ri;
bit r;
bit zz=0;
bit rr;
bit nn;
bit w;
bit Can=1;
void start(void)
{
    Move=0;  
//    E=0;		   //595使能
    zimuo=0;
    //IP=0x04;	   //设置优先级 外部中断1为优先级
    TMOD=0x21;	//定时器1   0 
    TH1=0x00;   //定时50us 晶振18.432M 定时器1方式1 16位模式初始化
    TL1=0x00;    
    ET1=1;
	//TR1=1;	
	TH0 = 0x92;	//18.432M  18.2ms
    TL0 = 0x0CD;
    ET0=1;
	TR0=1;
    //外部中断
    IT0=1;	//下降沿触发中断
    EX0=1;	//开外中断1
//    RCAP2H = 0x7D;
//    RCAP2L = 0x0CB;
//    ET2 = 1;
//    TR2=1;
    CMOD = 0x80;
    CL = 0;
    CH = 0;
    CCON = 0x00;   //清中断标志
	CCAPM0 = 0x49;
	CCAP0H = 0x0E2;
    CCAP0L = 0x00;  
	CCAPM0 = 0x49; //设置PCA0为16位定时器,允许PCA模块0中断 
    
    CR = 1;
	EA=1;		 
    ri=1;
    r=1;
    zz=0;
    rr=1;
	P1M0=0X1C;
	P1M1=0X00;
	//P3M0=0X18;
	//P3M0=0X00;    
}
/*主函数*/
void main()
{
    start();	  
    while(1)             //重复(无限)循环显示
    {
        if(irokk==1)
        {  
            Ircordpro();
            irokk=0;
        }

		if((resget==0)||(IRcord[0]==0x4a))
        {  
            DelayMs();
            if((resget==0)||(IRcord[0]==0x4a))
                {
                     Set1302(starts_time);    //初始化 
                     W1302(0x8e,0x00);            //控制命令,WP=0,写操作                
                     W1302(0x90,0xa5);            //打开充电二级管  一个二级管串联一个2K电阻
					 IRcord[0]=0x00;
                } 
        }
        /************************/         
        du1302();	  //读取 秒 分 时 日 月 星期 年
		if((Hour==0)&&(Cent==0)&&(Sec==48)&&(Can==1)&&( AddTime ))
		{							
			Sec=Sec/16*10+Sec%16;
			AddTime=AddTime/16*10+AddTime%16;
			if( !UpdateMode )
			{
				AddTime=AddTime+Sec;				
			}
			else
			{
				AddTime=Sec-AddTime;
				Can=0;	
			}
			W1302(0x8e,0x00);
			W1302(0x80,AddTime/10*16+AddTime%10);		 
			W1302(0x8e,0x80);
		}
		
		if((Hour==0)&&(Cent==1))
		{
			Can=1;
		}
        /****************************/
        if(Sec!=ucLastSec)
        {	
            ucLastSec=Sec;
            w=~w;
        }       
        c_sun=0;
        //y=R1302(0x8c+1)/16*10+R1302(0x8c+1)%16 ;        
        nian_sun=Year;
        // y=R1302(0x88+1)/16*10+R1302(0x88+1)%16	;
        yue_sun=Month;
        //	 y=R1302(0x86+1)/16*10+R1302(0x86+1)%16	;
        ri_sun=Day;
        Conver_xingqi(c_sun,nian_sun,yue_sun,ri_sun);	//农历星期转换
        Conversion(c_sun,nian_sun,yue_sun,ri_sun);	  	//农历转换        
        zimuo=0;                           	  	
        if ((key_moda==0)||(IRcord[0]==0x15))	                 //设置和选择项目键
        { 
            DelayMs();
            if((key_moda==0)||(IRcord[0]==0x15))
            {
                if(id++==12) 
                {
                    id=0;
                }
                ha=0;
                msec=0;            //清闪烁标志
                while((key_moda==0)||(IRcord[0]==0x15))
                {
                    Show_word();
                    IRcord[0]=0x00;				  
                }    
            }
        			   
        }        
        if(id!=0)
        {
            if ((key_up==0)||(IRcord[0]==0x40))                  //增加
            {
                 DelayMs();
                if((key_up==0)||(IRcord[0]==0x40))
                {
                    while((key_up==0)||(IRcord[0]==0x40))
                    {
                        Show_word();
                        IRcord[0]=0x00;            	
                    }	 //调用显示
                    ha=0;
                    msec=0;            //清闪烁标志            
                    Set(id,0);
                         //调用时间调调整
                }
                
            }
            
            if ((key_Down==0)||(IRcord[0]==0x19))  //减少
            {
                DelayMs();
                if((key_Down==0)||(IRcord[0]==0x19))
                {
                    while((key_Down==0)||(IRcord[0]==0x19))
                    {
                        Show_word();
                        IRcord[0]=0x00;                
                    }   //调用显示
                    ha=0;
                    msec=0;    //清闪烁标志
                    Set(id,1);	   //调用时间调调整
                }
                 
            }
        }
        else
        {
            if ((key_up==0)||(IRcord[0]==0x40))                  //增加
            {
                DelayMs();
                if((key_up==0)||(IRcord[0]==0x40))
                {
                    while((key_up==0)||(IRcord[0]==0x40))
                    {
                        Show_word();
                        IRcord[0]=0x00;                   
                    }	 //调用显示
                    ha=0;
                    msec=0;            //清闪烁标志  
                    if(b!=0)				 //手动调整显示的内容
                    { 
                        if(f++==6)			 //f为显示转换标志
                            f=0;
                    }
                }
                
            }
        }
        //------------------------
        if (nn==1)	   //调用温湿度读取子程序 
        {
            RH(); 
        }
        //串口显示程序 
        //--------------------------  
        Show_word();	  //待机显示按三秒间隔分别显示年、月日、星期、时分秒。       
        IRcord[0]=0x00;
    
    
    }	   
}
/****************************************************************************/  
void timer_0(void) interrupt 1 	//中断入口,闪烁
{

	TH0 = 0x92;	//18.432M  18.2ms
    TL0 = 0x0CD; 
	zz=1;
	TR0=0;
   	  
}
/******************************************************************/
void PCA_interrupt(void)  interrupt 7 //PCA0引起此中断
{	

    if(CCF0)
    {
        CCF0 = 0;
		if(msec++==18)//1s
        {
            msec=0;
            if(mm++==3)
            {
                nn=1;
            }
            x++;			    
            if(x>=a)
            { 
                x=0;
                if(b==0)		    //自动模式
                {
                    if(f++==6) 
                        f=0;          //f显示转换计数器 ,d为用户设置的自动转换时间的值。
                }
            }
            if(ha++==10)		    //5秒后进入正常走时。
            {
                id=0;
                ha=0;
            }
        }	
    if(msec<10)
        Flicker=0;	 //闪烁标志反转		 
    else
        Flicker=1; 
	   
    }
}

⌨️ 快捷键说明

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