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

📄 main.c

📁 基于凌阳单片机数字电子钟的C语言源代码 基于凌阳单片机数字电子钟的C语言源代码
💻 C
字号:
//======================================================================
//	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.
//======================================================================

//======================================================================
//	工程名称:	monthdayclock.spj
//	功能描述:	万年历,农历和电子钟,具备拨报日期、时间、正点报时、秒表、闹钟等功能。
//  IDE环境:   SUNPLUS u'nSPTM  IDE 2.0.0(or later)
//	涉及的库:	CMacro1016.lib
//              sacmv26e.lib
//	组成文件:	main.c/system./Key.c/speak.c/IRQ.asm/miaobiao/asm
//	硬件连接:	
//              IOA8-15接液晶显示模块DB0-DB7
//              IOB4接液晶显示模块AO
//              IOB5接液晶显示模块的R/W
//              IOB6接液晶显示模块的EP
//	维护记录:	2006-7-31	v1.0    by zhenlei
//======================================================================

//======================================================================
//	文件名称:	main.c
//	功能描述:  系统初始化,显示时间日期界面
//              按KEY1,进入时间调整和功能选择菜单。
//              按KEY2,拨报当前的时间。
//              按KEY3,拨报当前的日期。
//              KEY2、KEY3同时按下控制闹钟的开关
//	维护记录:	2006-7-31	v1.0
//======================================================================
#include "SPCE061A.h"
#include "SPLC501User.h"
#include "model.h"
#define ring1 17                                        //播放第一个铃声的序号
#define ring2 18                                        //播放第二个铃声的序号
//======================================================================
//对主函数调用的函数声明
//======================================================================
extern void display();
extern void PlayRespond(unsigned int Result);
extern void speaktime();
extern void keyscan();
extern void nextdisplay(); 
extern void setday();
extern void set_ring();
extern void setsecond();  
extern void speaktime();
extern void speakday();
extern void keyinitial();
//=======================================================================

