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

📄 key.c

📁 AVRMEG32编写的一个项目代码,里面包含一般应用的模块.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "includes.h"
// 采单索引结构
typedef struct
    {
   	 	const prog_char KeyTab_MenuIndex;      //当前状态索引号
    	const prog_char KeyTab_MaxItems;       //本级菜单最大条目数
    	const prog_char KeyTab_PressOk;        //按下"回车"键时转向的状态索引号
    	const prog_char KeyTab_PressEsc;       //按下"返回"键时转向的状态索引号
    	const prog_char KeyTab_PressDown;      //按下"向下"键时转向的状态索引号
    	const prog_char KeyTab_PressUp;        //按下"向上"键时转向的状态索引号
    }KeyTabStruct;

#define	MAX_KEYTABSTRUCT_NUM    26
#define MAX_MENUDISPLAYROW		3
#define MAX_ONELEVELMENU_NUM	11


#define MENU_FACE				0
#define MENU_ROOT				1

#define	MENU_VIEW 	        	2//查看
#define MENU_VIEW_UNHANDLEDALR	3//未处理告警

#define MENU_OPR         		4//设置

#define MENU_OPR_MCOOL			5
#define MENU_OPR_MHOT   		6
#define MENU_OPR_MHOTCHANGE		7
#define MENU_OPR_MAIRCHANGE	    8
#define MENU_OPR_AIRCHANGE		9
#define MENU_OPR_LEAVE	        10
#define MENU_OPR_MOREV		    11
#define MENU_OPR_LOWERV 	    12

#define MENU_SYSSET            		    13//系统参数

#define MENU_SYSSET_AUXPARA_UPPH1       14
#define MENU_SYSSET_AUXPARA_UPPH2       15
#define MENU_SYSSET_AUXPARA_UPPH3       16
#define MENU_SYSSET_AUXPARA_TIME        17
#define MENU_SYSSET_AUXPARA_ADDRESS     18

#define MENU_guimou                     19//采样规模

#define  MENU_SYSSET_AUXPARA_MENGJIN1  20
//#define  MENU_SYSSET_AUXPARA_MENGJIN2  21
//#define  MENU_SYSSET_AUXPARA_MENGJIN3  22
#define  MENU_SYSSET_AUXPARA_ZHILIUV   21
#define  MENU_SYSSET_AUXPARA_ZHILIUA   22
#define  MENU_SYSSET_AUXPARA_JIAOLIUV  23
#define	 MENU_SYSSET_AUXPARA_JIAOLIUA  24
#define  MENU_SYSSET_AUXPARA_FIRSTWENSHIDU  25
//#define  MENU_SYSSET_AUXPARA_SECONDWENSHIDU 28
//#define	 MENU_SYSSET_AUXPARA_THIRDWENSHIDU  29

#define MENU_NULL       26

//Only for menu
unsigned char  m_ucCurrDispMenuID[MAX_MENUDISPLAYROW];//每屏显示3行
unsigned char  m_ucCurrLoadMenuID[MAX_ONELEVELMENU_NUM];//19
unsigned char  m_ucMenuTmp;
unsigned char  m_ucCurrMenuID;
unsigned char  m_ucCurHLightRow;
unsigned char  m_ucKeybResv;
unsigned char  m_uiKeybResv ;

const u08 *Menu_String[MAX_KEYTABSTRUCT_NUM+1] PROGMEM = //add null menu at last
{
    "              ",
    "              ",
    "查看          ",
    "未处理告警    ",
    "设置          ",
    "设备仓制冷    ",
    "设备仓制热    ",
	"设备仓热交换  ",
	"设备仓空气循环",
    "电池仓空气循环",
    "蓄电池跳脱    ",
    "直流过压      ",
    "直流欠压      ",
    "系统参数      ",
    "号码一        ",
    "号码二        ",
    "号码三        ",
    "时间设置      ",
    "局站地址      ",
    "规模          ",
	"门禁          ",
//    "门禁二        ",
//    "门禁三        ",
    "直流电压      ",
    "直流电流      ",
    "交流电压      ",
    "交流电流      ",
    "温湿          ",
//    "温湿二        ",
//    "温湿三        ",
	"              "
};

