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

📄 hallcm.c

📁 威望公司MP3 + USB MCU 的参考软件
💻 C
字号:
/****************************************************************
*                      Viaon Technology (Suzhou) Co.,Ltd
*
*    Copyright 2007, Viaon Technology (Suzhou) Co.,Ltd,Suzhou,China
*                    All rights reserved.
*
*
* Filename:      	hallcm.c
*
* Programmer:    	Greg 
*
* Created: 	 	1/2/2008
*
* Description: 		public functions 
*              
*        
* Change History (most recent first):	2008.1.2
****************************************************************/
#include "config.h"
#include "common.h"
#include "va4010reg.h"
#include "hallcm.h"
//#include "libfat.h"
#include "libfatif.h"

#include "hallcmsplc502b.h"

#if(DIGITAL_SHOW == DIGITAL_SHOW_LCM)
//#include "8x5ascii.h"
#include "8x16ascii.h"
//#include "icon.h"
#include "mycaricon.h"

//when 24c08,61*16  when 24c64,96*16
BYTE nAsciiDot[ASCIIDOT_BUF_SIZE];//96*16
//CSB set as 0 always after reset

#ifdef ENABLE_START_SCREEN
void halLCMIcon(BYTE bCol, BYTE *buf)
{
	//MyCarDot
	BYTE i, j;
	BYTE data bEndCol = (bCol + MYCAR_WIDTH);
	BYTE * bpTmp;	

	if(bEndCol>128)
		bEndCol = 128;
		
	for(i=0; i<MYCAR_PAGES; i++){ 	//Page 0 -> page 3
		halLCMSPIInit();
		halLCMSPISend(0xb0+(3-(i+1)), FALSE);//Page address
		halLCMSPISend(0x10|(bCol>>4), FALSE);//Column address, high 4bits
		halLCMSPISend(0x00|(bCol&0x0f), FALSE);//Column address, low 4bits;	

		bpTmp = buf+i*MYCAR_WIDTH;
		for(j=bCol; j<bEndCol; j++){
			halLCMSPISend(*bpTmp, TRUE);
			bpTmp++;
		}

		for(j=bEndCol; j<128; j++){
			halLCMSPISend(0X00, TRUE);
		}		
	}
	
	return;
}
#endif

static void _halLCMWrite(BYTE bColum, BYTE bPage, BYTE* bChar, BYTE bLen)
{
	BYTE i;
	BYTE *bpTmp = bChar;

	halLCMSPIInit();
	halLCMSPISend(0xb0+(3-bPage), FALSE);//Page address
	halLCMSPISend(0x10|(bColum>>4), FALSE);//Column address, high 4bits
	halLCMSPISend(0x00|(bColum&0x0f), FALSE);//Column address, low 4bits;	
	for(i=0; i<bLen; i++)//FONT WIDTH
	{
		halLCMSPISend(*bpTmp, TRUE);
		bpTmp++;
	}

	return;
}


#if 1
void halLCMSPIInit(void)
{
//	LCM_CSB = 0;
	LCM_SCLK = 1;
//	LCM_CSB_OUT();
	LCM_SCLK_OUT();
	LCM_A0 = 0;
	LCM_A0_OUT();

	LCM_SDA_OUT();
//	LCM_CSB = 1;
}
#else
#define halLCMSPIInit()
#endif
void halLCMSPISend(BYTE byData, BOOL bFlag)
{
#if 0
	static BYTE data byBtCnt;
	byBtCnt = 8;
	LCM_CSB = 0;
	LCM_A0 = bData; // 1=data, 0=cmd
	LCM_SDA_OUT();
	do
	{
		if(byData & (0x01<<(byBtCnt-1)))
			LCM_SDA = 1;
		else
			LCM_SDA = 0;
		LCM_SCLK = 0; //low
		LCM_SCLK = 1; //high
		byBtCnt--;
	}while(byBtCnt > 0);
	LCM_CSB = 1;
#else
	BYTE data i;

//	LCM_A0_OUT();
	LCM_A0 = bFlag; // 1=data, 0=cmd

//	LCM_SDA_OUT();
//	LCM_SCLK_OUT();
//	LCM_CSB_OUT();

//	LCM_CSB = 0;
//	LCM_SCLK = 1;
	for(i=0; i<8; i++){
		if(byData & 0x80)
			LCM_SDA = 1;
		else
			LCM_SDA = 0;

		LCM_SCLK = 0; //low
		byData <<= 1;
		LCM_SCLK = 1; //high
	}
//	LCM_CSB = 1;

	return;
#endif
}

