?? 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"
#include "Bit.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 nextdisplay2();
extern void setday();
extern void set_ring();
extern void setsecond();
extern void uart_operate(unsigned int uart_data );
extern void ClearDisplay();
extern void DS1820();
//extern void set_ring();
//extern void setsecond();
extern void speaktime();
extern void speakday();
extern void keyinitial();
extern void F_Disp_Drv();
extern void F_DispIO_Initial();
//=======================================================================
//=======================================================================
//定義文件中用到的變量以及常數數組
//=======================================================================
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 keytime=0; //存放按下的時間
unsigned int keytimeEnb=0; //允許按鍵計時標志
unsigned int keyTtemp=0;
unsigned int runflag=0; //當年閏月標志位
unsigned int num=0; //2HZ計數單元
unsigned int hour=6; //存放當前的小時
unsigned int min=30; //存放當前的分鐘
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 DispEnb=0;
unsigned int Flash;
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;
extern unsigned int LED[10];//數碼管的段選碼
unsigned int Time[6],mTime[6],Date[6],nDate[6];
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
};
//=================================================================================
// 語法格式: int main(void)
// 實現功能: 鍵盤控制語音撥報日期時間及功能選擇
// 參數: 無
// 返回值: 無
//================================================================================
int main(void)
{
unsigned int j=0;
keyinitial(); //鍵盤初始化
//---------------------------------------------------
*P_IOB_Dir=0xffff;
*P_IOB_Attrib=0xffff;
*P_IOB_Data=0x0000;
*P_SystemClock=0x0080;
//------------------------------------------------------
*P_INT_Ctrl_New = *P_INT_Ctrl_New | 0x0004; //置2HZ中斷標志
__asm("INT IRQ"); //開放2HZ中斷
while(1)
{
unsigned int i=0; //定義一個循環變量,用來對數組尋址.
if(DispEnb)
{
if(j==0) display(); //j=0顯示年、月、日
else if(j==1) nextdisplay(); //j=1顯示十、分、秒
else if(j==2) nextdisplay2();
else DS1820();
DispEnb=0; //顯示過后,將顯示允許位清零
}
*P_Watchdog_Clear=0x0001;
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&&keytime>=4) //如果KEY1鍵按下(長按)
{
keyflag1=1; //置位鍵按下標志
//-----------------------------------------------
ClearDisplay();
//-----------------------------------------------
while(keyflag1==1)
{
if(DispEnb)
{
uart_operate(0x00); //顯示當前功能
uart_operate(0x00);
uart_operate(0x00);
uart_operate(0x00);
uart_operate(0x00);
uart_operate(0x00);
uart_operate(0x00);
uart_operate(LED[i+1]);
DispEnb=0;
}
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: //指向的返回,則執行返回程序
{
keyflag1=0;
}
break;
}
}
break;
case 0x0002: // 如果是KEY2則箭頭下翻//
{
if(i==3)
i=0;
else
i=++i;
}
break;
case 0x0004: //如果是KEY3則箭頭上翻
{
if(i==0)
i=3;
else
i=--i; //修改箭頭的坐標
}
break;
}
}
}
else if (keyvalue==0x0001&&keytime<4) //key1短按
{
j++;
if(j==4) j=0; //循環顯示
else if(j==0) display(); //j=0顯示年、月、日
else if(j==1) nextdisplay(); //j=1顯示十、分、秒
else if(j==2) nextdisplay2(); //j=2顯示農歷月、日、星期
else DS1820();
}
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 + -