//=======================================================================
//定义文件中用到的变量以及常数数组
//=======================================================================
unsigned int keyflag1=0;                                         //键按下标志1,控制进入功能选择菜单
unsigned int keyflag2=0;                                         //键按下标志2,
unsigned int keyflag3=0;                                         //键按下标志3,控制进入时间日期调整界面
unsigned int keyflag4=0;                                         //键按下标志4,控制进入闹钟时间设置界面
unsigned int keyflag5=0;                                         //键按下标志5,控制进入秒表设置界面
unsigned int keyflag6=0;                                         //键按下标志6,控制进入闹钟设置界面
unsigned int keyflag7=0;                                         //键按下标志7,控制进入闹钟铃声选择界面
unsigned int ringflag=0;                                         //播放铃声标志位1播放第一首2播放第二首
unsigned int keyvalue=0;                                         //存放按下的键值
unsigned int runflag=0;                                          //当年闰月标志位
unsigned int num=0;                                              //2HZ计数单元
unsigned int hour=0;                                             //存放当前的小时
unsigned int min=0;                                              //存放当前的分钟
unsigned int sec=0;                                              //存放当前的秒
unsigned int year=2006;                                          //存放当前的年
unsigned int gmonth=8;                                           //存放当前的公历的月
unsigned int gday=1;                                             //存放当前的公历的日
unsigned int xqvalue=0;                                          //存放当前的星期
unsigned int nmonth=7;                                           //存放农历的月
unsigned int nday=8;                                             //存放农历的日
unsigned int runxq[]={3,6,0,3,5,1,3,6,2,4,0,2};                  //润年星期偏差表
unsigned int pingxq[]={4,0,0,3,5,1,3,6,2,4,0,2};                 //平年星期偏差表
unsigned int mouse[]={1,17,32,48};                               //箭头坐标数组
unsigned int nhour=12;                                           //存放闹钟的小时
unsigned int nmin=0;                                             //存放闹钟的分钟
unsigned int mbmin=0;                                            //存放秒表的分
unsigned int mbsec=0;                                            //存放秒表的秒
unsigned int mmsec=0;                                            //存放秒表的毫秒
unsigned int mbnum=0;                                            //1KHZ中断标志位
unsigned int onoff=0;                                            //闹钟开关标志
unsigned int int2hz;                                             //设置一个2HZ中断标志  
unsigned int ringonoff;                                          //闹钟响时关闭标志     
char number[]={'0','1','2','3','4','5','6','7','8','9'};         //设置待显示的数字。 	              
unsigned int clockset[]={11,31,51};                              //设置闹钟铃声时的光标 
unsigned int counter=0;                                          //设置显示SUNPLUS计数器
unsigned int mapcounter1=0;
unsigned int mapcounter2=0;         
const int glunarmonthday[]=                                      //存放2001-2100的阴历月天数表b15-b14表征1-12月的天数特征
{                                                                //为1则当月为30天,为0则为29天。低四位为当年闰月的月份 
	0xd954,0xd4a0,0xda50,0x7552,0x56a0,0xabb7,0x25d0,0x92d0,0xcab5,0xa950,
	0xb4a0,0xbaa4,0xad50,0x55d9,0x4ba0,0xa5b0,0x5176,0x52bf,0xa930,0x7954,
	0x6aa0,0xad50,0x5b52,0x4b60,0xa6e6,0xa4e0,0xd260,0xea65,0xd530,0x5aa0,
	0x76a3,0x96d0,0x4afb,0x4ad0,0xa4d0,0xd0b6,0xd25f,0xd520,0xdd45,0xb5a0,  
	0x56d0,0x55b2,0x49b0,0xa577,0xa4b0,0xaa50,0xb255,0x6d2f,0xada0,0x4b63,
	0x937f,0x49f8,0x4970,0x64b0,0x68a6,0xea5f,0x6b20,0xa6c4,0xaaef,0x92e0,
	0xd2e3,0xc960,0xd557,0xd4a0,0xda50,0x5dd5,0x56a0,0xa6d0,0x55d4,0x52d0,
	0xa9b8,0xa950,0xb4a0,0xb6a6,0xad50,0x55a0,0xaba4,0xa5b0,0x52b0,0xb273,
	0x6930,0x7337,0x6aa0,0xad50,0x4b55,0x4b6f,0xa570,0x54e4,0xd260,0xe968,
	0xd520,0xdaa0,0x6aa6,0x56df,0x4ae0,0xa9d4,0xa4d0,0xd150,0xf252,0xd520
};
const unsigned int* BMP_Cartoon[] =                               //动画帧数据链表(sunplus标志)
{
	(unsigned int*)encoding_00,(unsigned int*)encoding_01,(unsigned int*)encoding_02,
	(unsigned int*)encoding_03,(unsigned int*)encoding_04,(unsigned int*)encoding_05,
	(unsigned int*)encoding_06,(unsigned int*)encoding_07,(unsigned int*)encoding_08,
	(unsigned int*)encoding_sunplus,
	(unsigned int*)encoding_08,(unsigned int*)encoding_07,(unsigned int*)encoding_06,
	(unsigned int*)encoding_05,(unsigned int*)encoding_04,(unsigned int*)encoding_03,
	(unsigned int*)encoding_02,(unsigned int*)encoding_01,(unsigned int*)encoding_00,
	(unsigned int*)encoding_sunplus,
	(unsigned int*)encoding_00,(unsigned int*)encoding_01,(unsigned int*)encoding_02,
	(unsigned int*)encoding_03,(unsigned int*)encoding_04,(unsigned int*)encoding_05,
	(unsigned int*)encoding_06,(unsigned int*)encoding_07,(unsigned int*)encoding_08,
	(unsigned int*)encoding_sunplus,
	(unsigned int*)encoding_08,(unsigned int*)encoding_07,(unsigned int*)encoding_06,
	(unsigned int*)encoding_05,(unsigned int*)encoding_04,(unsigned int*)encoding_03,
	(unsigned int*)encoding_02,(unsigned int*)encoding_01,(unsigned int*)encoding_00,
	(unsigned int*)encoding_sunplus
};
//=================================================================================
//=================================================================================
//	语法格式:	int main(void)
//	实现功能:  键盘控制语音拨报日期时间及功能选择
//	参数:		无
//	返回值:	无
//================================================================================
int main(void)
{   
	keyinitial();                                                   //键盘初始化
	LCD501_Init(0);                                                 //液晶显示初始化
	LCD501_Circle(64,32,15,1);
	LCD501_ClrScreen(0);
	LCD501_FontSet(0);
	*P_INT_Ctrl_New = *P_INT_Ctrl_New | 0x0004;                     //置2HZ中断标志
   	__asm("INT IRQ");                                               //开放2HZ中断
    while(1)
	{  
		int i=0;                                                    //定义一个循环变量,用来对数组寻址.
	   	display();                                                  //用显示日期时间界面
	   	while(hour==nhour && min==nmin && onoff==0)                 //当闹钟开时,判断闹钟时间是否到了 
	   	{   
	   		keyscan();                                              //当闹钟响时如果有任何键按下,则关闭闹钟。
	   		if(keyvalue!=0)
	   			onoff=1;   		
	    	else if(ringflag==0)
	     		PlayRespond(ring1);                                 //播放乐曲1         
	     	else 
	     		PlayRespond(ring2);                                 //播放乐曲2	   	
	    }
	   	if(min==0 && sec==0)                                        //正点报时功能
	   	{
	   		speaktime();
	   	}
 	   	keyscan();                                                  //键盘扫描
 	  	*P_Watchdog_Clear=0x0001;	
 	  	if(keyvalue==0x0001)                                        //如果KEY1键按下
 	 	{
 	 		keyflag1=1;                                             //置位键按下标志
 	 		LCD501_ClrScreen(0);                                    //调用清屏函数;
        	while(keyflag1==1)
 	 		{
 	    		nextdisplay();                                      //显示调整界面
 	    		LCD501_Bitmap(15,mouse[i],(unsigned int*)encoding_mouse);
 	    		         											//显示鼠标位置		
        		keyscan();       
      			*P_Watchdog_Clear=0x0001;	
      			switch(keyvalue)
      			{    
      				case 0x0001:                                    //如果是KEY1按下则进入相应的调整
      		        { 
      			       	switch(i)                                   //判断此时的鼠标指向
      			       	{
      			       		case 0:  
      			       	 	{
      			       	 		setday();
      			           	}
      			           	break;                                  //指向的时间日期调整
      			       		case 1: 
      			       	 	{
      			       			set_ring();                         //设置闹钟的铃声和时间
      			       	 	}
      			       	 	break;
      			       		case 2:  
      			            {
      			     	      	setsecond();                        //设置秒表
      			            }
      			            break;         
      			        	case 3:                                 //指向的返回,则执行返回程序 
      			         	{
      			            	LCD501_ClrScreen(0);keyflag1=0;
      			         	}
      			         	break;
      			        }
					}  
      		        break;
      	    		case 0x0002:                                    //  如果是KEY2则箭头下翻//
      	            {
      	            	LCD501_Bitmap(15,mouse[i],(unsigned int*)encoding_empty);
      	                if(i==3)
      	                	i=0;
      	                else
      	                	i=++i;                                  //修改箭头的坐标
      	                    LCD501_Bitmap(15,mouse[i],(unsigned int*)encoding_mouse);
					}
      	            break;                                        
      	    		case 0x0004:                                    //如果是KEY3则箭头上翻
      	            {
      	            	LCD501_Bitmap(15,mouse[i],(unsigned int*)encoding_empty);
      	                if(i==0)
      	                	i=3;
      	                else
      	                	i=--i;                                  //修改箭头的坐标
      	                	LCD501_Bitmap(15,mouse[i],(unsigned int*)encoding_mouse);
					}
      	            break;                                                 	  
				}
			}
		}		
 	 	else if(keyvalue==0x0002)                                   //如果KEY2按下报时间
 	 	{
 	    	speaktime();                                            //调用时间拨报函数
 	 	}
 	 	else if(keyvalue==0x0004)                                   // 如果KEY3按下报日期
 	 	{
 	        speakday() ;                                            //调用日期拨报函数
 	 	}
 	 	else if(keyvalue==0x0006)                                   //如果KEKY2\KEY3同时按下则切换闹钟
 	 	{
 	 		switch(onoff)                                           //的开关
 	 	    {
 	 	    	case 0:
 	 	    		onoff=1;
 	 	    		break;                                          //切换闹钟的开关
 	 			case 1:
 	 				onoff=0;
 	 				break;
			}
		}
	  	else
 	 		*P_Watchdog_Clear=0x0001;		 	                    //清看门狗
	}
}
//====================================================================================
//main.c end
//====================================================================================

⌨️ 快捷键说明

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