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

📄 display.c

📁 一个DVD组合机的MCU代码,FM,机芯出入仓,功放的控制及DVD数据通过通信来访问.
💻 C
字号:
/*-TAB=2-------------------------------------------------------------------*/
/**------------------------------------------------------------------------*
 *                                                                         *
 * NAME:Display.c                                                          *
 *                                                                         *
 *                                                                         *
 * UPDATE: 2002/8/15  YCD                                                  *
 *                                                                         *
 *                                                                         *
 *                                                                         *
 *-------------------------------------------------------------------------*/
#include "..\SRC\ZM.H"
#include "..\SRC\display.H"
#include "..\SRC\KEY.H"

void MpgKeyPush(BYTE aKey);
BYTE IsTimeOut(BYTE aIndexType);
void InitTime(BYTE aIndexType,BYTE aCount);
void ClrDigitRang(void);

BYTE  gDisplayBuf[18];
bit   gCdRoundBool;
BYTE  gVfdkeyBuf[6];
BYTE  gScanIndex;
BYTE  gScanValue;

/*------------------------------------------------------------------------*/
/*     const                                                              */
/*------------------------------------------------------------------------*/
const BYTE kIcon[27][3]={
{RAM_DTS      ,ADDR_DTS         ,BIT_DTS         },
{RAM_RDS      ,ADDR_RDS         ,BIT_RDS         },
{RAM_COL_7G   ,ADDR_COL_7G      ,BIT_COL_7G      },
{RAM_ST       ,ADDR_ST          ,BIT_ST          },
{RAM_COL_5G   ,ADDR_COL_5G      ,BIT_COL_5G      },
{RAM_TUND     ,ADDR_TUND        ,BIT_TUND        },
{RAM_PBC      ,ADDR_PBC         ,BIT_PBC         },
{RAM_S        ,ADDR_S           ,BIT_S           },
{RAM_DVD      ,ADDR_DVD         ,BIT_DVD         },
{RAM_V        ,ADDR_V           ,BIT_V           },
{RAM_CD       ,ADDR_CD          ,BIT_CD          },
{RAM_MP3      ,ADDR_MP3         ,BIT_MP3         },
{RAM_II       ,ADDR_II          ,BIT_II          },
{RAM_RIGHT    ,ADDR_RIGHT       ,BIT_RIGHT       },
{RAM_LEFT     ,ADDR_LEFT        ,BIT_LEFT        },
{RAM_C        ,ADDR_C           ,BIT_C           },
{RAM_AM       ,ADDR_AM          ,BIT_AM          },
{RAM_ALL      ,ADDR_ALL         ,BIT_ALL         },
{RAM_FM       ,ADDR_FM          ,BIT_FM          },
{RAM_3D       ,ADDR_3D          ,BIT_3D          },
{RAM_MEM      ,ADDR_MEM         ,BIT_MEM         },
{RAM_KHZ      ,ADDR_KHZ         ,BIT_KHZ         },
{RAM_MHZ      ,ADDR_MHZ         ,BIT_MHZ         },
{RAM_DP_7G    ,ADDR_DP_7G       ,BIT_DP_7G       },
{RAM_DDD      ,ADDR_DDD         ,BIT_DDD         },
{RAM_DP_5G    ,ADDR_DP_5G       ,BIT_DP_5G       },
{RAM_8        ,ADDR_8           ,BIT_8           }
};

const BYTE kZkTab[38][2]={
 0X00,0X00,   /*NULL*/

 0X46,0X62,   /*0*/
 0X40,0x20,   /*1*/
 0X86,0X61,   /*2*/
 0XC2,0X61,   /*3*/
 0XC0,0X23,   /*4*/
 0XC2,0X43,   /*5*/
 0XC6,0X43,   /*6*/
 0X40,0X60,   /*7*/
 0XC6,0X63,   /*8*/
 0XC2,0X63,   /*9*/

 0XC4,0X63,   /*a*/
 0X52,0X69,   /*b*/
 0X06,0X42,   /*c*/
 0X52,0X68,   /*d*/
 0X86,0X43,   /*e*/
 0X84,0X42,   /*f*/
 0X46,0X43,   /*g*/
 0XC4,0X23,   /*h*/
 0X10,0X08,   /*i*/
 0X46,0X20,   /*j*/
 0XA4,0X12,   /*k*/
 0X06,0X02,   /*l*/
 0X44,0X36,   /*m*/
 0X64,0X26,   /*n*/
 0X46,0X62,   /*o*/
 0X84,0X63,   /*p*/
 0X66,0X62,   /*q*/
 0XA4,0X63,   /*r*/
 0XC2,0X43,   /*s*/
 0X10,0X48,   /*t*/
 0X46,0X22,   /*u*/
 0X0C,0X12,   /*v*/
 0X6C,0X22,   /*w*/
 0X28,0X14,   /*x*/
 0XC2,0X23,   /*y*/
 0X0A,0X50,   /*z*/
 0X02,0X00    /*+*/
};



