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

📄 dispht1621.c

📁 威望公司MP3 + USB MCU 的参考软件
💻 C
字号:
/****************************************************************
*                      Viaon Technology (Suzhou) Co.,Ltd
*
*    Copyright 2007, Viaon Technology (Suzhou) Co.,Ltd,Suzhou,China
*                    All rights reserved.
*
*
* Filename:      	dispht1621.c
*
* Programmer:    	Greg 
*
* Created: 	 	1/2/2008
*
* Description: 		public functions 
*              
*        
* Change History (most recent first):	2008.1.2
****************************************************************/

#include "dispht1621.h"
#include "display.h"
#include "timer.h"
#include "halfm.h"
#include "halvol.h"
#include "halmp3dec.h"

#if ((DIGITAL_SHOW == DIGITAL_SHOW_LCMPX) )
#define DISPHT1621_DEBUG_ENABLE
#ifdef DISPHT1621_DEBUG_ENABLE
#define DebugText(str)	UartOutText(str);
#define DebugValue(val, len)	UartOutValue(val, len);
#else
#define DebugText(str)
#define DebugValue(val, len)
#endif

extern BYTE data bgMP3TS;
extern BYTE data bgMP3TM;
extern BYTE data bgDispGap;	// This counter will be ticked in timer, and is for the time control of status change

//extern BYTE data g_byEqValue;//EQ Index

/////////////////////////////////////////////
static BYTE volatile data bgDispStatus;
static BYTE data bgDispStatusChg;

#define DISP_DIGITAL_NUM	8
static WORD wScrMap[DISP_DIGITAL_NUM];
static BYTE bDigital[5];
static BYTE data bDigIdx;
static BYTE bPFlag = FALSE; //Pause flag

#define DISP_SETFLAG_OR		0X01
#define DISP_SETFLAG_SET		0X02
#define DISP_SETFLAG_CLR		0X03

static void _DispSetBuf(BYTE bIdx, WORD wVal, BYTE bFlag)
{
	if(bFlag == DISP_SETFLAG_OR){
		wScrMap[bIdx] |= wVal;
	}else if(bFlag == DISP_SETFLAG_CLR){
		wScrMap[bIdx] &= (~wVal);
	}else{//DISP_SETFLAG_SET
		wScrMap[bIdx] &= (~0xfff5);
		wScrMap[bIdx] |= wVal;
	}	
	
	return;
}

//This function will clear all digital, not include icons.
#define DISP_CLEAR_DIGITAL		0X01
#define DISP_CLEAR_ALL			0X02
static void _DispClear(BYTE bFlag)
{
	BYTE i;
	WORD wTmp;

	if(bFlag == DISP_CLEAR_ALL)
		wTmp = 0X00;
	else
		wTmp = (~0xfff5);
	
	for(i=0; i<DISP_DIGITAL_NUM; i++){
		wScrMap[i] &= wTmp;
	}

	return;
}

static void _DispHex2Dec(WORD wVal)
{

	BYTE data bRed;//, byStartX, byStartY;
	WORD data wDiv;
	WORD data  wVa;
	
	wDiv = wVal; //~DIGITAL_SHOW_MASK
	bDigIdx = 0;
	memclr(bDigital, sizeof(bDigital));

	wVa = 1000;
	do{
		bRed = wDiv/wVa;
		wDiv = wDiv%wVa;
		wVa /= 10;
		if((bDigIdx == 0) && (bRed == 0) && (wVa > 0)){
			continue;
		}
		
		bDigital[bDigIdx] = bRed;
		bDigIdx++;
	}while(wVa > 0);

	return;
}

void halDispST()
{
	if(halKeyStMon() == KEY_ST_FLAG){
		_DispSetBuf(NULL_ST_POS, ICON2_SEG, DISP_SETFLAG_OR);//Display ST	
	}else{
		_DispSetBuf(NULL_ST_POS, ICON2_SEG, DISP_SETFLAG_CLR);//Clear ST	
	}

	return;
}

void halDispMute()
{
	if(halKeyMute() == KEY_MUTE_ENABLE){
		_DispSetBuf(NULL_MUTE_POS, ICON2_SEG, DISP_SETFLAG_OR);//Display ST	
	}else{
		_DispSetBuf(NULL_MUTE_POS, ICON2_SEG, DISP_SETFLAG_CLR);//Clear ST	
	}

	return;
}

void halDispAux()
{

	DebugText("-I-: halDispAux() \r\n");
	_DispClear(DISP_CLEAR_ALL);

	_DispSetBuf(3, CHAR_A, DISP_SETFLAG_SET);
	_DispSetBuf(4, CHAR_U, DISP_SETFLAG_SET);
	_DispSetBuf(5, CHAR_X, DISP_SETFLAG_SET);
	
	//Show Stereo/Mono, MUTE
	halDispST();
	halDispMute();
	
	return;
}

