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

📄 key_30_11

📁 单片机控制的12864液晶显示器的驱动程序,通过按键控制
💻
📖 第 1 页 / 共 3 页
字号:
#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 + -