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

📄 showlcd.c

📁 C8051F020单片机开发板演示程序
💻 C
字号:
/************************************************************************************
*  Copyright (c), 2004-2007,西安铭朗电子科技有限责任公司
*            All rights reserved.
*
* Http:  www.mlarm.com
* Email: mlarm@mlarm.com
*
* File name: ShowLCD.c
*
* Project  : ML-F020ICB
* Processor: C8051F020
* Compiler : Keil C51 Compiler
* 
* Author:  EagleC
* Version: 1.00
* Date:    2007.07.05
* Email:   
* 
* Description: 本文件是各个子模块的LCD显示部分
*
* Others: none;
*
* Function List:
*
* History:
*   1. Author:       Eagle Cao
*	   Version: 	 1.00
*      Date:         2007.07.05
*      Modification: 建立文件
*
*************************************************************************************/


/************************************************************************************/
// 引用外部头文件
#include  "driver.h"
#include  "api.h"
#include  "def.h"
#include  "ShowLCD.h"

/************************************************************************************/
// 常量及全局变量定义
/************************************************************************************/
unsigned char code ASCII[16] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
extern unsigned char	g_nOldSecond;		//前一秒数值,用于比较秒位是否更新了
extern RTC_TIME			g_stRtctime;		//当前RTC

extern unsigned char	g_bItem1Sel;		//1级菜单是否被选中
extern unsigned char	g_nItem1Sel;		//1级菜单在第几项
extern unsigned char	g_nItem2Sel;		//2级菜单在第几项
extern unsigned char code HZ_MING_32X32[72];
extern unsigned char code HZ_LANG_32X32[72];
extern unsigned char code HZ_KE_32X32[72];
extern unsigned char code HZ_JI_32X32[72];


//显示主界面
void ShowMain(void)
{
	LCDB_ClearScreen();// 清屏
	Show_Title();// 标题
//	Show_RtcAndTmp(RTC_BEGIN_X);// RTC and Tmp
	// 菜单
	Show_Item1();
	Show_Item2();
	Show_ItemSel();
}

//显示菜单选择情况
void Show_ItemSel(void)
{
	unsigned char nX; 
	unsigned int nY;
	unsigned char *pItem;
	pItem = "  ";
	nY=MENU_BEGIN_1SELY;
	for(nX=MENU_BEGIN_X;nX<=MENU_BEGIN_X+MENU_XSPACING*4;nX+=MENU_XSPACING)
		LCDB_DispFWord(nX, nY,pItem);
	nY=MENU_BEGIN_2SELY;
	for(nX=MENU_BEGIN_X;nX<=MENU_BEGIN_X+MENU_XSPACING*4;nX+=MENU_XSPACING)
		LCDB_DispFWord(nX, nY,pItem);
	
	if(g_bItem1Sel)//一级菜单被选中
	{
		nX = (g_nItem1Sel-1)*MENU_XSPACING+MENU_BEGIN_X;
		nY=MENU_BEGIN_1SELY;
		pItem = "◆";
		LCDB_DispFWord(nX, nY,pItem);
		nY=MENU_BEGIN_2SELY;
		pItem = "→";
		switch(g_nItem1Sel)
		{
		case 1:
			nX = (g_nItem2Sel-1)*MENU_XSPACING+MENU_BEGIN_21X;
			LCDB_DispFWord(nX, nY,pItem);
			break;
		case 2:
			nX = (g_nItem2Sel-1)*MENU_XSPACING+MENU_BEGIN_22X;
			LCDB_DispFWord(nX, nY,pItem);
			break;
		case 3:
			nX = (g_nItem2Sel-1)*MENU_XSPACING+MENU_BEGIN_23X;
			LCDB_DispFWord(nX, nY,pItem);
			break;
		}
	}
	else
	{
		nX = (g_nItem1Sel-1)*MENU_XSPACING+MENU_BEGIN_X;
		nY=MENU_BEGIN_1SELY;
		pItem = "→";
		LCDB_DispFWord(nX, nY,pItem);
	}
}

//显示1级菜单
void Show_Item1(void)
{
	unsigned char *pItem;
	pItem = "一: 实时监测";
	LCDB_DispFWord(MENU_BEGIN_X+MENU_XSPACING*0, MENU_BEGIN_1Y,pItem);
	pItem = "二: 系统设置";
	LCDB_DispFWord(MENU_BEGIN_X+MENU_XSPACING*1, MENU_BEGIN_1Y,pItem);
	pItem = "三: 系统测试";
	LCDB_DispFWord(MENU_BEGIN_X+MENU_XSPACING*2, MENU_BEGIN_1Y,pItem);
	pItem = "四: 帮助说明";
	LCDB_DispFWord(MENU_BEGIN_X+MENU_XSPACING*3, MENU_BEGIN_1Y,pItem);
}

