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

📄 display.c

📁 汽车音响lcd显示 #include "pt6524.c" #include "pt6578.c"
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "global.h"
#define __DECL_DISPLAY__
//根据不同的显示屏定义不同的引用
#if defined(LCD_353)
	#define __DECL_LCD353__
#elif defined(LCD_393)
	#define __DECL_LCD393__
#elif defined(LCD_392)
	#define __DECL_LCD392__
#elif defined(LCD_316)
	#define __DECL_LCD316__
#elif defined(LCD_888)
	#define __DECL_LCD888__
#elif defined(LCD_393)
	#define __DECL_LCD393__
#elif defined(LCD_381)
	#define __DECL_LCD381__
#elif defined(LCD_1501)
	#define __DECL_LCD1501__
#else
	#error
#endif
#include "system.h"
//#include <stdarg.h>
extern char *ptyName[];
extern BYTE cur_pty;
extern BYTE currentTrack;
extern BYTE currentTrack100;
//for TFT display, parameter is: 
//(BYTE *disp_buff,char* src_buff,char start,char len,char x, char y, char fontsize)
//#define READMEMBYTE(a,char_ptr)	((a)?(pgm_read_byte(char_ptr)):(*char_ptr))
/*
	//从eeprom读取string并显示
  */
void disp_string_E(BYTE *thisBuff, char *eepAddress,char start,char len)
{
	char tmpBuff[9];
	strcpy_E(tmpBuff,eepAddress);
	disp_string(thisBuff,tmpBuff,start,len);
}
void disp_string(BYTE *thisBuff,char *str,char start,char len)
{
	BYTE i=start;
	while(i<=DISP_MAX_CHAR && (*str!=0))
	{
		disp_char(thisBuff,i,*str++);
		i++;
	}
	while(i<(start+len))
	{
		disp_char(thisBuff,i,' ');
		i++;
	}
}
//void disp_string_E(BYTE *thisBuff,char *str,char start,char len)
//{
//	BYTE i=start;
//	char c;
//	do{
//		eeprom_busy_wait();
//		c = eeprom_read_byte(str++);
//		i++;
//	}while((i<DISP_MAX_CHAR) && c);
//
////	while(i<DISP_MAX_CHAR && (*str!=0))
////	{
////		disp_char(thisBuff,i,*str++);
////		i++;
////	}
//	while(i<(start+len))
//	{
//		disp_char(thisBuff,i,' ');
//		i++;
//	}
//}

void disp_bool(UINT16 flag)
{
	if(flag)
		//disp_string(tmpDispBuff,"ON ",6,3);
		disp_string_E(tmpDispBuff,strOn,6,3);
	else
		//disp_string(tmpDispBuff,"OFF",6,3);
		disp_string_E(tmpDispBuff,strOff,6,3);
}

/*LCD显示函数,调用以后将全局变量数组BUFF[]里面的数据放到LCD里面去显示*/
#ifdef PT6524
#include "pt6524.c"
#elif defined(PT6523)
#include "pt6523.c"
#elif defined(PT6578)
#include "pt6578.c"
#endif
//将thisBuff的第data个bit置位

