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

📄 tv.c.bak

📁 7寸TFT电视的源程序
💻 BAK
字号:
//#define DEBUG_MSG
#include "target.h"
#include "fq1236.h"

#define MENU_MAX		5

#define STARTX			4
#define STARTY			3
#define VOL_LINE		8

#define COLOR1			0
#define COLOR2			4

enum{
	TV_CURCHANNEL_ADDR = TV_EEPROM_ADDRESS_START,
	TV_SKIP_ADDR_START
};

extern unsigned char idata CurTvChannel;
extern unsigned char volume;
extern unsigned char idata AudioToneMode;
extern unsigned char idata tunerbuf[6];

unsigned char SearchPLLlock(unsigned char *tunerData);

unsigned char idata currentx = 0;
unsigned char idata tvmode = TV_OFF;
unsigned char idata find;
unsigned char idata input = 0;
unsigned char idata FirstSearchChannel = 0;

bit bSkip;
bit bCurrentLock = 0;

unsigned char code TVMenu[MENU_MAX][13]={
	"CHANNEL:",
	"SKIP: ",
	"BAND: ",
	"FINE:     00",
	"AUTO SEARCH:"
};

unsigned char code BandStr[][4]={
	"VLF",
	"VHF",
	"UHF"
};

unsigned char GetBandIndex(unsigned char channel)
{
	if(channel<7)
		return 0;
	else if(channel<14)
		return 1;
	else
		return 2;
}

unsigned char GetSkipStatus(unsigned char channel)
{
	unsigned char uctemp;
	ReadEepromBytes(TV_SKIP_ADDR_START+channel,&uctemp,1);
	return !(uctemp&0x80);
}

void SetSkip(unsigned char channel,unsigned char skip)
{
	unsigned char uctemp;
	ReadEepromBytes(TV_SKIP_ADDR_START+channel,&uctemp,1);
	if(skip)
		uctemp &= 0x7F;
	else
		uctemp |= 0x80;
	WriteEepromBytes(TV_SKIP_ADDR_START+channel,&uctemp,1);
}

unsigned char GetFindNum(unsigned char channel)
{
	unsigned char uctemp;
	ReadEepromBytes(TV_SKIP_ADDR_START+channel,&uctemp,1);
	uctemp &= 0x7F;
	if(uctemp>40)
		uctemp = 20;
	return uctemp;
}

unsigned char GetNextChannel(unsigned char channel)
{
	unsigned char i;
	for(i=channel+1;i<=MAX_CHANNEL;i++){
		if(!GetSkipStatus(i))
			return i;
	}
//
	for(i=MIN_CHANNEL;i<channel;i++){
		if(!GetSkipStatus(i))
			return i;
	}
	return 0xff;
}

unsigned char GetPreChannel(unsigned char channel)
{
	unsigned char i;
//not valid channel
	if(channel<MIN_CHANNEL)
		return 0xff;

	for(i=channel-1;i>=MIN_CHANNEL;i--){
		if(!GetSkipStatus(i))
			return i;
	}
//
	for(i=MAX_CHANNEL;i>channel;i--){
		if(!GetSkipStatus(i))
			return i;
	}
	return 0xff;
}

void ShowTVNumber(unsigned char channel)
{
	TVOutChar(19,0,'C',COLOR2);
	TVOutChar(20,0,'H',COLOR2);

	TVOutChar(22,0,channel/10+'0',COLOR2);
	TVOutChar(23,0,channel%10+'0',COLOR2);

	FPOutChar(7,CurTvChannel/10+'0');
	FPOutChar(8,CurTvChannel%10+'0');
}

void ShowToneValue(unsigned char x,unsigned char y,unsigned char tone)
{
	if(tone>11){
		tone -= 12;
		TVOutChar(x,y,'+',COLOR2);
	}
	else{
		tone = 12-tone;
		TVOutChar(x,y,'-',COLOR2);
	}
	TVOutChar(x+1,y,tone/10+'0',COLOR2);
	TVOutChar(x+2,y,tone%10+'0',COLOR2);

//	TVOutChar(x+3,y,'d',3);
//	TVOutChar(x+4,y,'B',3);
}