//显示2级菜单
void Show_Item2(void)
{
	unsigned char nX; 
	unsigned int nY;
	unsigned char *pItem;
	// 清除2级菜单
	pItem = "  ";
	for(nX=MENU_BEGIN_X;nX<XMAX;nX+=16)
		for(nY=MENU_BEGIN_2Y;nY<YMAX;nY+=16)
			LCDB_DispFWord(nX,nY,pItem);
	
	switch(g_nItem1Sel)
	{
	case 1:
		nX = MENU_BEGIN_21X;
		nY = MENU_BEGIN_2Y;
		pItem = "1 : AD监测";
		LCDB_DispFWord(nX+MENU_XSPACING*0, nY,pItem);
		pItem = "2 : DA监测";
		LCDB_DispFWord(nX+MENU_XSPACING*1, nY,pItem);
		pItem = "3 : IO监测";
		LCDB_DispFWord(nX+MENU_XSPACING*2, nY,pItem);
		pItem = "4 : 隔离IO监测";
		LCDB_DispFWord(nX+MENU_XSPACING*3, nY,pItem);
		break;
	case 2:
		nX = MENU_BEGIN_22X;
		nY = MENU_BEGIN_2Y;
		pItem = "1 : 参数调整";
		LCDB_DispFWord(nX+MENU_XSPACING*0, nY,pItem);
		pItem = "2 : 字库DOWNLOAD";
		LCDB_DispFWord(nX+MENU_XSPACING*1, nY,pItem);
		pItem = "3 : 时间校准";
		LCDB_DispFWord(nX+MENU_XSPACING*2, nY,pItem);
		break;
	case 3:
		nX = MENU_BEGIN_23X;
		nY = MENU_BEGIN_2Y;
		pItem = "1 : EEPROM 自测";
		LCDB_DispFWord(nX+MENU_XSPACING*0, nY,pItem);
		pItem = "2 : FLASH  自测";
		LCDB_DispFWord(nX+MENU_XSPACING*1, nY,pItem);
		pItem = "3 : XRAM   自测";
		LCDB_DispFWord(nX+MENU_XSPACING*2, nY,pItem);
		pItem = "4 : LCD绘图测试";
		LCDB_DispFWord(nX+MENU_XSPACING*3, nY,pItem);
		break;
	case 4:
		nX = MENU_BEGIN_25X;
		nY = MENU_BEGIN_2Y;
		pItem = "S0~S15分别对应"; 
		LCDB_DispFWord(nX, nY,pItem);
		pItem = "十六进制的0~F"; 
		LCDB_DispFWord(nX+16, nY,pItem);
		pItem = "  A:向下选择";
		LCDB_DispFWord(nX+16*2, nY,pItem);
		pItem = "  B:向上选择";
		LCDB_DispFWord(nX+16*3, nY,pItem);
		pItem = "  D:确认";
		LCDB_DispFWord(nX+16*4, nY,pItem);
		pItem = "  E:帮助";
		LCDB_DispFWord(nX+16*5, nY,pItem);
		pItem = "  F:返回";
		LCDB_DispFWord(nX+16*6, nY,pItem);
		pItem = "其中:D,E,F在所";
		LCDB_DispFWord(nX+16*7, nY,pItem);
		pItem = "有界面中有效";
		LCDB_DispFWord(nX+16*8, nY,pItem);
		break;
	}
}

//显示标题
void Show_Title()
{
	// 标题
	LCDB_ShowHZxy(TITLE_BEGIN_X, TITLE_BEGIN_Y+TITLE_XSPACING*0, 24,24,HZ_MING_32X32);// "铭", 
	LCDB_ShowHZxy(TITLE_BEGIN_X, TITLE_BEGIN_Y+TITLE_XSPACING*1, 24,24,HZ_LANG_32X32);// "朗",
	LCDB_ShowHZxy(TITLE_BEGIN_X, TITLE_BEGIN_Y+TITLE_XSPACING*2, 24,24,HZ_KE_32X32);  // "科",
	LCDB_ShowHZxy(TITLE_BEGIN_X, TITLE_BEGIN_Y+TITLE_XSPACING*3, 24,24,HZ_JI_32X32);  // "技", 
	LCDB_DispFWord(12,			 TITLE_BEGIN_Y+TITLE_XSPACING*4, "ML-F020ICB");	
}