void halLCMInit()
{
	halLCMSPIInit();
#if 0
	halLCMSPISend(0x21, FALSE); //function set PD=0 H1=0 H0=1
	halLCMSPISend(0x14, FALSE); //set system bias, cur = 7
	halLCMSPISend(0x08, FALSE); //set DO=0, bit2=0, LSB on the top
	halLCMSPISend(0x82, FALSE); //Vop = 3.0V

	halLCMSPISend(0x20, FALSE); //function set PD=0 H1=0 H0=0
	halLCMSPISend(0x05, FALSE); //set Vlcd, prs=1
	halLCMSPISend(0x0C, FALSE); //set display type : Nomal display

	halLCMClear(0, 3);
#else
	UartOutText("-I-: LCM Init ! \r\n");
	halInitSplc502b();
	halSetSplc502b(0, 3, 0X00);//Clear screen 
#endif
}

//	0x0F,0x1F,0x10,0x13,0x13,0x1F,0x0F,0x00,  // -@-
//	0xE0,0xF0,0x10,0xD0,0xD0,0xD0,0x80,0x00,
//	MSB
//	0 0 0 0 0 0 0 0
//	0 0 0 0 0 0 0 0
//	0 0 0 0 0 0 0 0
//	0 1 1 1 1 1 0 0_
//	1 1 0 0 0 1 1 0
//	1 1 0 0 0 1 1 0
//	1 1 0 1 1 1 1 0
//	1 1 0 1 1 1 1 0__
//	1 1 0 1 1 1 1 0
//	1 1 0 1 1 1 0 0
//	1 1 0 0 0 0 0 0
//	0 1 1 1 1 1 0 0_
//	0 0 0 0 0 0 0 0
//	0 0 0 0 0 0 0 0
//	0 0 0 0 0 0 0 0
//	0 0 0 0 0 0 0 0
//

//	-@- 12x24, MSB on the top
/*
char at[] = {
	0x07,0x08,0x10,0x21,0x23,0x22,0x22,0x23,  // -@-
	0x11,0x08,0x07,0x00,0xFF,0x00,0xFF,0xFF,
	0x01,0x01,0x01,0xFF,0xFF,0x00,0xFF,0x00,
	0xE0,0x10,0x08,0x84,0x84,0x84,0x04,0x04,
	0x84,0x88,0x10,0x00
};

//	-@- 24x48
char at_big[] = {
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  // -@-
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x03,0x0F,0x1C,0x30,0x60,
	0x40,0xC0,0x81,0x81,0x82,0x82,0x82,0x41,
	0x43,0x22,0x38,0x0F,0x07,0x00,0x00,0x00,
	0x00,0x1F,0xFF,0xFF,0xC0,0x00,0x01,0x0F,
	0x3E,0xF0,0xC0,0x00,0x00,0x00,0x07,0xFF,
	0xFF,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,
	0x00,0xF8,0xFF,0xFF,0x03,0x00,0xFC,0xFF,
	0x03,0x01,0x01,0x03,0x07,0x1C,0xFF,0xFF,
	0x81,0x01,0x03,0x1E,0xF8,0xC0,0x00,0x00,
	0x00,0x00,0x80,0xE0,0xF0,0x78,0x1C,0x0E,
	0x86,0x87,0x83,0x03,0x03,0x03,0x03,0x86,
	0x86,0x8C,0x1C,0x30,0xE0,0x80,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
*/
void halLCMWriteData(BYTE byXAddr, BYTE byYAddr, BYTE* byData, BYTE byLen)
{
	BYTE data m;
	BYTE data byX, byY;
	BYTE * byCharData;
	BYTE data byCurChar;
	m = 0;
	byX = byXAddr;
	byY = byYAddr;

//	if(byData == NULL) return;
	
	while(m < byLen)
	{
		byCurChar = *(byData+m);
		if(byCurChar == 0x00){ //string terminate
			break;
		}
		//if((byCurChar > '~')||(byCurChar < ' '))	break;

		if((byCurChar > 'Z') && (byCurChar != '['))
		{
			if(byCurChar >  'z' || byCurChar < 'a')
				byCurChar = '-';
			else
				byCurChar -= 32;
		}
		byCharData = nAsciiDot + (byCurChar - 0x20)*16;//Got the dot map

		if(byX>120)//next page
		{
			break;
		}

		_halLCMWrite(byX, byY, byCharData, 8);

		byCharData = nAsciiDot + (byCurChar - 0x20)*16 + 8;//Got the dot map
		_halLCMWrite(byX, byY+1, byCharData, 8);
		
		byX += 8;//Move Column
		m++;
		
	}
}

#if 0
void halLCMWriteDataW(BYTE byXAddr, BYTE byYAddr, WORD* wData)
{
	BYTE byData[LFN_WORD_MAX+1];
	BYTE byCount = 0;
	WORD *wPtData = wData;
	while(*wPtData != 0)
	{
		if(*wPtData < 255)
		{
			byData[byCount++] = *wPtData;
		}
		wPtData++;
	}
	halLCMWriteData(byXAddr, byYAddr, byData, byCount);
}
#endif