void ShowTVInputNumber(unsigned char channel)
{
	TVOutChar(22,0,channel/10+'0',COLOR2);
	TVOutChar(23,0,'-',COLOR2);
}

void ShowTVBass(unsigned char ucval)
{
	TVOutString(0,VOL_LINE,"Bass            ",COLOR2);
	ShowToneValue(12,VOL_LINE,ucval);
}

void ShowTVTreble(unsigned char ucval)
{
	TVOutString(0,VOL_LINE,"Treble          ",COLOR2);
	ShowToneValue(12,VOL_LINE,ucval);
}

void ShowTVBalance(unsigned char ucval)
{
	TVOutString(0,VOL_LINE,"Balance         ",COLOR2);
	ShowToneValue(12,VOL_LINE,ucval);
}

void ShowTVFade(unsigned char ucval)
{
	TVOutString(0,VOL_LINE,"Fade            ",COLOR2);
	ShowToneValue(12,VOL_LINE,ucval);
}

void ShowMenuItem(unsigned char item,unsigned char focus)
{
	unsigned char uctemp;

	uctemp = focus?COLOR1:COLOR2;
	TVOutString(STARTX,STARTY+item,TVMenu[item],uctemp);
	if(focus){
		TVOutChar(STARTX-2,STARTY+item,'>',COLOR2);
	}
	else{
		TVOutChar(STARTX-2,STARTY+item,0xff,COLOR2);
	}
	switch(item){
		case 0:
//			uctemp = COLOR2;
			TVOutChar(STARTX+10,STARTY,'C',uctemp);
			TVOutChar(STARTX+11,STARTY,'H',uctemp);
			TVOutChar(STARTX+13,STARTY,CurTvChannel/10+'0',uctemp);
			TVOutChar(STARTX+14,STARTY,CurTvChannel%10+'0',uctemp);
		break;
		case 1:
			bSkip = GetSkipStatus(CurTvChannel);
			if(bSkip)
				TVOutString(STARTX+10,STARTY+item,"ON ",uctemp);
			else
				TVOutString(STARTX+10,STARTY+item,"OFF",uctemp);
		break;
		case 2:
//draw band
			uctemp = GetBandIndex(CurTvChannel);
			TVOutString(STARTX+10,STARTY+2,BandStr[uctemp],COLOR2);
		break;
		case 3:
		break;
		case 4:
			TVOutString(STARTX+13,STARTY+4,"OFF",uctemp);
		break;
	}
}

void ShowSearchBar(unsigned char channel)
{
	unsigned char uctemp = GetBandIndex(channel);
	unsigned char i;
	TVOutString(0,7,"SEARCH",COLOR2);
	TVOutString(8,7,BandStr[uctemp],COLOR2);
	uctemp = channel/4;
	for(i=0;i<uctemp;i++)
		TVOutChar(i,VOL_LINE,1,COLOR2);
	TVOutChar(uctemp,VOL_LINE,4,COLOR2);
	for(i=uctemp+1;i<18;i++)
		TVOutChar(i,VOL_LINE,1,COLOR2);
	TVOutChar(20,VOL_LINE,channel/10+'0',COLOR2);
	TVOutChar(21,VOL_LINE,channel%10+'0',COLOR2);
}

void ShowFindBar(unsigned char find)
{
	unsigned char i;
	TVOutString(8,7,"FINE",COLOR2);
	for(i=0;i<21;i++)
		TVOutChar(i,VOL_LINE,1,COLOR2);

	if(find>18){
		TVOutChar(find/2,VOL_LINE,4,COLOR2);
		TVOutChar(21,VOL_LINE,'+',COLOR2);
		TVOutChar(22,VOL_LINE,(find-18)/10+'0',COLOR2);
		TVOutChar(23,VOL_LINE,(find-18)%10+'0',COLOR2);
	}
	else{
		TVOutChar(find/2,VOL_LINE,4,COLOR2);
		TVOutChar(21,VOL_LINE,'-',COLOR2);
		TVOutChar(22,VOL_LINE,(18-find)/10+'0',COLOR2);
		TVOutChar(23,VOL_LINE,(18-find)%10+'0',COLOR2);
	}
}