#if defined(LCD_353)
	void disp_char(BYTE *thisBuff,BYTE pos,BYTE asc)
	{
		BYTE first_byte;
		UINT32 viewLittle = 0x3FFB;
		if(asc>='a' && asc<='z')	//小写转换成大写
			asc -= 0x20;
		if((asc>='A') && (asc<='Z'))
		{
			asc -= ASCII_CHR;
		}else{
			if((asc>='0') && (asc<='9'))
			{
				asc -= ASCII_NUM;
			}else{
				switch(asc)
				{
				case '*':
					asc = LED_STAR;
					break;
				case '+':
					asc = LED_POSITIVE;
					break;
				case '-':
					asc = LED_MINUS;
					break;
				default:
					if(pos<9)
						asc = LED_CLR;
					else
						asc = LED_CLR_S;
					break;
				}
			}
		}
		if ( (pos<=8) && (pos>0) ) {
			first_byte=(15*pos-9)/8;
			UINT32 * viewAddr =(UINT32 *)(thisBuff+first_byte);
			*viewAddr &= ~(viewLittle<<(7-pos%8));
			viewLittle &= pgm_read_word(font+asc);
			*viewAddr |= (viewLittle<<(7-pos%8));//for test
		}else if (pos==9) { 
			thisBuff[15] &= 0x3F;	//'0011 1111'
			thisBuff[16] &= 0xC1;	//'1100 0001'
			thisBuff[15] |= (pgm_read_byte(font2+asc)<<6);
			thisBuff[16] |= (pgm_read_byte(font2+asc)>>2);
		}else if (pos==10) {
			thisBuff[16] &= 0x7F;	//'0111 1111'
			thisBuff[17] &= 0x82;	//'1000 0010'
			thisBuff[16] |= (pgm_read_byte(font2+asc)<<7);
			thisBuff[17] |= (pgm_read_byte(font2+asc)>>1);
		}
	}
#elif defined(LCD_393)
	//x:写入位置,从0开始计,最左边为0,共12字符,最右边为11
	void disp_char(BYTE *buff,BYTE pos,BYTE asc)
	{
		BYTE i;
		BYTE fontIndex;
		char fontData;
		if(asc>'z' || asc<' ')
			asc = ' ';
		asc = asc - ' ';
		for(i=0;i<FONT_COLS;i++)//将字库数据拷贝到发送缓冲区
		{
			fontIndex = pgm_read_byte(fontPos[0] + (pos-1)*FONT_COLS + i);//获取字库下标
			fontData = pgm_read_byte(font5x7[0] + asc*FONT_COLS + i);//读取字库点阵
			buff[fontIndex] &= 0x80;
			buff[fontIndex] |= fontData;
		}
	}
#elif defined(LCD_392)
	void disp_char(BYTE *thisBuff,BYTE pos,BYTE asc)
	{
		BYTE first_byte;
		unsigned char i;
		UINT32 viewLittle = 0x3FFB;
		if(asc>='a' && asc<='z')	//小写转换成大写
			asc -= 0x20;
		if((asc>='A') && (asc<='Z'))
		{
			asc -= ASCII_CHR;
		}else{
			if((asc>='0') && (asc<='9'))
			{
				asc -= ASCII_NUM;
			}else{
				switch(asc)
				{
				case '*':
					asc = LED_STAR;
					break;
				case '+':
					asc = LED_POSITIVE;
					break;
				case '-':
					asc = LED_MINUS;
					break;
				case ' ':
					if(pos<9)
						asc = LED_CLR;
					else
						asc = LED_CLR_S;
					break;
				default:
					asc = 0;
				}
			}
		}
		BYTE littleMap[7] = {
			LCD_BIT_9A,
			LCD_BIT_9B,	
			LCD_BIT_9C,
			LCD_BIT_9D,
			LCD_BIT_9E, 
			LCD_BIT_9F,
			LCD_BIT_9G,
		};
		if ( (pos<9) && (pos>0) ) {
			first_byte=(15*pos-9)/8; 
			UINT32 * viewAddr =(UINT32 *)(thisBuff+first_byte);
			*viewAddr &= ~(viewLittle<<(10-pos%8));
			viewLittle &= pgm_read_word(font+asc);//font[asc];
			*viewAddr |= (viewLittle<<(10-pos%8));//for test
		}else if (pos==9) { 
			for(i=0;i<7;i++) {
				disp_set_bit(thisBuff,littleMap[i],(pgm_read_byte(font2+asc) & (1<<i)));
			}	
		}
	}
