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

📄 display.c

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

/*
1. Display content:
Song Index/Total counter, Long File Name,
Volumn, FM Channel, EQ Setting, PlayMode, U-Disk/SD, Play/Pause

2 Display Status(FSM)
Normal_Status:
Switch_Song_Status
Set_Volumn_Status
Set_FMCH_Status
Set_EQ_Status
Switch_USBSD_Status
Set_PlayPause_Status

Pick Songs/FMCH

开机画面
*/
#include "utiltypedef.h"
#include "reg51.h"
#include "va4010reg.h"
#include "config.h"
#include "common.h"
#include "4010UI.h"
#include "halfm.h"
#include "hallcm.h"
#include "display.h"
#include "hali2c.h"
#include "halmp3dec.h"
#include "timer.h"
#include "halvol.h"
#include "halinfo.h"
#include "libfat.h"
#if ((DIGITAL_SHOW == DIGITAL_SHOW_LCM) )
extern BYTE code nAsciiDotCode[ASCIIDOT_BUF_SIZE];
extern BYTE nAsciiDot[ASCIIDOT_BUF_SIZE];//65*5
#ifdef ENABLE_PLAYMODE_KEY
extern BYTE data bPMode;
#endif

/////////////////////////////////////////////
SBYTE data sbPos;//96-8;

static BYTE volatile data bgDispStatus;
static BYTE data bgDispStatusChg;
extern STREAM *fd_mp3;
static BYTE DispStr[16];
//static BYTE data bDigital[5];
static BYTE bDigital[5];
static BYTE data bDigIdx;

#define DISP_DEVID_MAXLEN	2
BYTE MemDev[2][DISP_DEVID_MAXLEN] = {
	{'<', '>'},
	{'?', '"'}	
};

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;
}

//This function will convert the decimal value into string. 123 -> "123"
static BYTE *_DispDec2ASCII(BYTE *buf, WORD wVal)
{
	BYTE i;
	BYTE *bPtr = buf;
	
	_DispHex2Dec(wVal);
	for(i=0; i<bDigIdx; i++){
		bPtr[i] = bDigital[i] + '0';
	}
	
	return (bPtr+bDigIdx);
}

static BYTE _DispFMDec2ASCII()
{
	BYTE *bPtr = DispStr;
	BYTE bTmp;
	BYTE bCnt;
	
	bPtr = _DispDec2ASCII(bPtr, halFMGetFreq());	
	bTmp = *(bPtr-1);
	*(bPtr-1) = '.';
	*bPtr = bTmp;bPtr++;

	bCnt = bPtr -DispStr; //The number CHAR

	return bCnt;
}

//extern BYTE EQString[EQ_VALUE_MAX+1][6];
void DispInit(void) //This function should be done before any display operation
{
	//Init global variable
	bgDispStatus = DISP_IDLE_STATUS;
	bgDispGap = 0;
	bgDispStatusChg = FALSE;

#if 0
	//Reset LCM
	LCM_RST_OUT();
	LCM_RST = 1;
	DelayMs(200);
	LCM_RST = 0;
	DelayMs(200);	
	DelayMs(200);
	LCM_RST = 1;
	DelayMs(200);	
#endif

	//Init AsciiDot ICON buffer
	#ifdef DISP_WE2PROM_ENABLE
	WriteE2PRom(nAsciiDotCode, (sizeof(nAsciiDotCode)>>E2PROM_PAGE_SIZEEXP), ASCIIDOT_PAGE_ADDR<<E2PROM_PAGE_SIZEEXP);
	#endif
	//ReadE2PRom(nAsciiDot, ASCIIDOT_BUF_SIZE, ASCIIDOT_PAGE_ADDR<<E2PROM_PAGE_SIZEEXP);
	Read_N_Bytes(nAsciiDot, ASCIIDOT_BUF_SIZE, ASCIIDOT_PAGE_ADDR<<E2PROM_PAGE_SIZEEXP);
	//memcopy(nAsciiDot, nAsciiDotCode, sizeof(nAsciiDotCode));

	//Init LCM
	halLCMInit();	

#if 0
	//DispText(0, 0, " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`", 65);
	halLCMClear(0, 3);
	halLCMWriteData(0, 0, " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`", 32);

	while(1){
		UartOutText("Hello \r\n");
		DelayMs(200);
	};
#endif

	//Show start screen
#ifdef ENABLE_START_SCREEN
	memcopy(DBUF, MyCarDot, MYCAR_SIZE);
while(1){
	static BYTE bCol = 128;
	
	SysTicks = 0;
	while(SysTicks < 2);

	halLCMIcon(bCol, DBUF);	
	bCol -= 6 ;
	if(bCol == 0){
		break;
	}	
}	
#else
	//halLCMWriteBig(0,"LOADING...",10);
	halLCMWriteData(30, 1, "LOADING...", 18);
	SysTicks = 0;
	while(SysTicks < 20);
#endif

	return;
}

void DispSetStatus(BYTE bStatus)
{
	//if((bStatus == bgDispStatus) && (bStatus==DISP_NODEV_STATUS)){
	//	return;
	//}

	bgDispStatus = bStatus;
	bgDispStatusChg = TRUE; 

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

	return;
}

static void _halDispGapChk()
{
	BYTE bGap = DISP_VOLUMN_GAP;

	if(bgDispStatus == DISP_NORMAL_STATUS){
		bGap =  8;
	}
	
	if(bgDispGap > bGap){
		if(irjumptype == IRJUMP_TYPE_PICKSONG){
			halIRPickSong();
		}else if(irjumptype == IRJUMP_TYPE_CHSET){
			halIRChSet();
		}else{		
			DispSetStatus(DISP_NORMAL_STATUS);
		}

		halIRClrJump();
		bgDispGap = 0;
	}

	return;
}

static void _halDispNoDev()
{
	BYTE bCnt;

	halLCMWriteData(24, 0,"NO DEVICE", 9);
	//DispValue(32, 2, halFMGetFreq(), DISP_VALUE_FM);	
	bCnt = _DispFMDec2ASCII();
	//halLCMWriteData(32, 2, DispStr, bCnt);
	//halLCMWriteData(32+(bCnt<<3), 2, "MH", 3);
	halLCMWriteData(32, 2,"*[", 2);
	halLCMWriteData(52, 2, DispStr, bCnt);
	
	return;
}

static void _halDispNormal()
{
	BYTE * bpName;
	BYTE *bPtr = DispStr;
	BYTE bCnt;
	DRIVE *drv = DriveGet();

	if(FSMState != FSMSTATE_INIT){
		_halDispNoDev();
		return;
	}

	if(mp3status==MP3STATUS_PAUSE){
		halLCMWriteBig(16, "PAUSE", 5); 
		return;
	}
	
	//Display LFN
	if(sbPos <= 0)	{
			bpName = drv->Name + (-sbPos);
		if(((drv->LFNCnt) + sbPos)<=0)
			sbPos = 16;

		halLCMWriteData(0, 2, bpName, 16);
	}else{
		bpName = drv->Name;
		halLCMWriteData((sbPos<<3), 2, bpName, 16);
	}	
	sbPos --; //Go ahead

	halMp3Req(fd_mp3);

	//Display current mp3 time
	bPtr = _DispDec2ASCII(bPtr, bgMP3TM);
	*bPtr = ':';	bPtr++;
	bPtr = _DispDec2ASCII(bPtr, bgMP3TS);	
	bCnt = bPtr - DispStr;
	halLCMWriteData(88, 0, DispStr, bCnt);
	
	halMp3Req(fd_mp3);

	//Display device id
	halLCMWriteData(0, 0, MemDev[drv->DevID], DISP_DEVID_MAXLEN);

	//halMp3Req(fd_mp3);
	
#ifdef ENABLE_PLAYMODE_KEY
	//Display repeat set
	if(bPMode == MP3_PMODE_REPEAT1)
		halLCMWriteData(52, 0, "R1", 2);
	else
		halLCMWriteData(52, 0, "RA", 2);
#endif

	//Display fm ch
	bCnt = _DispFMDec2ASCII();
#if 0	
	halLCMWriteData(32, 0, DispStr, bCnt);
	halLCMWriteData(32+(bCnt<<3), 0,"M", 1);
#else
//'*', ':'
	halLCMWriteData(24, 0,"*[", 2);
	halLCMWriteData(24+16, 0, DispStr, bCnt);
#endif

	halMp3Req(fd_mp3);

	bgDispGap = 0;

	return;
}