void TVDisplayVol(unsigned char vol)
{
	TVOutString(0,VOL_LINE,"volume         ",COLOR2);
	TVOutChar(12,VOL_LINE,vol/10+'0',COLOR2);
	TVOutChar(13,VOL_LINE,vol%10+'0',COLOR2);
}

void TVMenuDraw()
{
	unsigned char i;
	for(i=0;i<5;i++)
		ShowMenuItem(i,i==currentx);
}

void AutoCheckPllLock()
{
	unsigned char ucSearch;
#ifdef DEBUG_MSG
#ifdef __EMULATOR_H__
	static unsigned char count = 0;
#endif
#endif
	if(tvmode!=TV_OFF)
		return;

	SetTvTunerFreqBuf(CurTvChannel);
	//SetTvChannel(CurTvChannel);
	ucSearch = SearchPLLlock(tunerbuf);
	ShowLcdHex(0x40,ucSearch);
	ShowLcdHex(0x42,count++);

	if(bCurrentLock){
		if(ucSearch){
			SaveKeyToBuff(PLL_LOCK_KEY);
			bCurrentLock = 0;
		}
	}
	else{
		if(ucSearch==0){
			SaveKeyToBuff(PLL_LOCK_KEY);
			bCurrentLock = 1;
		}
	}
}

void UpValueKey()
{
	switch(currentx){
		case 0:
			if(CurTvChannel<MAX_CHANNEL)
				CurTvChannel++;
			else
				CurTvChannel = MIN_CHANNEL;
			ShowMenuItem(currentx,1);
			SetTvChannel(CurTvChannel);
			ShowMenuItem(1,0);
			ShowMenuItem(2,0);
			TvDelay();
			TvDelay();
		break;
		case 1:
			bSkip = GetSkipStatus(CurTvChannel);
			SetSkip(CurTvChannel,!bSkip);
			ShowMenuItem(currentx,1);
		break;
		case 3:
			tvmode = TV_FIND;
			CLearOsdScreen(bCurrentLock);
			find = GetFindNum(CurTvChannel);
			ShowFindBar(find);
		break;
		case 4:
			tvmode = TV_SEARCH;
			FirstSearchChannel = 0;
			CurTvChannel = 2;
			CLearOsdScreen(0);
			SaveKeyToBuff(TV_CHECK_KEY);
		break;
	}
}

void DownValueKey()
{
	switch(currentx){
		case 0:
			if(CurTvChannel>MIN_CHANNEL)
				CurTvChannel--;
			else
				CurTvChannel = MAX_CHANNEL;
			ShowMenuItem(currentx,1);
			SetTvChannel(CurTvChannel);
			ShowMenuItem(1,0);
			ShowMenuItem(2,0);
		break;
		case 1:
			bSkip = GetSkipStatus(CurTvChannel);
			SetSkip(CurTvChannel,!bSkip);
			ShowMenuItem(currentx,1);
		break;
		case 3:
		break;
		case 4:
		break;
	}
}