const WORD kCdPosition[]={
0x3de0,   /*0011 1101 1110 0000*/
0x5ee0,   /*0101 1110 1110 0000*/
0x6f60,   /*0110 1111 0110 0000*/
0x77a0,   /*0111 0111 1010 0000*/
0x7bc0,   /*0111 1011 1100 0000*/
0x3de0,   /*0011 1101 1110 0000*/
0x5ee0,   /*0101 1110 1110 0000*/
0x6f60,   /*0110 1111 0110 0000*/
0x77a0,   /*0111 0111 1010 0000*/
0x7bc0    /*0111 1011 1100 0000*/
};


/*
const WORD kCdPosition[]={
0x4900,   0100 1001 0000 0000
0x2480,   0010 0100 1000 0000
0x1240,   0001 0010 0100 0000
0x0920,   0000 1001 0010 0000
0x4480,   0100 0100 1000 0000
0x2240,   0010 0010 0100 0000
0x1120,   0001 0001 0010 0000
0x4880,   0100 1000 1000 0000
0x2440,   0010 0100 0100 0000
0x1220    0001 0010 0010 0000
};
*/

/**
 * 0:index 1:code 2:key 3:send key
 */
const BYTE kVfdKeyTab[17][4]={
1,0X08,UPD6311_KEY_MD_AUX,			0x00,
1,0X04,UPD6311_KEY_SW1,					0x01,
1,0X02,UPD6311_KEY_SW2,         0x02,
1,0X01,UPD6311_KEY_SW3,         0x03,
0,0X10,UPD6311_KEY_SW4,         0x04,
0,0X80,UPD6311_KEY_FM_AM,       0x05,
0,0X40,UPD6311_KEY_VOL_UP,      0x06,
0,0X20,UPD6311_KEY_VOL_DOWN,    0x07,
0,0X08,UPD6311_KEY_PLAY_PAUSE,  0x08,
0,0X04,UPD6311_KEY_STOP,        0x09,
0,0X02,UPD6311_KEY_PREV,        0x0a,
0,0X01,UPD6311_KEY_NEXT,        0x0b,
1,0X10,UPD6311_KEY_OPEN_CLOSE,  0x0c,
1,0X20,UPD6311_KEY_STADBY,      0x0d,
0,0x00,UPD6311_KEY_BOXCLOSE,	  0x10,
0,0x00,UPD6311_KEY_XMUTE,	      0x21,
0,0x00,UPD6311_KEY_XDMUTE,	    0x22,
};


const BYTE kVfdContinueKeyTab[]={
RADIO_VOL_DOWN_KEY,
RADIO_VOL_UP_KEY
};

/*------------------------------------------------------------------------*/
/*      display process                                                   */
/*------------------------------------------------------------------------*/
/**
 *@void ClrWorkRang(void)
 *@update 2002/8/19
 */
void ClrWorkRang(void)
{
	BYTE i;
	for(i=2;i<18;i++) gDisplayBuf[i]=0;
	gDisplayBuf[0]&=0XE0;
	gDisplayBuf[1]&=0X7F;
	Lsb_InitVfd();
}


/**
 *@void InitVfd(void)
 *@update 2002/8/19
 */
void InitVfd(void)
{
	gDisplayBuf[0]=0;
	gDisplayBuf[1]=0;
	ClrWorkRang();
}

/**
 *@void ShowIcon(BYTE aIcon)
 *@update 2002/8/19
 */
void WriteScreenRam(WORD Addr_Data);
void ShowIcon(BYTE aIcon)
{
	WORD Addr_Data;
	BYTE i;
	if(aIcon<ICON_TOTAL){
		i=kIcon[aIcon][0];
		gDisplayBuf[i]|=kIcon[aIcon][2];
		Addr_Data=kIcon[aIcon][1];
		Addr_Data<<=8;
		Addr_Data|=gDisplayBuf[i];
		WriteScreenRam(Addr_Data);
	}
}

