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

📄 menu.c

📁 dspic开发控制程序,有助开发pic单片机程序
💻 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 + -