#elif defined(LCD_888)
/************************************************************************/
/* 这个字符生成的算法只能在888的屏幕上使用                              */
/* 基本的工作方法就是将LED所占的位清除,然后将字库数据或上去			*/
/************************************************************************/
	void disp_char(BYTE *thisBuff,BYTE pos,BYTE asc)
	{
		BYTE temp;			//临时变量,用来保存正在操作的thisBuff的下标
		UINT16 charMap;
		if(asc>='a' && asc<='z')	//小写转换成大写
			asc -= 0x20;
		if((asc>='A') && (asc<='Z'))
		{
			asc -= ASCII_CHR;
		}else{
			if((asc>='0') && (asc<='9'))
			{
				asc -= ASCII_NUM;
			}else{
				switch(asc)
				{
				case '*':
					asc = LED_STAR;
					break;
				case '+':
					asc = LED_POSITIVE;
					break;
				case '-':
					asc = LED_MINUS;
					break;
				case ' ':
					if(pos<11)
						asc = LED_CLR;
					else
						asc = LED_CLR_S;
					break;
				default:
					asc = 0;
				}
			}
		}

	temp = pgm_read_byte(ledBeginChar+pos-1);

	switch(pos)
	{
	case 1:
	case 7:
		charMap = pgm_read_word(font1+asc);	//获得字库数据
		thisBuff[temp] &= ~0x60;	//清除对应LED位置的所有数据
		thisBuff[temp] |= ((charMap<<4) & 0x60);	//将字库或上去
		temp++;
		thisBuff[temp] = charMap>>4;	//因为此8位数据全部是LED的数据,所以直接赋值
		temp++;
		thisBuff[temp] &= ~0x07;	//清除对应LED位置的所有数据
		thisBuff[temp] |= ((charMap>>12) & 0x07); //将字库或上去
		break;
	case 4:
	case 6:
	case 10:
		charMap = pgm_read_word(font2+asc);
		thisBuff[temp] &= ~0xF0;
		thisBuff[temp] |= ((charMap<<4) & 0xF0); 
		temp++;
		thisBuff[temp] &= ~0xF7;
		thisBuff[temp] |= ((charMap>>4) & 0xF7);
		temp++;
		thisBuff[temp] &= ~0x09;
		thisBuff[temp] |= ((charMap>>12) & 0x09);
		break;
	case	5	:
		charMap = pgm_read_word(font1+asc);
		thisBuff[25] &= ~0x06;
		thisBuff[25] |= (charMap& 0x06);

		thisBuff[0] = charMap>>4; 
		thisBuff[1] &= ~0x07;
		thisBuff[1] |= ((charMap>>12) & 0x07);
		break;

	case	3	:
	case	9	:	
		charMap = pgm_read_word(font1+asc);
		thisBuff[temp] &= ~0xF6;
		thisBuff[temp] |=  (charMap & 0xF6);
		thisBuff[temp+1]  &= ~0x7F;
		thisBuff[temp+1]  |= ((charMap>>8)&0x7F);
		break;	

	case	2	:
	case	8	:
		charMap = pgm_read_word(font2+asc);
		thisBuff[temp] &= ~0x7F;
		thisBuff[temp] |=  (charMap & 0x7F);
		thisBuff[temp+1]  &= ~0x9F;
		thisBuff[temp+1]  |= ((charMap>>8)&0x9F);
		break;

	case	11	:
		charMap = pgm_read_byte(font3+asc);
		thisBuff[15] &= ~0xF0;
		thisBuff[15] |= charMap<<4;
		thisBuff[16] &= ~0x07;
		thisBuff[16] |= (charMap>>4)&0x07;
		break;
	default:
		break;
	}
	}
