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

📄 lcd_old.c

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


//1621 is 32X4 LCD controller
#define LCD_BUF_SIZE			16

void WriteLcdData(unsigned char addr,unsigned char ucdata);

unsigned char idata FpChar[NUM_SEGMENT];
unsigned char idata LcdBuf[LCD_BUF_SIZE];
unsigned char idata LcdBufBak[LCD_BUF_SIZE];
//flash attribute for charactor
unsigned short idata uiAttribute = 0;
bit bFlashOn = 0;

unsigned char code Led_Array[]={
//number
	VALUE0,VALUE1,VALUE2,VALUE3,VALUE4,
	VALUE5,VALUE6,VALUE7,VALUE8,VALUE9,
//character
	CHAR_A,CHAR_B,CHAR_C,CHAR_D,CHAR_E,CHAR_F,
	CHAR_G,CHAR_H,CHAR_I,CHAR_J,CHAR_K,CHAR_L,
	CHAR_M,CHAR_N,CHAR_O,CHAR_P,CHAR_Q,CHAR_R,
	CHAR_S,CHAR_T,CHAR_U,CHAR_V,CHAR_W,CHAR_X,
	CHAR_Y,CHAR_Z,
	CHAR_SPACE
};

void FPDisplayIcon(unsigned int icondata,unsigned char bOn)
{
	unsigned char grid = (icondata>>8);
	unsigned char segment;

	if(grid>=LCD_BUF_SIZE)
		return;
	segment = icondata;
	if(bOn){
		LcdBuf[grid] |= segment;
	}
	else{
		LcdBuf[grid] &= (~segment);
	}
}

void FPOutChar(unsigned char addr,char ucchar)
{
	code unsigned char pos_array[NUM_SEGMENT] ={
		0x01,0x02,0x03,0x04,0x07,0x08,0x09,0x0A,0x0B,0x0C
	};
	unsigned char grid_pos = pos_array[addr];
	unsigned char uctemp;

	if(ucchar>='0'&&ucchar<='9')
		uctemp = Led_Array[ucchar-'0'];
	else if(ucchar>='A'&&ucchar<='Z')
		uctemp = Led_Array[ucchar-'A'+10];
	else if(ucchar>='a'&&ucchar<='z')
		uctemp = Led_Array[ucchar-'a'+10];
	else{
		switch(ucchar){
			case '-':
				uctemp = CHAR_DOT;
			break;
			default:
				uctemp = 0;
			break;
		}
	}
//error,we will do nothing.
	if(addr>=NUM_SEGMENT)
		return;
	FpChar[addr] = ucchar;

	LcdBuf[grid_pos]  &= 0xF1;
	LcdBuf[grid_pos]  |= (uctemp&0x0E);

	grid_pos--;
	LcdBuf[grid_pos]  &= 0x0F;
	LcdBuf[grid_pos]  |= (uctemp&0xF0);
}

void FPOutString(unsigned char addr,char *str)
{
	while(addr<NUM_SEGMENT){
		if(*str)
			FPOutChar(addr,*str);
		else
			break;
		addr++;
		str++;
	}
}

void FpClearStr()
{
	unsigned char i;
	for(i=0;i<NUM_SEGMENT;i++){
		FPOutChar(i,' ');
	}
}

void FPClearLcd()
{
	unsigned char i;
	for(i=0;i<LCD_BUF_SIZE;i++){
		LcdBufBak[i] = 0xff;
		LcdBuf[i] = 0;
	}
}

void FpDisplayVol(unsigned char vol)
{
	FPClearLcd();
	FPOutString(0,"VL        ");
	FPDisplayIcon(FP_INFO_DOT_MIN1,0);
	FPOutChar(5,vol/10+'0');
	FPOutChar(6,vol%10+'0');
}

void FpDisplayToneValue(unsigned char ucvalue)
{
	if(ucvalue<12){
		FPOutChar(4,'-');
		FPOutChar(5,(12-ucvalue)/10+'0');
		FPOutChar(6,(12-ucvalue)%10+'0');

#ifdef __EMULATOR_H__
		ShowLcdChar(4,'-');
		ShowLcdChar(5,(12-ucvalue)/10+'0');
		ShowLcdChar(6,(12-ucvalue)%10+'0');
#endif
	}
	else{
		FPOutChar(5,(ucvalue-12)/10+'0');
		FPOutChar(6,(ucvalue-12)%10+'0');

#ifdef __EMULATOR_H__
		ShowLcdChar(5,(ucvalue-12)/10+'0');
		ShowLcdChar(6,(ucvalue-12)%10+'0');
#endif
	}
	FPDisplayIcon(FP_INFO_DOT_MIN1,0);
	SetTimerFunc(TIME_5SEC,REDRAW_KEY);
}

void FpDisplayBass(unsigned char ucvalue)
{
	FPClearLcd();
	FPOutString(0,"BA        ");
#ifdef __EMULATOR_H__
	ShowLcdString(0,"BA        ");
#endif
	FpDisplayToneValue(ucvalue);
}

void FpDisplayTreble(unsigned char ucvalue)
{
	FPClearLcd();
	FPOutString(0,"Tr        ");
#ifdef __EMULATOR_H__
	ShowLcdString(0,"Tr        ");
#endif
	FpDisplayToneValue(ucvalue);
}

void FpDisplayBalance(unsigned char ucvalue)
{
	FPClearLcd();
	FPOutString(0,"BL        ");
#ifdef __EMULATOR_H__
	ShowLcdString(0,"BL        ");
#endif
	FpDisplayToneValue(ucvalue);
}

void FpDisplayFade(unsigned char ucvalue)
{
	FPClearLcd();
	FPOutString(0,"Fa        ");
#ifdef __EMULATOR_H__
	ShowLcdString(0,"Fa         ");
#endif
	FpDisplayToneValue(ucvalue);
}

void FlashFpChar()
{
	unsigned char i;
	unsigned short mask = 1;
	bFlashOn = !bFlashOn;
	for(i=0;i<NUM_SEGMENT;i++){
		if(uiAttribute&mask){
			if(bFlashOn)
				FPOutChar(FpChar[i],i);
			else if(FpChar[i]==' ')
				FPOutChar('_',i);
			else
				FPOutChar(' ',i);
		}
		mask <<= 1;
	}
}

//this function should been called by the main task.
void UpdateLcd()
{
	unsigned char i;
	if(uiAttribute)
		FlashFpChar();
//adjust the buffer have changed?if not I will return directly.
	for(i=0;i<LCD_BUF_SIZE;i++){
		if(LcdBufBak[i]!=LcdBuf[i])
			break;
	}
	if(i>=LCD_BUF_SIZE)
		return;
//changed,I will update it.
	for(i=0;i<LCD_BUF_SIZE;i++){
		if(LcdBufBak[i]!=LcdBuf[i]){
			WriteLcdData(i,LcdBuf[i]);
			LcdBufBak[i]=LcdBuf[i];
		}
	}
}


⌨️ 快捷键说明

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