//一级目录
const prog_char Menu_RootID[4]=
    {
        MENU_VIEW,//0
        MENU_OPR,//4
        MENU_SYSSET,//13
        MENU_guimou//19
    };
//查看
const prog_char Menu_ViewID[1]=
    {
        MENU_VIEW_UNHANDLEDALR
    };

//设置
const prog_char Menu_OprID[8]=
    {
        MENU_OPR_MCOOL,//设置设备仓制冷门限
        MENU_OPR_MHOT,//设置设备仓制热门限
        MENU_OPR_MHOTCHANGE,//设置设备仓热交换门限
        MENU_OPR_MAIRCHANGE,//设置设备仓空气循环门限
        MENU_OPR_AIRCHANGE,//设置电池仓湿度空气循环门限
        MENU_OPR_LEAVE,//设置蓄电池电压过低跳脱门限
        MENU_OPR_MOREV,//设置直流过压门限
        MENU_OPR_LOWERV,//设置直流欠压门限
    };
//系统参数
const prog_char Menu_SysSetID[5]=
    {
        MENU_SYSSET_AUXPARA_UPPH1,//上拨号码
        MENU_SYSSET_AUXPARA_UPPH2,
        MENU_SYSSET_AUXPARA_UPPH3,
        MENU_SYSSET_AUXPARA_TIME,//设置系统时间
 	    MENU_SYSSET_AUXPARA_ADDRESS,//设置设备地址
    };


const prog_char Menu_guimouID[6] =
	{
 	    MENU_SYSSET_AUXPARA_MENGJIN1,//设置门禁启用否
       // MENU_SYSSET_AUXPARA_MENGJIN2,
 	   // MENU_SYSSET_AUXPARA_MENGJIN3,
        MENU_SYSSET_AUXPARA_ZHILIUV,//设置直流电压采样,开启否
 	    MENU_SYSSET_AUXPARA_ZHILIUA,//设置支流电流采样,开启否
        MENU_SYSSET_AUXPARA_JIAOLIUV,//设置交流电压采样,开启否
 	    MENU_SYSSET_AUXPARA_JIAOLIUA,//设置交流电流采样,开启否
        MENU_SYSSET_AUXPARA_FIRSTWENSHIDU,//设置第一路温湿度,开启否
       // MENU_SYSSET_AUXPARA_SECONDWENSHIDU,//设置第二路温湿度,开启否
 	   // MENU_SYSSET_AUXPARA_THIRDWENSHIDU//设置第三路温湿度,开启否
	};
	
const prog_char MenuNULL[]={"              "};