#elif defined(LCD_381)
void disp_char(unsigned char *buff ,unsigned char font,unsigned char addr)
{
	unsigned char i;
	unsigned char bitMap;//用来记录从fontMap中读取出来的数据
	unsigned int fontValue;//用来保存获得的字库数据

	fontValue = pgm_read_word(view2+font);//获得字库

	for (i=0;i<14;i++) {
		bitMap = pgm_read_byte(fontMap[addr]+i);
		if (bitMap) {	//如果这个笔画需要写入
			if (fontValue&(0x0001<<i)) {//如果需要写入1
				disp_set_bit(buff,bitMap,1);
			}else{
				disp_set_bit(buff,bitMap,0);
			}
		}
	}
}
#elif defined(LCD_316)
void disp_char(unsigned char *buff ,unsigned char pos,unsigned char asc)
{
	unsigned char i;
	unsigned char bitMap;//用来记录从fontMap中读取出来的数据
	unsigned int fontValue;//用来保存获得的字库数据
	pos--;
	//BYTE first_byte;
		//UINT32 viewLittle = 0x3FFB;
		if(asc>='a' && asc<='z')	//小写转换成大写
			asc -= 0x20;
		if((asc>='A') && (asc<='Z'))
		{
			asc -= ASCII_CHR;
		}else{
			if((asc>='0') && (asc<='9'))
			{
				asc -= ASCII_NUM;
			}else{
				switch(asc)
				{
				case '*':
					asc = LED_STAR;
					break;
				case '+':
					asc = LED_POSITIVE;
					break;
				case '-':
					asc = LED_MINUS;
					break;
				case ' ':
					if(pos<12)
						asc = LED_CLR;
					else
						asc = LED_CLR_S;
					break;
				default:
					asc = 0;
				}
			}
		}
	fontValue = pgm_read_word(font1+asc);//获得字库

	for (i=0;i<14;i++) {
		bitMap = pgm_read_byte(fontMap[pos]+i);
		if (bitMap) {	//如果这个笔画需要写入
			if (fontValue&(0x0001<<i)) {//如果需要写入1
				disp_set_bit(buff,bitMap,1);
			}else{
				disp_set_bit(buff,bitMap,0);
			}
		}
	}
}
#elif defined(LCD_1501)
void disp_char(unsigned char *buff ,unsigned char addr,unsigned char font)
{
	unsigned char i;
	unsigned char bitMap;//用来记录从fontMap中读取出来的数据
	unsigned int fontValue;//用来保存获得的字库数据

	fontValue = pgm_read_word(font1+font);//获得字库

	for (i=0;i<14;i++)
	{
		bitMap = pgm_read_byte(fontMap[addr]+i);
		if (fontValue&(0x0001<<i)) 
		{//如果需要写入1
			showSignal(buff,bitMap,1);
		}else{
			showSignal(buff,bitMap,0);
		}
	}
}
#endif 

