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

📄 dispdled.c

📁 威望公司MP3 + USB MCU 的参考软件
💻 C
字号:
/****************************************************************
*                      Viaon Technology (Suzhou) Co.,Ltd
*
*    Copyright 2007, Viaon Technology (Suzhou) Co.,Ltd,Suzhou,China
*                    All rights reserved.
*
*
* Filename:      	dispdled.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 "common.h"
#include "dispdled.h"

#if (DIGITAL_SHOW == DIGITAL_SHOW_DLED )
extern BYTE data bgDispGap;
static BYTE data DispStatus;
static BYTE data DispStatusChg;
BYTE bDigital[4] = {LED_NONE, LED_NONE, LED_NONE, LED_NONE};
static BYTE data bDigIdx =0;

static BYTE DledDigMap[] = {
	LED_0, LED_1, LED_2, LED_3, LED_4, LED_5, LED_6, LED_7, LED_8, LED_9
}; //, DOT_LED, 1_EXT_LED};

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] = DledDigMap[bRed]; //Map the Decimal into DLED show
		bDigIdx++;
	}while(wVa > 0);

	return;
}

static void _halDispGapChk()
{
	BYTE bGap = DISP_VOLUMN_GAP;

	if((bgDispGap>bGap)&&(DispStatus!=DISP_NORMAL_STATUS)){
		if(irjumptype == IRJUMP_TYPE_PICKSONG){
			halIRPickSong();
		}else if(irjumptype == IRJUMP_TYPE_CHSET){
			halIRChSet();
		}else{		
			DispSetStatus(DISP_NORMAL_STATUS);
		}

		halIRClrJump();
		bgDispGap = 0;
	}

	return;
}

static void _halDispIdx(void)
{
	_DispHex2Dec(Mp3SReq.swIdx);//NOTE: SWORD -> WORD??

	return;
}

static void _halDispVol()
{
	_DispHex2Dec(halVolGet());

	return;
}

static void _halDispFM()
{
	_DispHex2Dec(halFMGetFreq());

	return;
}

static void _halDispJump()
{
#if (IRCTRL_MODE == IRCTRL_MODE_DIGCTRL)	
	_DispHex2Dec(halIRGetJump());

#endif

	return;
}

static void _halDispSimp()
{
	UartOutText("-I-:_halDispSimp\r\n");
		
	if(DispStatus == DISP_EQ_STATUS){
		bDigital[0] = LED_E;
		bDigital[1] = DledDigMap[halEQGet()];
		bDigIdx = 2;
	}else{
		bDigital[0] = LED_E;
		bDigital[1] = LED_R;
		bDigIdx = 2;
	}
		
	return;
}

static void _halDispCtrlDig()
{

#if (IRCTRL_MODE == IRCTRL_MODE_CTRLDIG)	
	WORD wTmp = halIRGetJump();

	UartOutText("-I-:wTmp_high\t");UartOutValue((BYTE)(wTmp&0xff00), 2);
	UartOutText("-I-:wTmp_low\t");UartOutValue((BYTE)(wTmp&0x00ff), 2);
	
	if(wTmp > 0){
		_DispHex2Dec(wTmp);
	}else{//wTmp == 0
		bDigIdx = 0;
	}
#endif

	return;
}

static void _halDispNoDev()
{
	//set FM or IDX when no device
	_halDispFM();
	//_halDispIdx();

	return;
}

static void _halDispPause()
{
	UartOutText("-I-:_halDispPause\r\n");

	_halDispFM();
	//_halDispIdx();
	
	return;
}
static void _halDispNormal()
{

	UartOutText("-I-:_halDispNormal\r\n");
	if(FSMState != FSMSTATE_INIT){ //No device
		_halDispNoDev();//Show some thing song idx/fm freq.
		return;
	}

	if(mp3status==MP3STATUS_PAUSE){ //Pause
	
		_halDispPause();
		//_halDispIdx();
		
		return;
	}

	//Normal Play	//Display fm ch
	_halDispFM();

	bgDispGap = 0;

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

//Check if the display status is changed.
BYTE _DispFMSCase(void)
{
	BYTE data bRet=FALSE;

	_halDispGapChk();

	if(DispStatusChg == TRUE){					
		DispStatusChg = FALSE;
		bRet=TRUE;
	}

	return bRet; //TRUE: Display, FALSE: No Display
}
#if 0
static void _halModLED(BYTE Status){
	/*
	for justify digital LED 
			
	*/
	//add DOT flag for display Freq.
	if((Status == DISP_NORMAL_STATUS)||(Status == DISP_FMCH_STATUS))
		ADD_DOT(bDigital[bDigIdx-2]);
		
	return;
}
#endif
////////////////////////////API for DLED Display Module///////////////////////////////
void DispFSM(void)
{
	BYTE data bRet;	
//	BYTE data i;
//	WDT = 0X1F;
	
	bRet = _DispFMSCase();
	if(!bRet) 	//No display needed.
		return;
	
	//UartOutText("-I-irjump\t");UartOutValue(halIRGetJump(), 2);
		
	DispHdMap[DispStatus](); 

//	WDT = 0X1F;	
	return;
}

//extern BYTE EQString[EQ_VALUE_MAX+1][6];
void DispInit(void) //This function should be done before any display operation
{
	//Init global variable
	DLED_DATA_DIROUT();
	DLED_SEG_DIROUT();	
	
	DispStatus = DISP_NORMAL_STATUS;
	bgDispGap = 0;
	DispStatusChg = FALSE;
	DispSetStatus(DispStatus);
	return;
}

void DispSetStatus(BYTE bStatus)
{
	DispStatus = bStatus;
	DispStatusChg = TRUE; 

	bgDispGap = 0;

	return;
}

void DispReset(void)
{
	//DispStatus = DISP_IDLE_STATUS;
	//DispStatusChg = FALSE;
	
	return;
}

void halDLEDISR(void) //using 1
{
	static BYTE data SegIdx = 0;
	
	DLED_SEG_OFF();
	
	//_halModLED(DispStatus);	
	if((DispStatus == DISP_NORMAL_STATUS)||(DispStatus == DISP_FMCH_STATUS))
		ADD_DOT(bDigital[bDigIdx-2]);	
	
	if(bDigIdx == 0){
		return;
	}
	
	DLED_DATA(bDigital[SegIdx]);
	//DLED_SEG_SEL(4-bDigIdx+SegIdx);//dig1~dig4 <-->p4,p5,p6,p7
	DLED_SEG_SEL(bDigIdx-SegIdx-1);//dig1~dig4 <-->p7,p6,p5,p4
	
	SegIdx++;
	if(SegIdx >= bDigIdx){
		SegIdx = 0;
	}

	return;
}

#endif

⌨️ 快捷键说明

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