//CurMenuID=本菜单ID
//MaxMenuItem=同级菜单最大项数,必须大于3才能循环,小于等于3时,写4
//OkMenuID=子菜单层所对应的菜单ID,ID=255为菜单已经到底了
//EscMenuID=父菜单层所对应的菜单ID,ID=255为菜单已经到顶了
//DownMenuID=弟菜单层所对应的菜单ID,ID=255为菜单是独生子
//UpMenuID=兄菜单层所对应的菜单ID,ID=255为菜单是独生子
const KeyTabStruct  KeyTab[MAX_KEYTABSTRUCT_NUM] PROGMEM=
{
//CurMenuID,			MaxMenuItem,	OkMenuID,			EscMenuID, 		DownMenuID, 			UpMenuID
{MENU_FACE,					0,			MENU_ROOT,			255,			255,				255},
{MENU_ROOT,					0,			MENU_VIEW,			    MENU_FACE,	MENU_OPR,			MENU_SYSSET},
{MENU_VIEW,					4,			MENU_VIEW_UNHANDLEDALR,	MENU_FACE,	MENU_OPR,			MENU_SYSSET},
{MENU_VIEW_UNHANDLEDALR,	1,			255,				MENU_VIEW,		255,		        255},
{MENU_OPR,					4, 			MENU_OPR_MCOOL,     MENU_FACE,	    MENU_SYSSET,		MENU_VIEW},
{MENU_OPR_MCOOL,         	8,			255,				MENU_OPR,		MENU_OPR_MHOT,   	MENU_OPR_LOWERV},
{MENU_OPR_MHOT,	            8,			255,				MENU_OPR,		MENU_OPR_MHOTCHANGE,MENU_OPR_MCOOL},
{MENU_OPR_MHOTCHANGE,	    8,			255,				MENU_OPR,		MENU_OPR_MAIRCHANGE,MENU_OPR_MHOT},
{MENU_OPR_MAIRCHANGE,	   	8,			255,				MENU_OPR,		MENU_OPR_LEAVE,	 	MENU_OPR_MHOTCHANGE},
{MENU_OPR_AIRCHANGE,	    8,			255,				MENU_OPR,		MENU_OPR_LEAVE, 	MENU_OPR_MAIRCHANGE},
{MENU_OPR_LEAVE,	    	8,			255,				MENU_OPR,		MENU_OPR_MOREV, 	MENU_OPR_AIRCHANGE},
{MENU_OPR_MOREV,	     	8,			255,				MENU_OPR,		MENU_OPR_LOWERV, 	MENU_OPR_LEAVE},
{MENU_OPR_LOWERV,	    	8,			255,				MENU_OPR,		MENU_OPR_MCOOL, 	MENU_OPR_MOREV},
{MENU_SYSSET,				4,			MENU_SYSSET_AUXPARA_UPPH1, MENU_FACE,		MENU_guimou,		  MENU_OPR},
{MENU_SYSSET_AUXPARA_UPPH1,	5,	    	255,                MENU_SYSSET,	MENU_SYSSET_AUXPARA_UPPH2,	  MENU_SYSSET_AUXPARA_ADDRESS},
{MENU_SYSSET_AUXPARA_UPPH2,	5,			255,				MENU_SYSSET,	MENU_SYSSET_AUXPARA_UPPH3,	  MENU_SYSSET_AUXPARA_UPPH1},
{MENU_SYSSET_AUXPARA_UPPH3, 5,		    255,				MENU_SYSSET,	MENU_SYSSET_AUXPARA_TIME,	  MENU_SYSSET_AUXPARA_UPPH2},
{MENU_SYSSET_AUXPARA_TIME,  5,	    	255,				MENU_SYSSET,	MENU_SYSSET_AUXPARA_ADDRESS,  MENU_SYSSET_AUXPARA_UPPH3},
{MENU_SYSSET_AUXPARA_ADDRESS,5,			255,				MENU_SYSSET,	MENU_SYSSET_AUXPARA_UPPH1,	  MENU_SYSSET_AUXPARA_TIME},
{MENU_guimou,           	   4,	    MENU_SYSSET_AUXPARA_MENGJIN1, MENU_FACE, MENU_VIEW,	              MENU_SYSSET},
{MENU_SYSSET_AUXPARA_MENGJIN1, 6,			255,			MENU_guimou,	MENU_SYSSET_AUXPARA_ZHILIUV,  MENU_SYSSET_AUXPARA_FIRSTWENSHIDU},
//{MENU_SYSSET_AUXPARA_MENGJIN2, 10,		    255,				MENU_guimou,	MENU_SYSSET_AUXPARA_MENGJIN3, MENU_SYSSET_AUXPARA_MENGJIN1},
//{MENU_SYSSET_AUXPARA_MENGJIN3, 10,	    	255,				MENU_guimou,	MENU_SYSSET_AUXPARA_ZHILIUV,  MENU_SYSSET_AUXPARA_MENGJIN2},
{MENU_SYSSET_AUXPARA_ZHILIUV,  6,			255,			MENU_guimou,	MENU_SYSSET_AUXPARA_ZHILIUA,        MENU_SYSSET_AUXPARA_MENGJIN1},
{MENU_SYSSET_AUXPARA_ZHILIUA,  6,			255,			MENU_guimou,	MENU_SYSSET_AUXPARA_JIAOLIUV,       MENU_SYSSET_AUXPARA_ZHILIUV},
{MENU_SYSSET_AUXPARA_JIAOLIUV, 6,		    255,			MENU_guimou,	MENU_SYSSET_AUXPARA_JIAOLIUA,	    MENU_SYSSET_AUXPARA_ZHILIUA},
{MENU_SYSSET_AUXPARA_JIAOLIUA, 6,	    	255,			MENU_guimou,    MENU_SYSSET_AUXPARA_FIRSTWENSHIDU,  MENU_SYSSET_AUXPARA_JIAOLIUV},
{MENU_SYSSET_AUXPARA_FIRSTWENSHIDU,  6,	    255,			MENU_guimou,	MENU_SYSSET_AUXPARA_MENGJIN1      , MENU_SYSSET_AUXPARA_JIAOLIUA}
//{MENU_SYSSET_AUXPARA_SECONDWENSHIDU, 10,	255,				MENU_guimou,	MENU_SYSSET_AUXPARA_THIRDWENSHIDU,  MENU_SYSSET_AUXPARA_FIRSTWENSHIDU},
//{MENU_SYSSET_AUXPARA_THIRDWENSHIDU,  10,	255,				MENU_guimou,	MENU_SYSSET_AUXPARA_MENGJIN1,	    MENU_SYSSET_AUXPARA_SECONDWENSHIDU}
};