void disp_clr_led(BYTE *thisBuff)	
//	clean out signal in LEDs,and clean signals like “.”among LEDs
{
	BYTE i;
	for(i=1;i<=LCD_CHAR_COUNTS;i++)
	{
		disp_char(thisBuff,i,' ');		//将所有数码管里面的数据清除
	}
#if defined(PT6523) || defined(PT6524)
	disp_set_bit(thisBuff,LCD_BIT_DOT,OFF);
#endif
#ifdef LCD_BIT_COL1
	disp_set_bit(thisBuff,LCD_BIT_COL1,OFF);
#endif
#ifdef LCD_BIT_COL2
	disp_set_bit(thisBuff,LCD_BIT_COL2,OFF);
#endif
#ifdef LCD_BIT_DP1
	disp_set_bit(thisBuff,LCD_BIT_DP1,OFF);
#endif
#ifdef LCD_BIT_DP2
	disp_set_bit(thisBuff,LCD_BIT_DP2,OFF);
#endif
}
#if defined(DISP_DISC_RUN_LOGO)
void disp_disc_run(void)
{
	if(halfSecond&0x01)
	{
		disp_set_bit(dispBuff,LCD_BIT_RUN1,ON);
		disp_set_bit(dispBuff,LCD_BIT_RUN2,OFF);
		disp_set_bit(dispBuff,LCD_BIT_RUN3,OFF);
		disp_set_bit(dispBuff,LCD_BIT_RUN4,ON);
	}else{
		disp_set_bit(dispBuff,LCD_BIT_RUN1,OFF);
		disp_set_bit(dispBuff,LCD_BIT_RUN2,ON);
		disp_set_bit(dispBuff,LCD_BIT_RUN3,ON);
		disp_set_bit(dispBuff,LCD_BIT_RUN4,OFF);
	}
}
#endif
/****	显示FM的频率数据在数码管的第FM_TEXT_H到FM_TEXT_001位						****/
void disp_FM_data(BYTE *thisBuff,UINT16 freq)
{
	BYTE i=0;
	BYTE dispData=0;
	//传入的freq单位为K赫兹,显示的单位为M赫兹,精确到小数点后两位0.05
	if(freq>=10000)
	{
		disp_char(thisBuff,DISP_FM_VALUE,ASCII_NUM+1);		//写百位数,等于0则不写
		freq-=10000;
	}
#if defined(PT6523) || defined(PT6524)
	for(i=4;i>0;i--)	//must be 8750~9999
	{
		dispData = (freq%10);
		disp_char(thisBuff,DISP_FM_VALUE+i,ASCII_NUM+dispData);	//其他位
		freq = freq/10;
	}
#ifdef DISP_RADIO_UNIT
	disp_string(dispBuff,"MHZ",DISP_RADIO_UNIT,3);

#endif
#elif defined(PT6578)
	for(i=5;i>0;i--)	//must be 8750~9999
	{
		if(i!=3)
		{
			dispData = (freq%10);
			disp_char(thisBuff,DISP_FM_VALUE+i,ASCII_NUM+dispData);	//其他位
			freq = freq/10;
		}else{
			disp_char(thisBuff,DISP_FM_VALUE+i,'.');	//'.'
		}
	}
#else
#error
#endif
}
/*******************************dispAMData**********************************************/
/****	显示AM的频率数据在数码管的第AM_TEXT_S到AM_TEXT_G位							****/
void disp_AM_data(BYTE *thisBuff,UINT16 freq) 
{
	BYTE i,dispData;
	if(freq>=1000)
	{
		disp_char(thisBuff,DISP_AM_VALUE,ASCII_NUM+1);	//写千位数
		freq-=1000;
	}

	for(i=3;i>0;i--)	//must be 8750~9999
	{
		dispData = (freq%10);
		disp_char(thisBuff,DISP_AM_VALUE+i,ASCII_NUM+dispData);			//其他
		freq = freq/10;
	}
#ifdef DISP_RADIO_UNIT
	disp_string(dispBuff,"KHZ",DISP_RADIO_UNIT,3);
	//disp_string_E(dispBuff,strKHZ,DISP_RADIO_UNIT,3);
#endif
}

/*******************************dispTime**************************************************/
/*显示时间:将时间显示在第5,6:7,8四个数码管里面											 */
/*																						 */
//显示当前时间在传入的数组里面
//参数colonFlag=0时显示冒号,为1时不显示冒号()
//参数dspFlag=0时显示所有数据,=1(HOUR_CHANGE)时将不显示小时
//=2(MINUTE)时将不显示分钟
void disp_time(BYTE *thisBuff,BYTE *time,BYTE colonFlag)
{
	BYTE dispData[4];
	BYTE tmpTime;
	if((regionIndex==REGION_USA) || (regionIndex==REGION_LATIN) || (regionIndex==REGION_JAPAN))
	{
		if(*time>12)
			tmpTime = *time-12;
		else
			tmpTime = *time;
		if(tmpTime==0)
			tmpTime=12;
	}else{//other
		tmpTime = *time;
	}
	
	dispData[0] = tmpTime/10;				//小时的十位;
	dispData[1] = tmpTime%10;				//小时的个位

	dispData[2] = (*(time+1))/10;			//分钟的十位
	dispData[3] = (*(time+1))%10;			//分钟的个位
	if((regionIndex==REGION_USA) || (regionIndex==REGION_LATIN) || (regionIndex==REGION_JAPAN))
	{
		if(*time<12)
			//disp_string(thisBuff,"AM",DISP_AMPM,2);

⌨️ 快捷键说明

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