void TVMenuDealFunc(unsigned int key)
{
	switch(key){
		case DOWN_KEY:
			ShowMenuItem(currentx,0);
			switch(currentx){
				case 0:
					currentx = 1;
					break;
				case 1:
					currentx = 4;
//					currentx = 3;
					break;
				case 3:
					currentx = 4;
					break;
				default:
					currentx = 0;
					break;
			}
			ShowMenuItem(currentx,1);
			SetTimerFunc(TIME_5SEC,SETUP_KEY);
			break;
		case UP_KEY:
			ShowMenuItem(currentx,0);
			switch(currentx){
				case 4:
					currentx = 1;
//					currentx = 3;
					break;
				case 3:
					currentx = 1;
					break;
				case 0:
					currentx = 4;
					break;
				default:
					currentx = 0;
					break;
			}
			ShowMenuItem(currentx,1);
			SetTimerFunc(TIME_5SEC,SETUP_KEY);
			break;
		case LEFT_KEY:
			DownValueKey();
			SetTimerFunc(TIME_5SEC,SETUP_KEY);
			break;
		case RIGHT_KEY:
			UpValueKey();
			SetTimerFunc(TIME_5SEC,SETUP_KEY);
			break;
		case SETUP_KEY:
			tvmode = TV_OFF;
			CLearOsdScreen(bCurrentLock);
			SetCrystal(bCurrentLock);
			SaveKeyToBuff(REDRAW_KEY);
			SetTimerFunc(0xffff,NULL_KEY);
			break;
	}
}

void TVSearchFunc(unsigned int key)
{
	switch(key){
		case LEFT_KEY:
			tvmode = TV_OFF;
			SaveKeyToBuff(REDRAW_KEY);
			WriteEepromBytes(TV_CURCHANNEL_ADDR,&CurTvChannel,1);
			break;
		case TV_CHECK_KEY:
			if(CurTvChannel > MAX_CHANNEL){
				
				SaveKeyToBuff(LEFT_KEY);
				SetTimerFunc(0,0);
				MuteOff();/*andy*/
				if(FirstSearchChannel)
					CurTvChannel = FirstSearchChannel;
				else
					CurTvChannel = MIN_CHANNEL;
				SetTvChannel(CurTvChannel);
			}
			else{   
                unsigned char ucSearch;
                MuteOn();/*andy*/
				SetTvChannel(CurTvChannel);
				ShowSearchBar(CurTvChannel);
				TvDelay();
				ucSearch = SearchPLLlock(tunerbuf);
				if(ucSearch){
					ShowLcdString(0x10,"UNLOCK");
					SetSkip(CurTvChannel,1);
//					SaveKeyToBuff(TV_CHECK_KEY);
					SetTimerFunc(TIME_250MS,TV_CHECK_KEY);
				}
				else{
					ShowLcdString(0x10,"LOCK");
					if(FirstSearchChannel==0)
						FirstSearchChannel = CurTvChannel;
					SetSkip(CurTvChannel,0);
					SetTimerFunc(TIME_250MS,TV_CHECK_KEY);
				}
				CurTvChannel++;
			}
			break;
	}
}

void TVFindFunc(unsigned int key)
{
	switch(key){
		case LEFT_KEY:
			if(find>0){
				find--;
				ShowFindBar(find);
			}
			SetTimerFunc(TIME_5SEC,SETUP_KEY);
			break;
		case RIGHT_KEY:
			if(find<40){
				find++;
				ShowFindBar(find);
			}
			SetTimerFunc(TIME_5SEC,SETUP_KEY);
			break;
		case SETUP_KEY:
		default:
			tvmode = TV_OFF;
			CLearOsdScreen(bCurrentLock);
			SetTvChannel(CurTvChannel);
			SetTimerFunc(0xffff,NULL_KEY);
			break;
	}
}