void halDispFM(void)
{
	BYTE i;
	WORD wTmp;

	DebugText("-I-: halDispFM() \r\n");

	_DispClear(DISP_CLEAR_ALL);

	//Show "FM 104.80 MHz"
	_DispSetBuf(0, CHAR_F, DISP_SETFLAG_SET);
	_DispSetBuf(1, CHAR_M, DISP_SETFLAG_SET);

	//Where to get the FM frequency.
	wTmp = halFMGetFreq();
	_DispHex2Dec(wTmp);
	
	for(i=0; i<bDigIdx; i++){
		_DispSetBuf(3+4-bDigIdx+i, wDigMap[bDigital[i]], DISP_SETFLAG_SET);
	}

	_DispSetBuf(P2_P1_POS, ICON2_SEG, DISP_SETFLAG_OR); //Point for FM
	_DispSetBuf(MHZ_KHZ_POS, ICON1_SEG, DISP_SETFLAG_OR); //MHz for FM
	_DispSetBuf(FM_CARD_POS, ICON1_SEG, DISP_SETFLAG_OR); //FM

	//Show Stereo/Mono, MUTE
	halDispST();
	halDispMute();
	
	return;
}

static void _halDispVol(void)
{
	BYTE i;
	BYTE bVol =  halVolGet();

	DebugText("-I-: _halDispVol() \r\n");
	_DispHex2Dec(bVol);
	for(i=0; i<bDigIdx; i++){
		_DispSetBuf(3+4-bDigIdx+i, wDigMap[bDigital[i]], DISP_SETFLAG_SET);
	}

	if(bVol == 0){ //MUTE
		_DispSetBuf(NULL_MUTE_POS, ICON2_SEG, DISP_SETFLAG_OR); //MUTE of volume 0
	}else{
		_DispSetBuf(NULL_MUTE_POS, ICON2_SEG, DISP_SETFLAG_CLR); //MUTE of volume 0
	}

	_DispSetBuf(P2_P1_POS, ICON1_SEG|ICON2_SEG, DISP_SETFLAG_CLR); //Point for FM
	_DispSetBuf(MHZ_KHZ_POS, ICON1_SEG|ICON2_SEG, DISP_SETFLAG_CLR); //MHz for FM

	return;
}

static void _halDispEQ(void)
{	
	DebugText("-I-: _halDispEQ() \r\n");
	_DispSetBuf(4, CHAR_E, DISP_SETFLAG_SET);	
	_DispSetBuf(5, wDigMap[halEQGet()], DISP_SETFLAG_SET);

	_DispSetBuf(P2_P1_POS, ICON1_SEG|ICON2_SEG, DISP_SETFLAG_CLR); //Point for FM
	_DispSetBuf(MHZ_KHZ_POS, ICON1_SEG|ICON2_SEG, DISP_SETFLAG_CLR); //MHz for FM
	
	return;
}

static void _halDispIdx(void)
{
	BYTE i;

	DebugText("-I-: _halDispIdx() \r\n");
	//Current Song Index
	_DispHex2Dec(Mp3SReq.swIdx);
	for(i=0; i<bDigIdx; i++){
		_DispSetBuf(4-bDigIdx, wDigMap[bDigital[i]], DISP_SETFLAG_SET);
	}
	_DispSetBuf(4, CHAR_SLASH, DISP_SETFLAG_SET);
	//Total song number
	_DispHex2Dec(Mp3SReq.swTotalCnt);
	for(i=0; i<bDigIdx; i++){
		_DispSetBuf(5+i, wDigMap[bDigital[i]], DISP_SETFLAG_SET);
	}
	_DispSetBuf(P2_P1_POS, ICON1_SEG|ICON2_SEG, DISP_SETFLAG_CLR); //Point for FM
	_DispSetBuf(MHZ_KHZ_POS, ICON1_SEG|ICON2_SEG, DISP_SETFLAG_CLR); //MHz for FM
	
	
	return;
}

static void _halDispJump()
{
	BYTE i;

	DebugText("-I-: _halDispJump() \r\n");
	_DispHex2Dec(halIRGetJump());
	for(i=0; i<bDigIdx; i++){
		_DispSetBuf(3+4-bDigIdx+i, wDigMap[bDigital[i]], DISP_SETFLAG_SET);
	}
	_DispSetBuf(P2_P1_POS, ICON1_SEG|ICON2_SEG, DISP_SETFLAG_CLR); //Point for FM
	_DispSetBuf(MHZ_KHZ_POS, ICON1_SEG|ICON2_SEG, DISP_SETFLAG_CLR); //MHz for FM
	
	return;
}

