📄 dispdled.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 + -