📄 showlcd.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 + -