#if 0
static void _halDispPause()
{
	DebugText("-I-: _halDispPause() \r\n");
	_DispSetBuf(3, ICON_PAUSE, DISP_SETFLAG_SET); 
	_DispSetBuf(4, ICON_PAUSE, DISP_SETFLAG_SET);
	_DispSetBuf(5, ICON_PAUSE, DISP_SETFLAG_SET);
	
	_DispSetBuf(P2_P1_POS, ICON1_SEG|ICON2_SEG, DISP_SETFLAG_CLR); //Point for FM
	_DispSetBuf(MHZ_KHZ_POS, ICON1_SEG|ICON2_SEG, DISP_SETFLAG_CLR); //MHz for FM

	return;
}
#endif

static void _halDispError()
{
	DebugText("-I-: _halDispError() \r\n");
	//_DispSetBuf(3, CHAR_X, DISP_SETFLAG_SET); 
	//_DispSetBuf(4, CHAR_X, DISP_SETFLAG_SET);
	_DispSetBuf(2, CHAR_E, DISP_SETFLAG_SET); 
	_DispSetBuf(3, CHAR_R, DISP_SETFLAG_SET); 
	_DispSetBuf(4, CHAR_R, DISP_SETFLAG_SET); 
	_DispSetBuf(5, CHAR_O, DISP_SETFLAG_SET); 
	_DispSetBuf(6, CHAR_R, DISP_SETFLAG_SET); 
	
	_DispSetBuf(P2_P1_POS, ICON1_SEG|ICON2_SEG, DISP_SETFLAG_CLR); //Point for FM
	_DispSetBuf(MHZ_KHZ_POS, ICON1_SEG|ICON2_SEG, DISP_SETFLAG_CLR); //MHz for FM

	return;
}
void DispInit()
{
	//Init global variable
	bgDispStatus = DISP_IDLE_STATUS;
	bgDispGap = 0;
	bgDispStatusChg = FALSE;

	//memclr(wScrMap, sizeof(wScrMap));
	_DispClear(DISP_CLEAR_ALL);

	halHTInit();

	DebugText("-I-: DispInit() \r\n");
	return;
}

void DispSetStatus(BYTE bStatus)
{
	bgDispStatus = bStatus;
	bgDispStatusChg = TRUE; 

	if(bgDispStatus != DISP_NORMAL_STATUS){
		bgDispGap = 0;
	}

	return;
}

static void _halDispGapChk(BYTE bGapMax)
{
	if(bgDispGap > bGapMax){
	#if 0	
		if((mp3status!=MP3STATUS_PLAY) && (mp3status!=MP3STATUS_IDLE)){//When no device, the mp3status should be MP3STATUS_IDLE
			DispSetStatus(DISP_PAUSE_STATUS);
		}else{
			DispSetStatus(DISP_NORMAL_STATUS); //Go back to the normal status after some time
		}
	#else
		DispSetStatus(DISP_NORMAL_STATUS); //Go back to the normal status after some time
	#endif
	}

	return;
}

static void _halDispTime(BYTE bFlag)
{
	BYTE i;

	if(bFlag == FALSE)
		return;
	
	_DispHex2Dec(bgMP3TM);
	for(i=0; i<bDigIdx; i++){
		_DispSetBuf(6-bDigIdx+i, wDigMap[bDigital[i]], DISP_SETFLAG_SET);
	}
	_DispSetBuf(P2_P1_POS, ICON1_SEG, DISP_SETFLAG_OR);//:
	_DispHex2Dec(bgMP3TS);
	for(i=0; i<bDigIdx; i++){
		_DispSetBuf(6+i, wDigMap[bDigital[i]], DISP_SETFLAG_SET);
	}

	return;
}

static void _halDispNormal()
{
	BYTE i;
	static BYTE sbInv = FALSE;
	DRIVE *drv = DriveGet();

	if(FSMState != FSMSTATE_INIT){ //No device attached
		_DispClear(DISP_CLEAR_ALL);		
		//Should Display No Device here.
		//_halDispFM();					
	}else{
		//Set FM 				
		//Show play time
		if(mp3status==MP3STATUS_PAUSE){//Pause
			if(sbInv == FALSE){
				sbInv = TRUE;
				UartOutText("-I-: sbInv = TRUE \r\n");
			}else{
				sbInv = FALSE;	
				UartOutText("-I-: sbInv = FALSE \r\n");
			}	
		}else
			sbInv = TRUE;
		
		_halDispTime(sbInv);
		
		//Current Song Index
		_DispHex2Dec(Mp3SReq.swIdx);
		for(i=0; i<bDigIdx; i++){
			_DispSetBuf(i, wDigMap[bDigital[i]], DISP_SETFLAG_SET);
		}

		_DispSetBuf(MP3_USB_POS, ICON1_SEG, DISP_SETFLAG_OR);//Display MP3
		//Display device
		if(drv->DevID == USB_DISK){ //#define MP3_USB_POS		0X01
			_DispSetBuf(MP3_USB_POS, ICON2_SEG, DISP_SETFLAG_OR);	
			_DispSetBuf(NULL_SD_POS, ICON2_SEG, DISP_SETFLAG_CLR);
		}else{ //SD_DISK
			_DispSetBuf(FM_CARD_POS, ICON2_SEG, DISP_SETFLAG_OR);
			_DispSetBuf(NULL_SD_POS, ICON2_SEG, DISP_SETFLAG_OR);
			_DispSetBuf(MP3_USB_POS, ICON2_SEG, DISP_SETFLAG_CLR);
		}	
	}
	
	//bgDispGap = 0;

	return;
}