// 显示RTC和温度
void Show_RtcAndTmp(unsigned int nX)
{
	int nTmp;
	unsigned char sRtc[19]={0};
	unsigned char sTmp[9]={0};
	unsigned char nRet;
	char *pTemp;

	RTC_Read(&g_stRtctime);	//获取实时时间	
	sRtc[0] = ASCII[g_stRtctime.year/10];	sRtc[1] = ASCII[g_stRtctime.year%10];
	sRtc[2] = '-';
	sRtc[3] = ASCII[g_stRtctime.month/10];	sRtc[4] = ASCII[g_stRtctime.month%10];
	sRtc[5] = '-';
	sRtc[6] = ASCII[g_stRtctime.day/10];	sRtc[7] = ASCII[g_stRtctime.day%10];
	sRtc[8] = ' ';
	sRtc[9] = ASCII[g_stRtctime.hour/10];	sRtc[10] = ASCII[g_stRtctime.hour%10];
	sRtc[11] = ':';
	sRtc[12] = ASCII[g_stRtctime.minute/10]	;sRtc[13] = ASCII[g_stRtctime.minute%10];
	sRtc[14] = ':';
	sRtc[15] = ASCII[g_stRtctime.second/10]	;sRtc[16] = ASCII[g_stRtctime.second%10];
	sRtc[17] = '\0';
	LCDB_DispFWord(nX, RTC_BEGIN_Y,sRtc);
	
	nTmp = Tmp_Read()*0.0625*10;//先扩大10倍,在显示时将小数部分显示出来。
	nRet = Format_I(nTmp,sTmp,6,5,' ','h');
	//添加小数点
	if(nRet>0){
		if(nTmp>0){
			if(nRet>1){
				sTmp[nRet] = sTmp[nRet-1];
				sTmp[nRet-1] = '.';
			}
			else{
				sTmp[2] = sTmp[0];
				sTmp[0] = '0';
				sTmp[1] = '.';
			}
		}
		else if(nTmp < 0){
			if(nRet>2){
				sTmp[nRet] = sTmp[nRet-1];
				sTmp[nRet-1] = '.';
			}
			else{
				sTmp[3] = sTmp[1];
				sTmp[1] = '0';
				sTmp[2] = '.';
			}
		}
		pTemp = "℃";
		sTmp[6] = pTemp[0];sTmp[7] = pTemp[1];sTmp[8] = '\0';
		LCDB_DispFWord(nX, TMP_BEGIN_Y,sTmp);		
	}
}

//ADC 显示框架
void Show_ADC(void)
{
	unsigned char nX; 
	unsigned char ain[7] = {0};
	unsigned char i;
	ain[0]='A';ain[1]='I';ain[2]='N';ain[3]='0';ain[4]='1';ain[5]='=';ain[6]='\0';
	
	for(i=1,nX = ADC_BEGIN_X; i<=8; i++,nX+=ADC_XSPACING)
	{
		Format_I(i,ain+3,2,2,'0','h');
		LCDB_DispFWord(nX,ADC1_BEGIN_Y,ain);
	}
	for(i=9,nX = ADC_BEGIN_X; i<=16; i++,nX+=ADC_XSPACING)
	{
		Format_I(i,ain+3,2,2,'0','h');
		LCDB_DispFWord(nX,ADC2_BEGIN_Y,ain);
	}
	for(i=17,nX = ADC_BEGIN_X; i<=24; i++,nX+=ADC_XSPACING)
	{
		Format_I(i,ain+3,2,2,'0','h');
		LCDB_DispFWord(nX,ADC3_BEGIN_Y,ain);
	}
}

//IO显示框架
void Show_IO(void)
{
	unsigned char *pDraw;
	unsigned char nX; 
	unsigned char ain[4] = {0};
	unsigned char i;
	ain[0]='0';ain[1]='1';ain[2]=':';ain[3]='\0';
	pDraw = "端口 属性 操作 结果";
	LCDB_DispFWord(ORIGIN_X, ORIGIN_0Y,pDraw);
	LCDB_DispFWord(ORIGIN_X, ORIGIN_1Y,pDraw);
	for(i=1,nX = ORIGIN_X+16; i<=8; i++,nX+=ADC_XSPACING)
	{
		Format_I(i,ain,2,2,'0','h');
		LCDB_DispFWord(nX,ORIGIN_0Y+8,ain);
	}
	for(i=9,nX = ORIGIN_X+16; i<=16; i++,nX+=ADC_XSPACING)
	{
		Format_I(i,ain,2,2,'0','h');
		LCDB_DispFWord(nX,ORIGIN_1Y+8,ain);
	}
				
}

