📄 main.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 + -