/**
 *@void HideIcon(BYTE aIcon)
 *@update 2002/8/19
 */
void HideIcon(BYTE aIcon)
{
	WORD 	Addr_Data;
	BYTE 	Mask;
	BYTE 	i;

	if(aIcon<ICON_TOTAL){
		i=kIcon[aIcon][0];
		Mask=~kIcon[aIcon][2];
		gDisplayBuf[i]&=Mask;
		Addr_Data=kIcon[aIcon][1];
		Addr_Data<<=8;
		Addr_Data|=gDisplayBuf[i];
		WriteScreenRam(Addr_Data);
	}
}


/**
 *@void ShowCircleS(WORD aData);
 *@update 2002/8/19
 */
void ShowCircleS(WORD aData)
{
	BYTE Hi,Low;
	WORD Addr_Data;

	Low=aData;
	Hi=aData>>8;

	gDisplayBuf[0]&=0x1f;
	gDisplayBuf[0]|=Low&0xe0;

	gDisplayBuf[1]&=0x80;
	gDisplayBuf[1]|=Hi&0x7f;

	Addr_Data=gDisplayBuf[0];
	WriteScreenRam(Addr_Data);

	Addr_Data=gDisplayBuf[1];
	Addr_Data|=0X0100;
	WriteScreenRam(Addr_Data);
}


/**
 *@void ShowChar(BYTE x,BYTE aChar);
 *@param  x=CHAR_3G-->CHAR_9G, aChar='0'-->'9'
 *@update 2002/8/19
 */
void ShowChar(BYTE x,BYTE aChar)
{
	BYTE i,Index;
	WORD Addr_Data;

	if(x<=CHAR_9G){
		if(aChar==0) i=0;
		else if(aChar==0x20) i=0;
		else if(aChar>='0' && aChar<='9') i=aChar-'0'+1;
		else if(aChar>='a' && aChar<='z') i=aChar-'a'+11;
		else if(aChar>='A' && aChar<='Z') i=aChar-'A'+11;
		else if(aChar=='_') i='Z'-'A'+11+1;
		else return;

		Index=RAM_3G+2*x;
		gDisplayBuf[Index]&=0x01;
		gDisplayBuf[Index+1]&=0x80;
		gDisplayBuf[Index]|=kZkTab[i][0];
		gDisplayBuf[Index+1]|=kZkTab[i][1];

		Addr_Data=ADDR_3G+3*x;
		Addr_Data<<=8;
		Addr_Data|=gDisplayBuf[Index];
		WriteScreenRam(Addr_Data);

		Addr_Data&=0x3f00;
		Addr_Data+=0x0100;
		Addr_Data|=gDisplayBuf[Index+1];
		WriteScreenRam(Addr_Data);
	}
}


/**
 *@void ShowBit(BYTE anAddr,BYTE aBit)
 *@param anAddr:0-25 vfd display addresss,aBit:vfd bit
 *@update 2002/9/2
 */
void ShowAddrBit(BYTE anAddr,BYTE aBit)
{
	BYTE 				Index;
	uAddrValue 	Data;
	if(anAddr<26){
		Index=(anAddr/3)*2+anAddr%3;
		gDisplayBuf[Index]=aBit;
		Data.mAddrValue.mAddr=anAddr;
		Data.mAddrValue.mValue=aBit;
		WriteScreenRam(Data.mWord);
	}
}



/*-------------------------------------------------------------------------*/
/*   application display                                                   */
/*-------------------------------------------------------------------------*/
/**
 *@void ShowCircleS(WORD aData);
 *@param  x=CHAR_3G-->CHAR_9G, aChar='0'-->'9'
 *@update 2002/8/19
 */
void CdRoundProc(void)
{
	static BYTE Index=0;
	if(gCdRoundBool){
		if(IsTimeOut(INDEX_CDROUND)){
			ShowCircleS(kCdPosition[Index]);
			Index++;
			if(Index>9) Index=0;
			InitTime(INDEX_CDROUND,ROUND_CD_TIME);
		}
	}
}

/**
 *@void StopCdRound(void)
 *@update 2002/9/2
 */
void StopCdRound(void)
{
	gCdRoundBool=0;
}