// 隔离IO显示框架
void Show_IOG(void)
{
	unsigned char *pDraw;
	unsigned char nX; 
	unsigned char ain[5] = {0};
	unsigned char i;
	ain[0]='D';ain[1]='I';ain[2]='N';ain[3]='1';ain[4]='\0';
	pDraw = "  端口 方向 结果";
	LCDB_DispFWord(ORIGIN_X, ORIGIN_0Y,pDraw);
	LCDB_DispFWord(ORIGIN_X, ORIGIN_1Y,pDraw);
	pDraw = " 输入";
	for(i=1,nX = ORIGIN_X+16; i<=8; i++,nX+=ADC_XSPACING)
	{
		Format_I(i,ain+3,1,0,'0','h');
		LCDB_DispFWord(nX,ORIGIN_0Y+16,ain);
		LCDB_DispFWord(nX, ORIGIN_0Y+16*3,pDraw);
	}
	pDraw = " 输出";
	ain[0]='O';ain[1]='U';ain[2]='T';ain[3]='1';ain[4]='\0';
	for(i=1,nX = ORIGIN_X+16; i<=8; i++,nX+=ADC_XSPACING)
	{
		Format_I(i,ain+3,1,0,'0','h');
		LCDB_DispFWord(nX,ORIGIN_1Y+16,ain);
		LCDB_DispFWord(nX, ORIGIN_1Y+16*3,pDraw);
	}
}

//参数显示框架
void Show_Param(void)
{
	unsigned char nX; 
	unsigned char ain[5] = {0};
	unsigned char i;
	unsigned char *pFill; 
	
	ain[0]='b';ain[1]='P';ain[2]='1';ain[3]='=';ain[4]='\0';
	nX = ADC_BEGIN_X-16;
	pFill = "char型";
	LCDB_DispFWord(nX,8*2,pFill);
	pFill = "short型";
	LCDB_DispFWord(nX,8*11,pFill);
	pFill = "long型";
	LCDB_DispFWord(nX,8*22,pFill);
	for(i=1,nX = ADC_BEGIN_X; i<=8; i++,nX+=ADC_XSPACING)
	{
		Format_I(i,ain+2,1,0,'0','h');
		ain[0]='b';
		LCDB_DispFWord(nX,8*2,ain);
		ain[0]='n';
		LCDB_DispFWord(nX,8*11,ain);
		ain[0]='l';
		LCDB_DispFWord(nX,8*22,ain);
	}	
}

//显示参数数据
void Show_ParamD(void *pP)
{
	unsigned char nX,nY; 
	unsigned char ain[14] = {0};
	unsigned char ucRet;
	
	union ProParam *pParam = (union ProParam *)pP;
	nX = ADC_BEGIN_X; nY = 8*6;
	ucRet = Format_I(pParam->sProParam.bP1,ain,4,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.bP2,ain,4,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.bP3,ain,4,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.bP4,ain,4,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.bP5,ain,4,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.bP6,ain,4,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.bP7,ain,4,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.bP8,ain,4,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	nX = ADC_BEGIN_X; nY = 8*15;
	ucRet = Format_I(pParam->sProParam.nP1,ain,6,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.nP2,ain,6,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.nP3,ain,6,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.nP4,ain,6,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.nP5,ain,6,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.nP6,ain,6,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.nP7,ain,6,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.nP8,ain,6,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	nX = ADC_BEGIN_X; nY = 8*26;
	ucRet = Format_I(pParam->sProParam.lP1,ain,13,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.lP2,ain,13,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.lP3,ain,13,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.lP4,ain,13,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.lP5,ain,13,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.lP6,ain,13,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.lP7,ain,13,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
	ucRet = Format_I(pParam->sProParam.lP8,ain,13,0,'0','h'); ain[ucRet]='\0'; LCDB_DispFWord(nX,nY,ain);nX+=ADC_XSPACING;
}

//清除参数数据
void CLear_ParamD(void)
{
	unsigned char nX,nY; 
	unsigned char *pFill; 
	
	nY =  8*6; pFill = "    ";//5个空格
	for(nX=ADC_BEGIN_X; nX<ADC_BEGIN_X+ADC_XSPACING*8; nX+=ADC_XSPACING)
		LCDB_DispFWord(nX,nY,pFill);
	nY = 8*15; pFill = "      ";//8个空格
	for(nX = ADC_BEGIN_X;nX<ADC_BEGIN_X+ ADC_XSPACING*8;nX+=ADC_XSPACING)
		LCDB_DispFWord(nX,nY,pFill);
	nY = 8*26; pFill = "             ";//13个空格
	for(nX = ADC_BEGIN_X;nX<ADC_BEGIN_X+ ADC_XSPACING*8;nX+=ADC_XSPACING)
		LCDB_DispFWord(nX,nY,pFill);
}

//清除X轴大于64的所有屏幕内容
void Show_ClareX64(void)
{
	unsigned char *pDraw;
	unsigned char nX,i;
	pDraw = "                                        ";//40个空格
	nX = 64;
	for(i=0;i<11;i++)LCDB_DispFWord(nX+i*16,0,pDraw);
}

⌨️ 快捷键说明

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