📄 menu.c
字号:
#include <p30f6014.h>
#include <spi.h>
#include <dsp.h>
#include "common.h"
#include "timers.h"
#include "procsignal.h"
#include "lcd.h"
#include "atod.h"
#include "codec.h"
#include "gettime.h"
#include "soundgen.h"
#include "menu.h"
#define M1ITEM1 0
#define M1ITEM2 1
#define M1ITEM3 2
#define M1ITEM4 3
unsigned char CurrentMenu;
static const char SPLASH1_STR[] = "Cuckoo Clock Program";
static const char SPLASH2_STR[] = " For Test ";
static const char SPLASH3_STR[] = " Version and Date ";
static const char SPLASH4_STR[] = "V1.0 Aug 29, 2004";
static const char AM_STR[] = " AM";
static const char PM_STR[] = " PM";
static const char OFFSET_STR[] = "Local Hr Offset=";
static const char STATION_STR[] = "Station =";
static const char WWV_STR[] = "WWV ";
static const char WWVB_STR[] = "WWVB";
static const char CHIME_STR[] = "Hour Chime =";
static const char GONG_STR[] = "GONG ";
static const char CUCKOO_STR[] = "CUCKOO";
static const char TICKTOCK_STR[] = "Tic-Tock =";
static const char ON_STR[] = "ON ";
static const char OFF_STR[] = "OFF";
static const char SYNC_STR[] = "Sync Min Qual";
static const char MINENRGY_STR[] = "Min Energy";
static const char HRENRGY_STR[] = "Hr Energy";
static const char YRENRGY_STR[] = "Yr Energy";
static const char MANSET_STR[] = " Manual Time Set ";
static const char YEARSET_STR[] = "Year = ";
static const char HOURSET_STR[] = "UTC Hour = ";
static const char MINSET_STR[] = "Minute = ";
static unsigned int CurrentPot1;
static unsigned int CurrentPot2;
static unsigned int CurrentPot3;
static char ItemSelect;
void InitMenu(void);
void ServiceMenu(void);
void DisplayTime( void);
static void MenuScroll(void);
static void ItemScroll(void);
static void ItemChange(char val);
//初始化菜单系统子程序
void InitMenu(void)
{
unsigned int tmp;
SetLcdPos(0,0);
WriteCStr(SPLASH1_STR);
SetLcdPos(0,1);
WriteCStr(SPLASH2_STR);
SetLcdPos(0,2);
WriteCStr(SPLASH3_STR);
SetLcdPos(0,3);
WriteCStr(SPLASH4_STR);
TimeDelay(50);
ClearLcd();
//读EEPROM中的数值
CurrentMenu = (unsigned char)ReadEEData( EE_MENU);
CurrentMenu--;
if(CurrentMenu > MENU_DATA)
CurrentMenu = MENU_DATA;
YearCount = (unsigned char)ReadEEData( EE_MANUALYEAR );
if(YearCount>20)
YearCount = 4;
if(YearCount<4)
YearCount = 20;
HoursCount = (unsigned char)ReadEEData( EE_MANUALHOUR );
if((char)HoursCount>23)
HoursCount = 0;
if( (char)HoursCount<0)
HoursCount = 23;
MinutesCount = (unsigned char)ReadEEData( EE_MANUALMIN );
if((char)MinutesCount>59)
MinutesCount = 0;
if((char)MinutesCount<0)
MinutesCount = 59;
LocalHoursOffset = (char)ReadEEData( EE_LOCALOFFSET);
tmp = ReadEEData( EE_WWVSEL);
if(tmp)
SemB.WWV = 1;
else
SemB.WWV = 0;
tmp = ReadEEData( EE_TICKTOCKSEL);
if(tmp)
SemB.TicTock = 1;
else
SemB.TicTock = 0;
tmp = ReadEEData( EE_CUCKOOSEL);
if(tmp)
SemB.Cuckoo = 1;
else
SemB.Cuckoo = 0;
KeyNum = KEY1;
SemA.KeySwitch = TRUE; //假定有键按下使菜单初始到 menu1
CurrentPot1 = 0;
CurrentPot2 = 0;
CurrentPot3 = 0;
SemA.PlotActive = FALSE;
}
//菜单操作子程序
void ServiceMenu( )
{
int tmp;
if(SemA.KeySwitch && !SemA.PlotActive) //如果有键按下且没有画图
{
SemA.KeySwitch = FALSE;
switch(KeyNum)
{
case KEY1: //主菜单翻转按键
MenuScroll();
break;
case KEY2: //子菜单翻转按键
ItemScroll();
break;
case KEY3: //数值减按键
ItemChange(-1);
break;
case KEY4: //数值加按键
ItemChange(1);
break;
}
}
if(SemA.Timer1) //每100mSec刷新一次值
{
SemA.Timer1 = 0;
tmp = (GetADValue(POT1)>>5) & 0x00FC;
if( CurrentPot1 != tmp )
{
CurrentPot1 = tmp;
//给编码解码器发送新值
WriteCodecCtrl( CODEC_ADCVOL, tmp|CODEC_PARM_LOM );
}
tmp = (GetADValue(POT3)>>5) & 0x00FC;
if( CurrentPot3 != tmp )
{
CurrentPot3 = tmp;
if(tmp > 0x5C)
tmp = 0x5C;
//给编码解码器发送新值
WriteCodecCtrl( CODEC_DACVOL, tmp|CODEC_PARM_SLM|CODEC_PARM_SRM );
}
tmp = GetADValue(POT2);
}
}
//菜单翻转子程序
static void MenuScroll(void)
{
CurrentMenu++;
if(CurrentMenu > MENU_DATA)
CurrentMenu = MENU_MAIN;
ClearLcd();
switch(CurrentMenu)
{
case MENU_MAIN: //时钟菜单
CursState(0);
SetLcdPos(8,0);
WriteChar(':');
SetLcdPos(11,0);
WriteChar(':');
SetLcdPos(15,0);
WriteChar('U'); WriteChar('T'); WriteChar('C');
SetLcdPos(8,1);
WriteChar(':');
SetLcdPos(11,1);
WriteChar(':');
SetLcdPos(8,2);
WriteChar('2'); WriteChar('0');
SemB.SoundInhibit = FALSE;
break;
case MENU_SETUP: //设置菜单
SetLcdPos(0,3);
WriteCStr(TICKTOCK_STR);
ItemSelect = M1ITEM4;
ItemChange(0);
SetLcdPos(0,2);
WriteCStr(CHIME_STR);
ItemSelect = M1ITEM3;
ItemChange(0);
SetLcdPos(0,1);
WriteCStr(STATION_STR);
ItemSelect = M1ITEM2;
ItemChange(0);
SetLcdPos(0,0);
WriteCStr(OFFSET_STR);
ItemSelect = M1ITEM1;
ItemChange(0);
CursState(1);
SemB.SoundInhibit = FALSE;
break;
case MENU_STATUS: //状态菜单
CursState(0);
SetLcdPos(0,0);
WriteCStr(SYNC_STR);
SetLcdPos(0,1);
WriteCStr(MINENRGY_STR);
SetLcdPos(0,2);
WriteCStr(HRENRGY_STR);
SetLcdPos(0,3);
WriteCStr(YRENRGY_STR);
SemB.SoundInhibit = FALSE;
break;
case MENU_SETTIME:
SemB.SoundInhibit = TRUE;
SetLcdPos(0,0);
WriteCStr(MANSET_STR);
SetLcdPos(0,3);
WriteCStr(MINSET_STR);
ItemSelect = M1ITEM3;
ItemChange(0);
SetLcdPos(0,2);
WriteCStr(HOURSET_STR);
ItemSelect = M1ITEM2;
ItemChange(0);
SetLcdPos(0,1);
WriteCStr(YEARSET_STR);
ItemSelect = M1ITEM1;
ItemChange(0);
CursState(1);
break;
case MENU_SIGNAL: //信号输入画图
SemB.SoundInhibit = FALSE;
CursState(0);
WriteEEData( EE_MANUALMIN , (int)MinutesCount);
WriteEEData( EE_MANUALHOUR , (int)HoursCount);
WriteEEData( EE_MANUALYEAR , (int)YearCount);
break;
case MENU_SYNC: //秒同步信号画图
case MENU_DATA:
SemB.SoundInhibit = FALSE;
CursState(0);
break;
}
WriteEEData( EE_MENU , (int)CurrentMenu);
}
//子菜单翻转子程序
static void ItemScroll(void)
{
switch(CurrentMenu)
{
case MENU_SETUP: //设置菜单
ItemSelect++;
if( ItemSelect > M1ITEM4)
ItemSelect = M1ITEM1;
ItemChange(0);
break;
case MENU_SETTIME: //设置时间菜单
ItemSelect++;
if( ItemSelect > M1ITEM3)
ItemSelect = M1ITEM1;
ItemChange(0);
break;
case MENU_MAIN:
case MENU_STATUS:
case MENU_SIGNAL:
case MENU_SYNC:
case MENU_DATA:
break;
}
}
//当增减键按下时,改变数值
static void ItemChange(char val)
{
if( CurrentMenu == MENU_SETUP)
{
switch(ItemSelect)
{
case M1ITEM1: //局部时间编移
LocalHoursOffset = (char)LocalHoursOffset + val;
if(LocalHoursOffset>12)
LocalHoursOffset = 12;
if(LocalHoursOffset<-12)
LocalHoursOffset = -12;
SetLcdPos(17,0);
if(LocalHoursOffset>=0)
{
WriteChar('+');
Write2Dec(LocalHoursOffset);
}
else
{
WriteChar('-');
Write2Dec(-LocalHoursOffset);
}
if( val!=0 )
WriteEEData( EE_LOCALOFFSET , (int)LocalHoursOffset);
SetLcdPos(19,0);
break;
case M1ITEM2: //选择WWV和WWVH站
SetLcdPos(10,1);
if(0 != val)
{
SemB.WWV = !SemB.WWV;
if(SemB.WWV)
WriteEEData( EE_WWVSEL , 1);
else
WriteEEData( EE_WWVSEL , 0);
InitProcSignal(); //复位DSP滤波
}
if(SemB.WWV)
WriteCStr(WWV_STR);
else
WriteCStr(WWVB_STR);
break;
case M1ITEM3: //选择报时声音
SetLcdPos(13,2);
if(0 != val)
{
SemB.Cuckoo = !SemB.Cuckoo;
if(SemB.Cuckoo)
WriteEEData( EE_CUCKOOSEL , 1);
else
WriteEEData( EE_CUCKOOSEL , 0);
}
if(SemB.Cuckoo)
WriteCStr(CUCKOO_STR);
else
WriteCStr(GONG_STR);
break;
case M1ITEM4: //选择滴答声开/关
SetLcdPos(11,3);
if(0 != val)
{
SemB.TicTock = !SemB.TicTock;
if(SemB.TicTock)
WriteEEData( EE_TICKTOCKSEL , 1);
else
WriteEEData( EE_TICKTOCKSEL , 0);
}
if(SemB.TicTock)
WriteCStr(ON_STR);
else
WriteCStr(OFF_STR);
break;
}
}
else if( CurrentMenu == MENU_SETTIME)
{
switch(ItemSelect)
{
case M1ITEM1: //年的最后两个数字
YearCount = (char)YearCount + val;
if(YearCount>20)
YearCount = 4;
if(YearCount<4)
YearCount = 20;
SetLcdPos(7,1);
Write2Dec(YearCount);
SetLcdPos(8,1);
if( 0 != val )
WriteEEData( EE_MANUALYEAR , (int)YearCount);
break;
case M1ITEM2: // 世界协调时
HoursCount = (char)HoursCount + val;
if((char)HoursCount>23)
HoursCount = 0;
if( (char)HoursCount<0)
HoursCount = 23;
SetLcdPos(11,2);
Write2Dec(HoursCount);
SetLcdPos(12,2);
if( 0 != val )
WriteEEData( EE_MANUALHOUR , (int)HoursCount);
break;
case M1ITEM3: //分
MinutesCount = (char)MinutesCount + val;
if((char)MinutesCount>59)
MinutesCount = 0;
if((char)MinutesCount<0)
MinutesCount = 59;
SetLcdPos(11,3);
Write2Dec(MinutesCount);
SetLcdPos(12,3);
if( val!=0 )
{
WriteEEData( EE_MANUALMIN , (int)MinutesCount);
SecondsCount = 0;
}
break;
}
}
}
//把当前的时间显示在LCD上
void DisplayTime(void)
{
switch(CurrentMenu)
{
case MENU_MAIN: //时钟菜单
SetLcdPos(6,0);
Write2Dec(HoursCount);
SetLcdPos(9,0);
Write2Dec(MinutesCount);
SetLcdPos(12,0);
Write2Dec(SecondsCount);
SetLcdPos(6,1);
Write2Dec(LocalHoursCount);
SetLcdPos(9,1);
Write2Dec(MinutesCount);
SetLcdPos(12,1);
Write2Dec(SecondsCount);
if(SemA.PMAM)
WriteCStr(PM_STR);
else
WriteCStr(AM_STR);
SetLcdPos(10,2);
Write2Dec(YearCount);
break;
case MENU_SETUP: //设置菜单
break;
case MENU_STATUS: //状态菜单
SetLcdPos(5,0);
if(SemA.SecLocked)
WriteChar('Y');
else
WriteChar('N');
SetLcdPos(18,0);
Write2Dec(MinSyncQuality);
SetLcdPos(11,1);
Write2Dec(MinEnergy);
SetLcdPos(11,2);
Write2Dec(HrEnergy);
SetLcdPos(11,3);
Write2Dec(YrEnergy);
break;
case MENU_SIGNAL:
break;
case MENU_SYNC:
break;
case MENU_DATA:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -