?? 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 + -