📄 key_30_11
字号:
#include "disdrive.h"
#include "display.h"
#include "key.h"
#include "zimo.h"
#include "main.h"
#include "X.H"
/*-----------------------------------------代表当前液晶显示页面的量---------------------------------------*/
#define LED_DEFAULT 0x00 //缺省状态
//must add 2
#define LED_DEFAULT_1 0x02 //input page,缺省状态下的输入量
#define LED_DEFAULT_2 0x04 //output page,缺省状态下的输出量
#define LED_DEFAULT_3 0x06 //direct current page,缺省状态下的直流量
#define LED_DEFAULT_4 0x08 //查询故障
#define LED_MENU_MAIN 0x10 //主菜单
#define LED_MENU1 0x20 //查询输入
#define LED_MENU2 0x30 //查询输出
#define LED_MENU3 0x40 //查询直流电压电流
#define LED_MENU4 0x50 //查询累计时间
#define LED_MENU5 0x60 //查询故障
#define LED_MENU6 0x70 //清除累计量
/*----------------------直接调用ShowCharPage或调用MessageBox可以直接显示画面的形参---------------------*/
//declare page which define in zimo.h
#define PAGE_DEFAULT Page_Default //缺省页字模数组,页面
#define PAGE_DEFAULT_LINE 4 //缺省页显示总行数(页数)
#define PAGE_DEFAULT_SEL 0 //反显某一行(无)
#define PAGE_MENU_MAIN Page_MenuMain //主菜单,页面
#define PAGE_MENU_MAIN_LINE 0x07 //总共7行两页
#define PAGE_MENU_MAIN_SEL 1 //默认首先反显第一行
#define PAGE_MENU_MAIN1 Page_Input_V //输入电压,页面
#define PAGE_MENU_MAIN1_LINE 4
#define PAGE_MENU_MAIN1_SEL 0
#define PAGE_MENU_MAIN2 Page_Output_VA //输出电压电流,页面
#define PAGE_MENU_MAIN2_LINE 4
#define PAGE_MENU_MAIN2_SEL 0
#define MESSAGE_MENU3 Message_ZhiLiuLiang //中间直流量
#define MESSAGE_MENU3_STARTX 0 //在屏幕中的起始位置
#define MESSAGE_MENU3_STARTY 2
#define MESSAGE_MENU3_XNUM 3 //总共占3行6列,即18个字
#define MESSAGE_MENU3_YNUM 6
#define MESSAGE_MENU4 Message_CountTime //累计时间
#define MESSAGE_MENU4_STARTX 0 //在屏幕中的起始位置
#define MESSAGE_MENU4_STARTY 4
#define MESSAGE_MENU4_XNUM 3
#define MESSAGE_MENU4_YNUM 4
#define MESSAGE_MENU5 Message_GuZhang //故障
#define MESSAGE_MENU5_STARTX 0 //在屏幕中的起始位置
#define MESSAGE_MENU5_STARTY 6
#define MESSAGE_MENU5_XNUM 1
#define MESSAGE_MENU5_YNUM 2
#define MESSAGE_QUEREN Message_QingQueRen //请确认或取消 页面,确认清除累积记录时出来的画面
#define MESSAGE_QUEREN_STARTX 2 //在屏幕中的起始位置
#define MESSAGE_QUEREN_STARTY 4
#define MESSAGE_QUEREN_XNUM 2
#define MESSAGE_QUEREN_YNUM 4
#define MESSAGE_QINGCHU Message_QingChu //清除
#define MESSAGE_QINGCHU_STARTX 2
#define MESSAGE_QINGCHU_STARTY 4
#define MESSAGE_QINGCHU_XNUM 1
#define MESSAGE_QINGCHU_YNUM 3
#define PAGE_GUZHANGPAGE1 Page_GuZhangPage1
#define PAGE_GUZHANGPAGE1_LINE 4
#define PAGE_GUZHANGPAGE1_SEL 0
#define PAGE_GUZHANGPAGE2 Page_GuZhangPage2
#define PAGE_GUZHANGPAGE2_LINE 4
#define PAGE_GUZHANGPAGE2_SEL 0
#define PAGE_GUZHANGPAGE3 Page_GuZhangPage3
#define PAGE_GUZHANGPAGE3_LINE 4
#define PAGE_GUZHANGPAGE3_SEL 0
#define PAGE_GUZHANGPAGE4 Page_GuZhangPage4
#define PAGE_GUZHANGPAGE4_LINE 4
#define PAGE_GUZHANGPAGE4_SEL 0
/*
#define MESSAGE_GUZHANG Message_GuZhangNeiRong
#define MESSAGE_GUZHANG_STARTX 0
#define MESSAGE_GUZHANG_STARTY 2
#define MESSAGE_GUZHANG_XNUM 1
#define MESSAGE_GUZHANG_YNUM 4
*/
/*------------------------------------变量定义--------------------------------------------------*/
unsigned char data gKeyCode = KEY_NOKEY; //keycode,按键代码
unsigned char data IsKeyDown = NO_KEY_DOWN; //keystatus,键状态
unsigned char data MenuLayer = LED_DEFAULT; //液晶显示器当前页面代码,初始化时指向液晶显示默认菜单
unsigned char data MenuSelect = 0x01; //菜单层中反显行
unsigned int data AutoKeyTime = 0; //没有按键按下时,液晶显示自动更新时间计数器
unsigned int data KeyDelayTime = 0; //按键延时计数器,大于一定时间可以认为按键被按下,再大于一定时间可以认为一次按键全部过程结束
unsigned char data UpdataLEDTime= 0; //刷新屏幕的时间计数器
unsigned char data IsUpdateLed = FALSE; //刷新屏幕标志
unsigned char data LastSoureState = 0; //上一次系统状态
extern unsigned char data GuZhangState;
/*----------------------------------------数据结构定义-------------------------------------------*/
struct COUNT idata CountDate;
struct INCOME idata Incomedata={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
/*--------------------------------------故障信息存储数组-------------------------------------
#define ERRORNUM 32
unsigned char idata ErrorStr[ERRORNUM];
unsigned char data ErrorNum; //实际故障数
unsigned char data ErrorPage; //当前显示的故障页数
unsigned char data ErrorPageNum; //故障总页数
*/
//inital system will call it
void InitialKey()
{
gKeyCode = KEY_NOKEY;
IsKeyDown = NO_KEY_DOWN;
MenuLayer = LED_DEFAULT;
AutoKeyTime = 0;
KeyDelayTime = 0;
UpdataLEDTime = 0;
IsUpdateLed = FALSE;
RunLight = SetLight;
}
//get key code,查询是否有按键按下
unsigned char DecodeKey()
{
UCHAR temp;
P1 = 0xFE;//111111110
P1 = 0xFE;//111111110
temp = (P1&0x10) ;//P14 == 0?
if ( temp == 0x00) return KEY_CANCEL;
P1 = 0xFE;//111111110
P1 = 0xFE;//111111110
temp = (P1&0x08) ;//P13 == 0?
if ( temp == 0x00) return KEY_OK;
P1 = 0xFD;//11111101
P1 = 0xFD;//11111101
temp = (P1&0x08) ;//P13 == 0?
if ( temp == 0x00) return KEY_DOWN;
P1 = 0xFB;//111111011
P1 = 0xFB;//111111011
temp = (P1&0x08) ;//P13 == 0?
if ( temp == 0x00) return KEY_UP;
else return KEY_NOKEY;//no key down
}
//get the key state,判断是否确实有键按下,有键按下返回1,没有则返回0
unsigned char KeyProcessFirst(void)
{
gKeyCode = DecodeKey();
if (gKeyCode == KEY_NOKEY) //no key down
{
IsKeyDown = NO_KEY_DOWN;
return FALSE;
}
//real key is down
if ( IsKeyDown == NO_KEY_DOWN) //IsKeyDown的初始状态,按键刚被采集到,没有进行防抖处理
{
IsKeyDown = KEY_DOWN_TRIGGER; //one key down decteced but key delay time is't over
KeyDelayTime = 0; //初始化
return FALSE;
}
if (IsKeyDown == KEY_DOWN_DELAY_OVER) //key delay time is over
{
IsKeyDown = KEY_PRO_COMPLETE_DELAY;
return TRUE;
}
return FALSE; //其它状态返回0
}
/*-------------the main key block,直接调用此函数可以处理数据更新或者按键按下后的处理过程----------------*/
unsigned char KeyPro()
{
if ( KeyProcessFirst() == FALSE )//no key down
{
if( AutoKeyTime >= KEY_AUTOUPDATE_TIME )
{
AutoKeyTime = 0;
gKeyCode = KEY_UPDATE;
}
else return FALSE;
if( UpdataLEDTime >= UPDATALED_TIME)
{
UpdataLEDTime = 0;
IsUpdateLed = TRUE;
}
else UpdataLEDTime++;
}
//dispatch key in their own menu
SetLedZAddress(0x00);
switch ( MenuLayer )
{
case LED_DEFAULT_1:
case LED_DEFAULT_2:
case LED_DEFAULT_3:
case LED_DEFAULT_4:
KeyInLedDefault();
break;
case LED_DEFAULT :
GuZhangState = GUZHANGDELAYOVER; //在默认页面下有键按下,即表示故障延时结束
KeyInLedDefault();
break;
case LED_MENU_MAIN :
KeyInLedMain();
break;
case LED_MENU1 :
KeyInLedMenu1();
break;
case LED_MENU2 :
KeyInLedMenu2();
break;
case LED_MENU3 :
KeyInLedMenu3();
break;
case LED_MENU4 :
KeyInLedMenu4();
break;
case LED_MENU5 :
KeyInLedMenu5();
break;
case LED_MENU6 :
KeyInLedMenu6();
break;
}
return TRUE;
}
//在缺省状态显示内容中写入输出电流电压的数据
void FillDefault()
{
if((Incomedata.SourceState&0x03)==0&&LastSoureState==0) //在待机状态
return;
if((Incomedata.SourceState&0x03)==0&&LastSoureState!=0) //从输出或启动状态回到待机状态
{
LastSoureState=0;
LedFillNULL();
ShowWait();
return;
}
if((Incomedata.SourceState&0x03)!=0&&LastSoureState==0) //从待机状态到输出或启动
{
LastSoureState = 1;
ShowCharPage(PAGE_DEFAULT,PAGE_DEFAULT_LINE,PAGE_DEFAULT_SEL);
}
Fill4NULL(0,7); //清空4-7列,0-1页的内容,共16*32
FillNum(Incomedata.OutputUA,0,0,7);
Fill4NULL(0,13);
FillNum(Incomedata.OutputIA,0,0,13);
Fill4NULL(2,7);
FillNum(Incomedata.OutputUB,0,2,7);
Fill4NULL(2,13);
FillNum(Incomedata.OutputIB,0,2,13);
Fill4NULL(4,7);
FillNum(Incomedata.OutputUC,0,4,7);
Fill4NULL(4,13);
FillNum(Incomedata.OutputIC,0,4,13);
if((Incomedata.SourceState&0x03)==SOURCE_STATE_OUT)//输出
{
Fill4NULL(6,3);
ShowOneChar(z_shu,0,6,0);
ShowOneChar(z_chu,0,6,2);
}
if ((Incomedata.SourceState&0x03)==SOURCE_STATE_START)
{
Fill4NULL(6,3);
ShowOneChar(z_qi2,0,6,0);
ShowOneChar(z_dong,0,6,2);
}
Fill4NULL(6,11);
if(GuZhangState == GUZHANGDELAY||Incomedata.ErrorCodeShuZi!=0||Incomedata.ErrorCodeMoNi!=0) //有故障,且故障处于延时中
ShowOneChar(z_you,0,6,10);
else ShowOneChar(z_wu,0,6,10); //没有故障,或者延时已过
}
void FillInput()
{
Fill2NULL(2,7);
Fill4NULL(2,11);
FillNum(Incomedata.InputUA,0,2,10);
Fill2NULL(4,7);
Fill4NULL(4,11);
FillNum(Incomedata.InputUB,0,4,10);
Fill2NULL(6,7);
Fill4NULL(6,11);
FillNum(Incomedata.InputUC,0,6,10);
}
void FillOutput()
{
Fill4NULL(2,7);
FillNum(Incomedata.OutputUA,0,2,7);
Fill4NULL(2,13);
FillNum(Incomedata.OutputIA,0,2,13);
Fill4NULL(4,7);
FillNum(Incomedata.OutputUB,0,4,7);
Fill4NULL(4,13);
FillNum(Incomedata.OutputIB,0,4,13);
Fill4NULL(6,7);
FillNum(Incomedata.OutputUC,0,6,7);
Fill4NULL(6,13);
FillNum(Incomedata.OutputIC,0,6,13);
}
void FillDirectCurrent() //写入直流数据
{
Fill2NULL(2,7);
Fill4NULL(2,11);
FillNum(Incomedata.DirectCurrentU,0,2,10);
Fill2NULL(4,7);
Fill4NULL(4,11);
FillNum(Incomedata.DirectCurrentI,0,4,10);
}
void FillCountTime()
{
CountDate.fen=ByteRead25045EEROM(SAVETIME_ADD);
CountDate.shi=ByteRead25045EEROM(SAVETIME_ADD+2);//先取出高八位
CountDate.shi=(CountDate.shi<<8)+ByteRead25045EEROM(SAVETIME_ADD+1);
Fill2NULL(4,1);
Fill4NULL(4,5);
FillNum(CountDate.shi,0,4,5);
Fill2NULL(4,9);
FillNum(CountDate.fen,0,4,9);
}
void FillGuZhangCode() //直接把收到的数据显示在屏幕上
{
Fill4NULL(4,3);
Fill4NULL(4,7);
Fill4NULL(4,11);
Fill4NULL(4,15);
FillNum2(Incomedata.ErrorCodeShuZi,4,15);
Fill4NULL(6,3);
Fill4NULL(6,7);
Fill4NULL(6,11);
Fill4NULL(6,15);
FillNum2(Incomedata.ErrorCodeMoNi,6,15);
}
void FillGuZhangPage1()
{
unsigned char ErrorTemp;
ErrorTemp=ByteRead25045EEROM(SAVEERROR_ADD);
Fill4NULL(2,15);
Fill4NULL(4,15);
Fill4NULL(6,15);
if((ErrorTemp&0x08)==0)
{
ShowOneChar(z_zhen,0,2,12);
ShowOneChar(z_chang,0,2,14);
}
else
{
ShowOneChar(z_gu,0,2,12);
ShowOneChar(z_zhang,0,2,14);
}
if((ErrorTemp&0x10)==0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -