main.c

来自「基于凌阳单片机数字电子钟开发源代码」· C语言 代码 · 共 463 行

C
463
字号
//======================================================
//  The information contained herein is the exclusive property of
//  Sunnnorth Technology Co. And shall not be distributed, reproduced,
//  or disclosed in whole in part without prior written permission.
//          (C) COPYRIGHT 2003  SUNNORTH TECHNOLOGY CO.
//                       ALL RIGHTS RESERVED
//  The entire notice above must be reproduced on all authorized copies.
//========================================================

//============================================================
//  工程名称:LCD_DynamicGraphicMusic.spj
//  功能描述: 超级电子表
//  IDE环境:   SUNPLUS u'nSPTM  IDE 1.8.0
//
//  硬件连接:把A口的低八位接八个按键开关和八个发光二极管
//         
//  组成文件:
//          SPLC501hardware.asm/SPLC501sys.asm/SPLC501var.asm         
//    	    splc501c.inc/splc501c_io.inc/hardware.inc/lab_parameter.h       
//          sacmv32.asm/spce.asm/sacm_user.asm/sp_lib.asm/isr.asm     
//          a2000.inc/spce.inc/sacmv32.h/sacmv32.inc
//  日期:   2006/8/23
//===============================================
//============================================================
// 文件名称:main.c
// 实现功能:超级电子表
// 日期:   2006/8/23
//============================================================
#include "lab_parameter.h"
#include "sacmv32.h"
#include "SPCE061V004.H"
#define  Timera_data (0xffff-8192)

unsigned int hour1=0,hour2=0;
unsigned int minit1=0,minit2=0;
unsigned int second1=0,second2=0;
unsigned int h1=0,h2=0,h3=0,h4=0;
unsigned int m1=0,m2=0,m3=0,m4=0;
unsigned int miaobiao[3][6]=
  {
   {0,0,0,0,0,0},
   {0,0,0,0,0,0},
   {0,0,0,0,0,0},
  }
;

unsigned int flag1=0,flag2=0,flag4=0;
unsigned int flag3=0,flag5=0,flag6=0,flag7=0; //miaobiao
unsigned int key_mb=0;//miaobiao
unsigned int temp=0;
//*************************************************************
// void  delay()  延时子程序
//*************************************************************
void delay()
{
  unsigned int i,j;
  for(j=0;j<=1;j++)                                 
           for(i=0;i<0xffff;i++)
                Clear_Watch_Dog();
}

void delay0()
{
  unsigned int i=0xffff;
  while(i--);
  Clear_Watch_Dog();
}


//*************************************************************
// void  naozhong()  设定闹钟
//*************************************************************
void naozhong()
{
   if(*P_IOA_Data==0x0002)
   {
     flag4=1;
     h1=hour1;h2=hour2;h3=minit1;h4=minit2;
     hour1=m1;hour2=m2;minit1=m3;minit2=m4;
    while(1)
    {
     if(*P_IOA_Data==0x0004)                                     //设定闹钟的小时
     {
        if(hour1+10*hour2==23) {hour1=0;hour2=0;}
        else
        {
          if(hour1<9) hour1++;
          else{hour1=0;hour2++;}
        }
     }    
     delay0();
     if(*P_IOA_Data==0x0008)                                        //设定闹钟的分钟
     {
       if(minit1<9) minit1++;
       else
       {
          minit1=0;
          if(minit2<5) minit2++;
          else minit2=0;
       }
      }
      cir_play(); 
      if(*P_IOA_Data==0x0080) {delay0();flag4=0;break;}                               
    }
     m1=hour1;m2=hour2;m3=minit1;m4=minit2;
     hour1=h1;hour2=h2;minit1=h3;minit2=h4;
  }
}


//*************************************************************
// void  set_time()  设定时间
//*************************************************************
void  set_time()
{
  if(*P_IOA_Data==0x0001) 
  {
     flag4=2;
     while(1)
   {
     if(*P_IOA_Data==0x0004)  //小时
      {
        if(hour1+10*hour2==23) {hour1=0;hour2=0;}
        else
        {
          if(hour1<9) hour1++;
          else{hour1=0;hour2++;}
        }
      }
     delay0();
     
     if(*P_IOA_Data==0x0008)  //分钟
     {
      if(minit1<9) minit1++;
      else
      {
         minit1=0;
         if(minit2<5) minit2++;
         else  minit2=0;
      }
     }
     
     cir_play();  
     if(*P_IOA_Data==0x0080) {delay();flag4=0;break;}
    }
  } 
}
//*************************************************************
//void  Play_num(int i,int j)   显示数字
//*************************************************************
void  Play_num(int i,int j,int k)
{
   switch(i)
    {
        case 0:FG_PutStr("0",3,40+j,40+k);break;      //显示0
        case 1:FG_PutStr("1",3,40+j,40+k);break;      //显示1
        case 2:FG_PutStr("2",3,40+j,40+k);break;      //显示2
        case 3:FG_PutStr("3",3,40+j,40+k);break;      //显示3
        case 4:FG_PutStr("4",3,40+j,40+k);break;      //显示4
        case 5:FG_PutStr("5",3,40+j,40+k);break;      //显示5
        case 6:FG_PutStr("6",3,40+j,40+k);break;      //显示6
        case 7:FG_PutStr("7",3,40+j,40+k);break;      //显示7
        case 8:FG_PutStr("8",3,40+j,40+k);break;      //显示8
        case 9:FG_PutStr("9",3,40+j,40+k);break;      //显示9
    } 
}

//*************************************************************
//void  play_music()   时间到脑钟响
//*************************************************************
void play_music()
{	
    	 
	unsigned int i,j;
	while(1)
	 {		
		SACM_A2000_Initial(Auto);                               //A2000播放初始化  函数包含在Sacmv32.lib
   		SACM_A2000_Play(0,DAC1+DAC2,Ramp_Up_On+Ramp_Dn_On);	    //A2000语音播放  函数包含在Sacmv32.lib
      	if((SACM_A2000_Status()&0x01) == 0)                     //判断语音是否播放结束 函数包含在Sacmv32.lib
         	 SACM_A2000_Play(0,DAC1+DAC2,Ramp_Up_On+Ramp_Dn_On);  //语音播放	函数包含在Sacmv32.lib
        if(*P_IOA_Data==0x0080) 
        {  
           SACM_A2000_Stop();
           flag1=0;
           break;
        }    	
        for(j=0;j<=7;j++)                                       //延时 保持整个显示屏点亮
           for(i=0;i<0xffff;i++)
                Clear_Watch_Dog();     
     }  	
}

//*************************************************************
//int  cir_play()   显示时间
//*************************************************************
int  cir_play()
{
        delay();
        FG_ClearScreen(0);
        if(10*hour2+hour1<12)  FG_PutStr("AM",3,125,40);
        else  FG_PutStr("PM",3,125,40); 
        Play_num(second1,0,0);
        Play_num(second2,10,0);
        FG_PutStr(":",3,55,40);
        Play_num(minit1,25,0);
        Play_num(minit2,35,0);
        FG_PutStr(":",3,80,40);
        Play_num(hour1,50,0);
        Play_num(hour2,60,0);
        if(flag2)  FG_PutStr("ON",3,30,40);
        else   FG_PutStr("OFF",3,30,40);
        switch(flag4)
        {
           case 0: FG_PutStr("The Time Is:",3,125,60);break;
           case 1: FG_PutStr("Set Clock:",3,125,60);break;
           case 2: FG_PutStr("Set Time:",3,125,60);break;
        }
        return 1; 
}
//////////////////////////////////////////////////////////////////////
int  cir_play0()
{       
        unsigned int i;
        delay();
        FG_ClearScreen(0);
        for(i=0;i<3;i++)
        {
         
             Play_num(miaobiao[i][0],0,10*(2-i));
             Play_num(miaobiao[i][1],10,10*(2-i));
             FG_PutStr(":",3,55,40+10*(2-i));
             Play_num(miaobiao[i][2],25,10*(2-i));
             Play_num(miaobiao[i][3],35,10*(2-i));
             FG_PutStr(":",3,80,40+10*(2-i));
             Play_num(miaobiao[i][4],50,10*(2-i));
             Play_num(miaobiao[i][5],60,10*(2-i));
        }
        
        return 1; 
}   
//////////////////////////////////////////////////////////////////////
//             void  pao_biao(int i1)  跑秒子程序                   //
//////////////////////////////////////////////////////////////////////   
void  pao_biao(int i1)
 {
    
    unsigned int k;
    flag6=0;
    key_mb=0;
    if(temp!=i1) flag7=1;
    if((i1>0)&&flag7) 
    {
      for(k=0;k<6;k++) miaobiao[i1][k]=miaobiao[i1-1][k];
      temp=i1;flag7=0;
    }
    if(miaobiao[i1][0]<9) miaobiao[i1][0]++;
    else 
    {
       miaobiao[i1][0]=0;
       if(miaobiao[i1][1]<9)miaobiao[i1][1]++;
       else
       {
         miaobiao[i1][1]=0;
         if(miaobiao[i1][2]<9)miaobiao[i1][2]++;
         else
         {
           miaobiao[i1][2]=0;
           if(miaobiao[i1][3]<5)miaobiao[i1][3]++;
           else
           {
             miaobiao[i1][3]=0;
             if(miaobiao[i1][4]<9)miaobiao[i1][4]++;
             else
             {
               miaobiao[i1][4]=0;
               if(miaobiao[i1][5]<5)miaobiao[i1][5]++;
               else miaobiao[i1][5]=0;
                          
             }
           }
         } 
      } 
   } 
}
 
 
 

//*************************************************************
//main()   主程序
//*************************************************************
main()
{
    unsigned int j1,j2
	asm("INT OFF");
	*P_IOA_Dir=0x0000; 				                        //IOA0~IOA7 output
    *P_IOA_Attrib=0x0000;
    *P_IOA_Data=0x0000;
 
    Init_sys();		                                       //初始化字库      函数定义在Splc501sys.asm
	FG_InitGraphic();	                                   //初始化LCDIO口   函数定义在Splc501sys.asm
    
    
    *P_TimerA_Ctrl=0x0033;                                 //4096HZ   
    *P_TimerA_Data=Timera_data;
    

    
    *P_INT_Ctrl=C_IRQ4_4KHz|C_IRQ1_TMA;
    asm("INT IRQ");
    while(1)
    {
      if(*P_IOA_Data==0x0010) {flag3=1;FG_ClearScreen(0);}
      while(flag3)
      {  
         if(*P_IOA_Data==0x0020)
        {
          switch(flag5)
          {
            case 0:flag5=1;break;
            case 1:flag5=2;break;
            case 2:flag5=3;break;
            default:flag5=0;break;
          }
          delay(); 
        }
        if(*P_IOA_Data==0x0010) 
        {
          for(j1=0;j1<3;j1++)
              for(j2=0;j2<6;j2++)
                  miaobiao[j1][j2]=0; 
          flag5=0;
        }
        if(*P_IOA_Data==0x0080){flag5=0;flag3=0;break;}
        
        cir_play0();
      }
      
      
        if(*P_IOA_Data==0x0040&&flag2==1){flag2=0;}
        else if(*P_IOA_Data==0x0040&&flag2==0){flag2=1;}
        if(flag1==1&&flag2==1)  play_music();
     
        naozhong();
        set_time();
        cir_play();
      
    }
}    
 
//*************************************************************
//  中断程序
//************************************************************* 
 
void BREAK(void) __attribute__ ((ISR));
void BREAK(void)
{
}

void IRQ0(void) __attribute__ ((ISR));
void IRQ0(void)
{
}
void IRQ1(void) __attribute__ ((ISR));
void IRQ1(void)
{
  

if(*P_INT_Ctrl&C_IRQ1_TMA)
   {
     *P_INT_Clear=C_IRQ1_TMA;
     if(second1<9)   second1++;  
     else
     {
      second1=0;
      if(second2<5) second2++; 
      else
      {
       second2=0;
       if(minit1<9) minit1++;
       else
       {
        minit1=0;
        if(minit2<5) minit2++;
        else
        {
         minit2=0;
         if(hour2*10+hour1==23) {hour1=0;hour2=0;}  
         else
          {
            if(hour1<9) hour1++;
            else {hour1=0;hour2++;}
          }
        } 
       }
     }
   }
   if(flag2)
     {
       if(m1==hour1&&m2==hour2&&m3==minit1&&m4==minit2&&second2==0&&second1==0)  flag1=1;
     }
  }




}
void IRQ2(void) __attribute__ ((ISR));
void IRQ2(void)
{
  
}
void IRQ3(void) __attribute__ ((ISR));
void IRQ3(void)
{
}
void IRQ4(void) __attribute__ ((ISR));
void IRQ4(void)
{
   if(*P_INT_Ctrl&&C_IRQ4_4KHz)
   {
      *P_INT_Clear=C_IRQ4_4KHz;
      if(flag5)
      {
        if(key_mb==40)flag6=1;
        else key_mb++;
      }
      switch(flag6)
      {
        case 1:
            switch(flag5)
            {
                case 1:pao_biao(0);break;
                case 2:pao_biao(1);break;
                case 3:pao_biao(2);break;
                case 0:break;
            }
        case 0:break;
      }
      
      
      
      
      
   
   }


  
}
void IRQ5(void) __attribute__ ((ISR));
void IRQ5(void)
{
}
void IRQ6(void) __attribute__ ((ISR));
void IRQ6(void)
{
}
void IRQ7(void) __attribute__ ((ISR));
void IRQ7(void)
{
}

⌨️ 快捷键说明

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