单片机驱动32X64点阵资料

源代码在线查看: task.c.svn-base

软件大小: 1701 K
上传用户: dean
关键词: 32X64 单片机驱动 点阵资料
下载地址: 免注册下载 普通下载 VIP

相关代码

				#include "NEW_8051.H"
				#include"task.h"
				#include 
				#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				        Flicker=0;	 //闪烁标志反转		 
				    else
				        Flicker=1; 
					   
				    }
				}			

相关资源