void DispReset(void)
{
//	sbPos = 10;

	bgMP3TMS = 0;
	bgMP3TS = 0;
	//bgMP3T10S = 0;
	bgMP3TM = 0;	

	return;
}
BYTE DispFMSCase(BYTE bStatus)
{
	BYTE data bRet=FALSE;

	// 1. Clear LCM, and display the STATUS, Large Font
	if(bgDispStatusChg == TRUE){
		//DispText(20, 0, DispStatus[bStatus], DISP_STATUS_MAXLEN);
		//halHTClr();//halLCMClear(0, 3);	
		
		bgDispStatusChg = FALSE;
		bRet=TRUE;
	}
	
	// 2. Status Management
#if 1
	if((bgDispStatus==DISP_NORMAL_STATUS) && (bgDispGap>8)){
		//Clear irjump
#if (IRCTRL_MODE == IRCTRL_MODE_CTRLDIG)				
		if(irjumptype == IRJUMP_TYPE_PICKSONG){
			halIRPickSong();
		}else if(irjumptype == IRJUMP_TYPE_CHSET){
			halIRChSet();
		}

		irjumptype = IRJUMP_TYPE_IDLE;
#else	
		halIRClrJump();
#endif
		DispSetStatus(DISP_NORMAL_STATUS);

		bgDispGap = 0;
	}
#endif

//	if((bStatus!=DISP_NODEV_STATUS)&&(bStatus!=DISP_NORMAL_STATUS))
	//if((bStatus!=DISP_NORMAL_STATUS)&&(bStatus!=DISP_PAUSE_STATUS))
	if(bStatus!=DISP_NORMAL_STATUS)
		_halDispGapChk(DISP_VOLUMN_GAP);

	return bRet; //TRUE: Display, FALSE: No Display
}

void DispFSM()
{
	BYTE data bRet;	

//	WDT = 0X1F;
	bRet = DispFMSCase(bgDispStatus);
	if(!bRet) 	//No display needed.
		return;

	_DispClear(DISP_CLEAR_DIGITAL);

	halDispST();
	halDispMute();
	switch(bgDispStatus){
		case DISP_NORMAL_STATUS:		
			_halDispNormal();			
			break;

		case DISP_SONGIDX_STATUS:
			_halDispIdx();
			break;

		case DISP_VOLUMN_STATUS:			
			_halDispVol();
			break;
#if 0
		case DISP_FMCH_STATUS:
			_halDispFM();	
			break;
#endif

#ifdef ENABLE_EQ_KEY
		case DISP_EQ_STATUS:
			_halDispEQ();
			break;
#endif

#if (IRCTRL_MODE == IRCTRL_MODE_DIGCTRL)			
		case DISP_DIGITAL_STATUS:
			_halDispJump();
			break;
#endif

#if 0
		case DISP_PAUSE_STATUS:
			//_halDispPause();
			bPFlag = TRUE;
			break;	
#endif

#ifdef ENABLE_PLAYMODE_KEY			
		case DISP_REPEAT_STATUS:
			break;
#endif			

		case DISP_ERROR_STATUS:
			_halDispError();
			break;	
			
#if (IRCTRL_MODE == IRCTRL_MODE_CTRLDIG)			
		case DISP_CTRLDIG_STATUS:			
			if(irjumptype == IRJUMP_TYPE_PICKSONG){
				//halLCMWriteBig(0, "IDX", 3);	
			}else{
				//halLCMWriteBig(0, "FM", 2);	
			}
			//if(halIRGetJump() != 0)
				//DispValue(56, 0, halIRGetJump(), DISP_VALUE_NORBIG);
			break;
#endif			
		default:
			break;
	}

	halHTRefresh(wScrMap);

	return;
}



#endif

⌨️ 快捷键说明

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