void ClrCdRound()
{
	WORD Addr_Data;

	gCdRoundBool=0;
	gDisplayBuf[0]&=0x1f;
	gDisplayBuf[1]&=0x80;

	Addr_Data=gDisplayBuf[0];
	WriteScreenRam(Addr_Data);

	Addr_Data=gDisplayBuf[1];
	Addr_Data|=0X0100;
	WriteScreenRam(Addr_Data);
}


void ShowCdRound()
{
	WORD Addr_Data;

	gCdRoundBool=0;
	gDisplayBuf[0]|=0xe0;
	gDisplayBuf[1]|=0x7f;

	Addr_Data=gDisplayBuf[0];
	WriteScreenRam(Addr_Data);

	Addr_Data=gDisplayBuf[1];
	Addr_Data|=0X0100;
	WriteScreenRam(Addr_Data);
}


/*-------------------------------------------------------------------------*/
/*            VFD  STRING SHOW                                             */
/*-------------------------------------------------------------------------*/
#define 	STRING_TOTAL 	13+1
const BYTE kVfdString[13][8]={
" OPEN  ",  /*0X20+1*/
"CLOSE  ",  /*0X20+2*/
" LOAD  ",  /*0X20+3*/
"NO DISC",  /*0X20+4*/
"BADDISC",  /*0X20+5*/
"UPDATE ",  /*0X20+6*/
"  00000",  /*0X20+7*/
"0000000",  /*0X20+8*/
"  STOP ",  /*0X20+9*/
" TITLE ",  /*0X20+10*/
" ROOT  ",  /*0X20+11*/
"CDRound",  /*0X20+12*/
"CDStop"    /*0X20+13*/
};


bit gBoolCanOpenBox; /*close delay*/
/**
 *@void ShowString(BYTE aIndex)
 *@update 2002/9/2
 */
void TextOut(BYTE Index,BYTE *aBuf);
void ShowString(BYTE aIndex) /*aIndex-=0X20*/
{
	int i;
	if(aIndex<STRING_TOTAL){
		if(aIndex==0) ClrDigitRang();
		else if(aIndex==12) gCdRoundBool=1;
		else if(aIndex==13){
			StopCdRound();
			ShowCdRound();
		}
		else {
			switch(aIndex){
				case 1: /* open */
				case 3: /* load */
				case 4: /* no disk */
				case 5: /* band disk */
					ClrCdRound();
					ClrWorkRang();
					break;
				case 9:/* stop */
					ShowCdRound();
					break;
			}

			if(aIndex==3){
				gBoolCanOpenBox=1;
				gCdRoundBool=1;
			}

			HideIcon(ICON_COL_7G);
			HideIcon(ICON_COL_5G);
			TextOut(0,kVfdString[aIndex-1]);
		}
	}
}


/**
 *@void TextOut(BYTE Index,BYTE *aBuf)
 *@update 2002/9/3
 */
void TextOut(BYTE Index,BYTE *aBuf)
{
	for(;Index<7;Index++){
		if(*aBuf==0) break;
		ShowChar(Index,*aBuf++);
	}
}


/**
 *@void ClrDigitRang(void)
 *@update 2002/9/3
 */
void ClrDigitRang(void)
{
	BYTE i;
	for(i=0;i<7;i++) ShowChar(i,0x20);
}


/*--------------------------------------------------------------------------*/
/*      LED PROCESS                                                         */
/*--------------------------------------------------------------------------*/
bit  gOpenCloseLed=P0.0;
bit  gStandbyLed=P0.1;

BYTE gLedTmCount=0;
bit  gboolOpenCloseLed;


/**
 *@void TurnOnStandbyLed(void)
 *@update 2002/9/2
 */
void TurnOnStandbyLed(void)
{
	gStandbyLed=1;
}

/**
 *@void TurnOffStandbyLed(void)
 *@update 2002/9/2
 */
void TurnOffStandbyLed(void)
{
	gStandbyLed=0;
}

/*---------------------------------------------------------------------------*/
/**
 *@void ColseStandbyLed(void)
 *@update 2002/9/2
 */
void OpenCloseLedProc(void)
{
	if(gboolOpenCloseLed==LED_ON){
		if(gLedTmCount==0){
			gOpenCloseLed=~gOpenCloseLed;
			gLedTmCount=LED_TM_COUNT;
		}
	}
}

/**
 *@void TurnOnOpenCloseLed(void)
 *@update 2002/9/2
 */