void DispReset(void)
{
	sbPos = 16;

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

	return;
}
BYTE DispFMSCase(void)
{
//	BYTE *bPtr = DispStr;
//	BYTE bCnt;
	BYTE data bRet=FALSE;

	_halDispGapChk();

	// 1. Clear LCM, and display the STATUS, Large Font
	if(bgDispStatusChg == TRUE){					
		bgDispStatusChg = FALSE;
		bRet=TRUE;
	}

	return bRet; //TRUE: Display, FALSE: No Display
}
static void _halDispIdx(void)
{
	BYTE *bPtr;
	BYTE bCnt;
	BYTE bColum;
	
	bPtr = _DispDec2ASCII(DispStr, Mp3SReq.swIdx);
	*bPtr = '/';bPtr++;
	bPtr = _DispDec2ASCII(bPtr, Mp3SReq.swTotalCnt);

	bCnt = bPtr -DispStr; //The number CHAR

	//Maybe we should set the display column according the cnt;
	bColum = (128-(bCnt<<4))>>1;
	halLCMWriteBig(bColum, DispStr, bCnt);
	
	return;
}

static void _halDispVol()
{
	BYTE *bPtr = DispStr;
	BYTE bCnt;

	halLCMWriteBig(8, "VOL ", 4);
	bPtr = _DispDec2ASCII(bPtr, halVolGet());	

	bCnt = bPtr -DispStr; //The number CHAR

	//Maybe we should set the display column according the cnt;
	halLCMWriteBig(64, DispStr, bCnt);	
	
	return;
}

static void _halDispFM()
{
	BYTE *bPtr = DispStr;
	BYTE bCnt;

	bCnt = _DispFMDec2ASCII();

	//Maybe we should set the display column according the cnt;
	halLCMWriteBig(16, DispStr, bCnt);	
	halLCMWriteBig(16+(bCnt<<4), "MH", 3);	
	
	return;
}

static void _halDispJump()
{
	//DispValue(32, 0, halIRGetJump(), DISP_VALUE_NORBIG);
	BYTE *bPtr = DispStr;
	BYTE bCnt;

	bPtr = _DispDec2ASCII(bPtr, halIRGetJump());
	bCnt = bPtr - DispStr;
	
	halLCMWriteBig(16, DispStr, bCnt);	

	return;
}

static void _halDispSimp()
{
	BYTE *bPtr;
	
	if(bgDispStatus == DISP_EQ_STATUS)
		bPtr = EQString[halEQGet()];
	else
		bPtr = "ERROR";
		
	halLCMWriteBig(16, bPtr, 5); //EQ, PAUSE, ERROR

	return;
}

static void _halDispCtrlDig()
{
	BYTE *bPtr = DispStr;
	BYTE bCnt;
	WORD wTmp = halIRGetJump();

	if(irjumptype == IRJUMP_TYPE_PICKSONG){
		halLCMWriteBig(0, "IDX", 3);	
	}else{
		halLCMWriteBig(0, "FM", 2);	
	}

	if(wTmp > 0){
		bPtr = _DispDec2ASCII(bPtr, wTmp);
		bCnt = bPtr - DispStr;
		
		halLCMWriteBig(56, DispStr, bCnt);
	}	

	return;
}

//The functions in this table should not have parameters and return value for 8051 Platform.
static void (*DispHdMap[DISP_MAX_STATUS])(void) = {
	_halDispNormal, //Including NODEV, PAUSE, PLAY
	_halDispIdx,
	_halDispVol,
	_halDispFM,
	_halDispSimp, //EQ
	_halDispJump,
	_halDispSimp, //ERROR
	_halDispCtrlDig,	
};
void DispFSM()
{
	BYTE data bRet;	

	bRet = DispFMSCase();
	if(!bRet) 	//No display needed.
		return;
	
	halLCMClear(0, 3);

	halMp3Req(fd_mp3);

	DispHdMap[bgDispStatus](); 
	
	return;
}

#endif

⌨️ 快捷键说明

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