//初始化
void key_init(void)
{
    //设置上拉
    outb(KEY_PORT,BV(PD2_ok)|BV(PD3_left)|BV(PD4_down)|BV(PD5_right));
    //设置方向,输入
    outb(KEY_DDR,BV(PD2_ok)|BV(PD3_left)|BV(PD4_down)|BV(PD5_right));
    //设置上拉
    sbi(PORTA,PA7);
    //设置输入
    cbi(DDRA,PA7);
}

//键盘检测
void key_pressed(void)
{
	if(!(KEY_PIN & (1<<PD2_ok)))
	{
		_delay_ms(100);//延时10ms
		if(!(KEY_PIN & (1<<PD2_ok)))
		{
  		    Lcd_ClearAll();//先清屏
            menu_handle();//进入一级采单
            while(!(KEY_PIN &(1<<PD2_ok)));//防止按键始终按着
			while(1)
			{
				if(!(KEY_PIN & (1<<PD3_left)))
				{
					_delay_ms(100);
					if(!(KEY_PIN & (1<<PD3_left)))
					{
					     menue_move(3);//向下或向左滚动
						 while(!(KEY_PIN &(1<<PD3_left)));//防止按键始终按着
					}
				}
				if(!(KEY_PIN & (1<<PD5_right)))
				{
					_delay_ms(100);
					if(!(KEY_PIN & (1<<PD5_right)))
					{
						  menue_move(5);//向上或向右滚动
				    	 while(!(KEY_PIN &(1<<PD5_right)));//防止按键始终按着
					}
				}
				if(!(PINA & (1<<PA7_up)))
				{
					_delay_ms(100);
					if(!(KEY_PIN & (1<<PA7_up)))
					{
					     menue_move(7);//向上滚动
						while(!(PINA &(1<<PA7_up)));//防止按键始终按着
					}
				}
				if(!(KEY_PIN & (1<<PD4_down)))
				{
					_delay_ms(100);
					if(!(KEY_PIN & (1<<PD4_down)))
					{
						 menue_move(4);//向下滚动
						 while(!(KEY_PIN &(1<<PD4_down)));//防止按键始终按着
					}
			    }
               // inputReadWord();//读取165两个字节(级联),ESC健值
			   if((inputReadWord() | key_esc) ==key_esc)//0xFF7F
				{
				    _delay_ms(50);
				    if((inputReadWord() | key_esc) == key_esc)
				    {
                        if(menue_move(8))
						     return;//返回
	 			        while((inputReadWord() | key_esc)== key_esc);//防止按键始终按着
					}
				}
				if(!(KEY_PIN & (1<<PD2_ok)))
				{
					_delay_ms(100);
					if(!(KEY_PIN & (1<<PD2_ok)))
					{
					     menue_move(2);//确认
						// return 0;
						 while(!(KEY_PIN &(1<<PD2_ok)));//防止按键始终按着
				    }
				}
			}
		}
		return ;
	}
	return ;
}