void TVOffFunc(unsigned int key)
{
	unsigned char uctemp;
//
	if(AudioToneMode){
		AudioToneDealFunc(key);
		return;
	}
	switch(key){
		case NUM0_KEY:
		case NUM1_KEY:
		case NUM2_KEY:
		case NUM3_KEY:
		case NUM4_KEY:
		case NUM5_KEY:
		case NUM6_KEY:
		case NUM7_KEY:
		case NUM8_KEY:
		case NUM9_KEY:
			input +=(key-NUM0_KEY);
			if(input>=MIN_CHANNEL&&input<=MAX_CHANNEL){
				CurTvChannel = input;
				if(!bMuteOn)
					PT2318MuteOn();
					TvDelay();
				SetTvChannel(CurTvChannel);
				if(!bMuteOn)
				        TvDelay();
					MuteOff();
			}
			ShowTVNumber(CurTvChannel);
			input = 0;
			break;
		case NUM10_KEY:
			if(input<(MAX_CHANNEL/10)*10)
				input += 10;
			else
				input = 0;
			ShowTVInputNumber(input);
			SetTimerFunc(TIME_3SEC,REDRAW_KEY);
			break;

		case TONE_KEY:
			AudioToneDealFunc(key);
		break;
		case MODE_KEY:
		case MUTE_KEY:
		case VERSION_KEY:
		case TEST_LCD_KEY:
		case BAND_KEY:
		case POWER_KEY:
			defDealKey(key);
		break;
		case VOL_UP_KEY:
		case VOL_DOWN_KEY:
			defDealKey(key);
			TVDisplayVol(volume);
		break;
		case DOWN_KEY:
			uctemp = GetPreChannel(CurTvChannel);
			if(uctemp!=0xff){
				if(!bMuteOn)
					PT2318MuteOn();
					TvDelay(); //andy 2004-6-9 20:08
				CurTvChannel = uctemp;
				SetTvChannel(uctemp);
				ShowTVNumber(CurTvChannel);
				WriteEepromBytes(TV_CURCHANNEL_ADDR,&CurTvChannel,1);
				if(!bMuteOn)
				        TvDelay();
					MuteOff();
			}
			}
			
		break;
		case UP_KEY:
			uctemp = GetNextChannel(CurTvChannel);
			if(uctemp!=0xff){
				if(!bMuteOn)
					PT2318MuteOn();
					TvDelay();
				CurTvChannel = uctemp;
				SetTvChannel(uctemp);
				ShowTVNumber(CurTvChannel);
				WriteEepromBytes(TV_CURCHANNEL_ADDR,&CurTvChannel,1);
				if(!bMuteOn)
				        TvDelay();
					MuteOff();
			}
			
		break;
		case SETUP_KEY:
			tvmode = TV_MENU;
			CLearOsdScreen(0);
			currentx = 0;
			SetCrystal(0);
			TVMenuDraw();
			SetTimerFunc(TIME_5SEC,SETUP_KEY);
		break;
		case REDRAW_KEY:
			if(bNeedSaveTone){
				bNeedSaveTone = 0;
				SaveTone();
			}
			CLearOsdScreen(bCurrentLock);
			FPOutString(0,"          ");
			ShowTVNumber(CurTvChannel);
			FPDisplayIcon(FP_INFO_TV,1);
			break;
		case INIT_KEY:
			MuteOff();
			ReadEepromBytes(TV_CURCHANNEL_ADDR,&CurTvChannel,1);
			if((CurTvChannel<MIN_CHANNEL)||(CurTvChannel>MAX_CHANNEL))
				CurTvChannel = MIN_CHANNEL;
			iic_WriteByte(IF_ADDR,0x02,0x44);

			SetTvChannel(CurTvChannel);
			ShowTVNumber(CurTvChannel);
			FPDisplayIcon(FP_INFO_TV,1);
			break;
		case DESIGNER_KEY:
			TVOutString(0,1,"Designed by Andy.Jiang",COLOR2);
			SetTimerFunc(TIME_10SEC,REDRAW_KEY);
			break;
		case PLL_LOCK_KEY:
			SetCrystal(bCurrentLock);
			break;
	}
}

void TVFunc(unsigned int key,unsigned char *para)
{
//	if(key == PLL_LOCK_KEY){
//		SetCrystal(bCurrentLock);
//	}

	switch(tvmode){
		case TV_OFF:
			TVOffFunc(key);
		break;
		case TV_MENU:
			TVMenuDealFunc(key);
		break;
		case TV_FIND:
			TVFindFunc(key);
		break;
		case TV_SEARCH:
			TVSearchFunc(key);
		break;
	}
}

⌨️ 快捷键说明

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