📄 key.c
字号:
#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 + -