#if 0
void halLCMICon(BYTE byXAddr, BYTE byIconID)
{
	BYTE *byData = NULL;
	switch(byIconID)
	{
#if 0
		case ICON_ID_USB:
			byXLen = 32;
			byData = nUSBIcon;
			break;
		case ICON_ID_SD:
			byXLen = 32;
			byData = nSDIcon;
			break;
#endif
		case ICON_ID_PLAY:
			byData = nPlayIcon;
			break;
		case ICON_ID_PAUSE:
			byData = nPauseIcon;
			break;	
		case ICON_ID_SPEAKER:
			byData = nSpeakerIcon;
			break;
		case ICON_ID_ATH:
			byData = nAthIcon;
			break;
		default:
			return;
	}
//	if(byData != NULL)
//	{
		halLCMSPIInit();
		halLCMSPISend(0x80 | byXAddr, FALSE);
		halLCMSPISend(0x45, FALSE);
		for(n = 0; n < 7; n++)
		{
			halLCMSPISend(*byData, TRUE);
			byData++;
		}
//	}
}
#endif
void halLCMClear(BYTE byStart, BYTE byEnd) //range 0 - 3 line
{
#if 0
	BYTE data i;

	while(byStart <= byEnd)
	{
		halLCMSPIInit();

		halLCMSPISend(0xb0+byStart, FALSE);//Page address
		halLCMSPISend(0x10, FALSE);//Column address, high 4bits
		halLCMSPISend(0x00, FALSE);//Column address, low 4bits;	
		
		for(i = 0; i < 128; i++)
		{
			halLCMSPISend(0x00, TRUE);
		}
		byStart++;
	}
#else
	byStart = 3 - byStart;
	byEnd = 3 - byEnd;
	
	//halSetSplc502b(byStart, byEnd, 0x00);
	halSetSplc502b(byEnd, byStart, 0x00);
#endif

	return;
}

//FONT Enlarge: 8*16 -> 16*32
static BYTE FontBuf[4][16];
static void _halLCMFontConv(BYTE *bpFont)
{
	BYTE bTmp;
	BYTE i;
	BYTE j;
	BYTE k;
	WORD data wTmp;
	BYTE * data bpTmp = bpFont;
	BYTE * data bpTarget = FontBuf[0];

	for(k=0; k<2; k++){
		for(i=0; i<8; i++){
			bTmp = *bpTmp;
			wTmp = 0x00;
			for(j=0; j<8; j++){ 
				wTmp <<= 2;
				if(bTmp&0x80){				
					wTmp |= 0x03;			
				}

				bTmp <<= 1;		
			}
			FontBuf[(k<<1)+0][(i<<1)+1] = FontBuf[(k<<1)+0][(i<<1)+0] = (BYTE)(wTmp>>8);			
			FontBuf[(k<<1)+1][(i<<1)+1] = FontBuf[(k<<1)+1][(i<<1)+0] = (BYTE)(wTmp&0xff);			
			
			bpTmp++;
		}
	}
	
	return;
}

#if 0
void halFontTest(void)
{
	static BYTE CharIdx = 0;
	BYTE *bpCharData;
	BYTE i;
	BYTE byX, byY;

	halLCMClear(0, 3);

	bpCharData = nAsciiDot + CharIdx*16;//Got the dot map
	CharIdx ++;
	if(CharIdx >= ASCII_NUM)
		CharIdx = 0;

	_halLCMFontConv(bpCharData);

	byX = 8;//Column
	for(i=0; i< 4; i++){
		_halLCMWrite(byX, i, FontBuf[i], 16);//Page i: from 0 to 3

	}

	return;
}
#endif

//Page address is default to zero.
void halLCMWriteBig(BYTE byXAddr, BYTE* byData, BYTE byLen)
{
	BYTE data i;
	BYTE data m;
	BYTE data byX;
	BYTE * byCharData;
	BYTE data byCurChar;
	
	m = 0;
	byX = byXAddr;
	//byY = 0;

//	if(byData == NULL) return;
	
	while(m < byLen)
	{
		byCurChar = *(byData+m);
		if(byCurChar == 0x00){ //string terminate
			break;
		}
		//if((byCurChar > '~')||(byCurChar < ' '))	break;

		if(byCurChar > 'Z')
		{
			if(byCurChar >  'z' || byCurChar < 'a')
				byCurChar = '-';
			else
				byCurChar -= 32;
		}

		if(byX>120)//next page
		{
			break;
		}

		byCharData = nAsciiDot + (byCurChar - 0x20)*16;//Got the dot map
		_halLCMFontConv(byCharData);
		for(i=0; i< 4; i++){
			_halLCMWrite(byX, i, FontBuf[i], 16);//Page i: from 0 to 3

		}
		
		byX += 16;//Move Column
		m++;		
	}
	
	return;
}
#endif

⌨️ 快捷键说明

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