//菜单进入显示缓从区
void GoTopDispMenuID(unsigned char ucTopMenuID,unsigned char ucMaxItems)
{
 	 unsigned char i;
	 unsigned char ucTmp;
	 while (m_ucCurrLoadMenuID[0]!=ucTopMenuID)
	{
	    ucTmp=m_ucCurrLoadMenuID[0];
		for (i=0;i<ucMaxItems-1;i++)
	    	m_ucCurrLoadMenuID[i]=m_ucCurrLoadMenuID[i+1];
	    m_ucCurrLoadMenuID[ucMaxItems-1]=ucTmp;
	}
	for (i=0;i<MAX_MENUDISPLAYROW;i++)
	{
	    if (i<ucMaxItems)
		    m_ucCurrDispMenuID[i]=m_ucCurrLoadMenuID[i];
	    else
	    	m_ucCurrDispMenuID[i]=MENU_NULL;
	}
    m_ucCurHLightRow=0;
}

//菜单加载
void LoadMenu(void)
{
    unsigned char i;
	switch(m_ucCurrMenuID)
    {
		  case MENU_FACE:
			   break;
          case MENU_ROOT:
		       break;
          case MENU_VIEW:
          case MENU_OPR:
          case MENU_SYSSET:
	      case MENU_guimou:
		       for (i=0;i<4;i++)
		     	   m_ucCurrLoadMenuID[i]=pgm_read_byte(&Menu_RootID[i]);
               GoTopDispMenuID(m_ucCurrMenuID,4);
               break;
          case MENU_VIEW_UNHANDLEDALR:
	//	for (i=0;i<6;i++)
			   m_ucCurrLoadMenuID[0]=pgm_read_byte(&Menu_ViewID[0]);
               GoTopDispMenuID(m_ucCurrMenuID,1);
		       break;
          case MENU_OPR_MCOOL:
          case MENU_OPR_MHOT:
          case MENU_OPR_MHOTCHANGE:
          case MENU_OPR_MAIRCHANGE:
          case MENU_OPR_AIRCHANGE:
          case MENU_OPR_LEAVE:
          case MENU_OPR_MOREV:
          case MENU_OPR_LOWERV:
		       for (i=0;i<8;i++)
			       m_ucCurrLoadMenuID[i]=pgm_read_byte(&Menu_OprID[i]);
                   GoTopDispMenuID(m_ucCurrMenuID,8);
		       break;
         case MENU_SYSSET_AUXPARA_UPPH1:
         case MENU_SYSSET_AUXPARA_UPPH2:
         case MENU_SYSSET_AUXPARA_UPPH3:
         case MENU_SYSSET_AUXPARA_TIME:
         case MENU_SYSSET_AUXPARA_ADDRESS:
		//disp_buffer[0]=m_ucCurrMenuID;
		//disp_ram_data(0,0,1,0);
		      for (i=0;i<5;i++)
			      m_ucCurrLoadMenuID[i]=pgm_read_byte(&Menu_SysSetID[i]);
		//for (i=0;i<6;i++)
		//	disp_buffer[i]=Menu_SysSetID[i];
		//disp_ram_data(0,2,6,0);
              GoTopDispMenuID(m_ucCurrMenuID,5);

⌨️ 快捷键说明

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