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