void TurnOnOpenCloseLed(void)
{
	gboolOpenCloseLed=LED_ON;
}

/**
 *@void TurnOffOpenCloseLed(void)
 *@update 2002/9/2
 */
void TurnOffOpenCloseLed(void)
{
	gboolOpenCloseLed=LED_OFF;
	gOpenCloseLed=0;
}


/*--------------------------------------------------------------------------*/
/*      VFD KEY PROCESS                                                     */
/*--------------------------------------------------------------------------*/
/**
 *@int VfdKbHit(void)
 *@update 2002/8/20
 */
BYTE VfdKbHit(void)
{
	BYTE i,Result=0;
	IsTimeOut(INDEX_VFD_CONTINUEKEY);
	if(IsTimeOut(INDEX_VFD_SCAN)){
		InitTime(INDEX_VFD_SCAN,VFD_SCAN_TIMER);
		Lsb_VfdReadKey();
		for(i=0;i<6;i++){
			if(gVfdkeyBuf[i]!=0){
				if(gScanIndex!=i||gScanValue!=gVfdkeyBuf[i]){
					gScanIndex=i;
					gScanValue=gVfdkeyBuf[i];
					Result=1;
				}
				break;
			}
		}
		if(i>5) gScanValue=0;
	}
	return(Result);
}


/**
 *@BYTE VfdGetKey(void)
 *@update ycd 2002/8/20
 */
#define VFD_CONTINUE_KEY_DELAY 255
BYTE VfdGetKey(void)
{
	BYTE i,KeyCode=0;

	for(i=0;i<14;i++){
		if(kVfdKeyTab[i][0]==gScanIndex && kVfdKeyTab[i][1]==gScanValue){
			KeyCode=kVfdKeyTab[i][2];
			break;
		}
	}

	if(KeyCode==kVfdContinueKeyTab[0]||KeyCode==kVfdContinueKeyTab[1]){
		gScanValue=0;
		if(IsTimeOut(INDEX_VFD_CONTINUEKEY)) {
			InitTime(INDEX_VFD_CONTINUEKEY,VFD_CONTINUE_KEY_DELAY);
		}
		else KeyCode=0;
	}

	return(KeyCode);
}

/**
 *@void SnedKeytoMpg(BYTE KeyCode)
 *@param aKeyCode is define keycode
 *@update 2002/9/2
 */
void SnedKeytoMpg(BYTE aKeyCode)
{
	BYTE i;
	for(i=0;i<15;i++){
		if(kVfdKeyTab[i][2]==aKeyCode){
			MpgKeyPush(kVfdKeyTab[i][3]);
			break;
		}
	}
}


/*------------------------------------------------------------------------*/
/**
 *@void WordToStr(BYTE *aBuf,WORD aData);
 *@param adata<0x7fff   aBuf len>=6
 *@update 2002/9/12
 */
void WordToStr(BYTE *aBuf,WORD aData)
{
	BYTE i,Before=0;
	WORD L=10000;

	aData&=0x7fff;
	for(i=0;i<4;i++){
		aBuf[i]=aData/L;
		aData-=L*aBuf[i];
		if(aBuf[i]==0&&Before==0) aBuf[i]=0x20;
		else{
			aBuf[i]+=0x30;
			Before=1;
		}
		L/=10;
	}
	aBuf[4]=aData+0x30;
	aBuf[5]=0;
}



/**
 *@void DVDMute(void)
 *@update 2002/8/19
 */
void DVDMute(void)
{
	MpgKeyPush(0x21);
}

/**
 *@void DVDDiMute(void)
 *@update 2002/8/19
 */
void DVDDiMute(void)
{
	MpgKeyPush(0x22);
}


/*-----------------------------------------------------------------------*/

/*#define	SHOW_HEX*/
#ifdef	SHOW_HEX
/**
 *@void ShowHex(BYTE i,BYTE aByte)
 *@update 2002/8/19
 */
void ShowHex(BYTE i,BYTE aByte)
{
	BYTE Low,Hi;
	Low=aByte&0x0f;
	Hi=(aByte>>4)&0x0f;

	if(Low<10) Low+='0';
	else Low+='a'-10;

	if(Hi<10) Hi+='0';
	else Hi+='a'-10;
	ShowChar(i,Hi);
	ShowChar(i+1,Low);
}



#endif /* HOW_HEXX */


















⌨️ 快捷键说明

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