📄 key_isr.c
字号:
//========================================================================
// The information contained herein is the exclusive property of
// Sunplus Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
// (C) COPYRIGHT 2004 SUNPLUS TECHNOLOGY CO.
// ALL RIGHTS RESERVED
// The entire notice above must be reproduced on all authorized copies.
//========================================================================
//========================================================================
// Filename: Key_ISR.c
// Author: Lianshu Mou (email: Lianshu@sunnorth.com.cn)
// Date: 2004/12/22
// Description:
//
// Reference:
// Revision:
// 2004/12/22 First version
//========================================================================
#include "Spmc75_regs.h"
#include "mcMACRO.h"
#include "Option.h"
#include "Display_ISR.h"
#include "Display.h"
#include "BCD-BIN.h"
#include "Backup_VAR.h"
#include "Data_Backup.h"
#include ".\SPWM_Lib\SPWM_ISR.h"
#define Key_CD_MAX 15
void Backup_Data_Read(unsigned int *Data_Temp,int Data_NUM);
struct
{
unsigned int Key_Data_buffer;
int Key_Data_Q;
int Key_Data_Mode;
int Key_Data_D;
int Key_Data_MIN;
int Key_Data_MAX;
} Key_Ctrl;
int DF;
int Key_Step;
int Key_CD_NUM = 0;
int Data_NUM;
extern void Err_RESET(void);
extern int Err_Num;
void Key_Data_dispose(int Key_NUM);
void Exit_Data_Set(int NUM);
//=================================================================================================
// ----Function: void KeyISR_Init(void);
// -Description: 初始参数初始化
// --Parameters: None
// -----Returns: None
// -------Notes: None
//=================================================================================================
void KeyISR_Init(void)
{
Key_CD_NUM = 0; //工作环境的建立
Key_Step = 0;
Backup_Data_Read(&Key_Ctrl.Key_Data_buffer,0);//加载频率设置数据
Dis_set.Display_state = 0; //切回正常的显示
}
//=================================================================================================
// ----Function: void Key_Mode_ISR(void);
// -Description: 模式键被按下的服务函数
// --Parameters: None
// -----Returns: None
// -------Notes: 除参数保存外其它已没有问题
//=================================================================================================
void Key_Mode_ISR(void)
{
unsigned int Temp;
switch(Key_Step)
{
case 0: //进入设置项选择界面
Dis_set.Display_state = 3;
LED_Dis_fill(23,0,0); //显示"Pr"
LED_Dis_fill(24,1,0);
Temp = BIN_BCD(Key_CD_NUM); //显示菜单号
LED_Dis_fill(Temp&0x0f,3,0);
Temp = Temp >> 4;
LED_Dis_fill(Temp&0x0f,2,0);
Backup_Data_Read(&Key_Ctrl.Key_Data_buffer,Key_CD_NUM); //加载设置数据
Key_Step = 1;
break;
case 1: //进入数据设置界面
Dis_set.Display_state = 2; //初始化数据显示
Data_NUM = 0; //注意数码管的位序
if(Key_Ctrl.Key_Data_Mode > 0) CD_Data_Dis(Key_Ctrl.Key_Data_buffer);
else
{
if(DIV16(Key_Ctrl.Key_Data_buffer,Key_Ctrl.Key_Data_Q) < 100)
DF = 2; //如果数据小于某值则调整小数点位置
else DF = 1;
Data_Dis_ISR(Key_Ctrl.Key_Data_buffer,Key_Ctrl.Key_Data_Q,DF);
}
Set_LED_Flash(3-Data_NUM,1);
Key_Step = 2;
break;
case 2: //数据设置完毕
Set_LED_Flash(3-Data_NUM,0);
Exit_Data_Set(Key_CD_NUM); //数据设置退出处理
Backup_Data_Read(&Key_Ctrl.Key_Data_buffer,0);//加载频率设置数据
Dis_set.Display_state = 0; //切回正常的显示
Key_Step = 0;
break;
default: break;
}
}
//=================================================================================================
// ----Function: unsigned int Data_DF_ACC(unsigned int Data,int Dir);
// -Description: 数据设置时的数据调整,带Q格式小数的
// --Parameters: None
// -----Returns: None
// -------Notes: 没有问题
//=================================================================================================
unsigned int Data_DF_ACC(unsigned int Data,int Dir)
{
unsigned int ADD_Temp,Temp;
Temp = Data_NUM;
if(Temp < DF) //计算数据增量
{ //增量小于1
Temp = DF - Temp;
switch(Temp)
{
case 1: ADD_Temp = 10;
break;
case 2: ADD_Temp = 100;
break;
case 3: ADD_Temp = 1000;
break;
default: break;
}
ADD_Temp = DIV16(Key_Ctrl.Key_Data_Q,ADD_Temp);
}
else
{ //增量大于1
Temp = Temp - DF;
switch(Temp)
{
case 0: ADD_Temp = 1;
break;
case 1: ADD_Temp = 10;
break;
case 2: ADD_Temp = 100;
break;
case 3: ADD_Temp = 1000;
break;
default: break;
}
ADD_Temp = ADD_Temp * Key_Ctrl.Key_Data_Q;
}
if(Dir > 0) Data += ADD_Temp; //数据增加
else if(Data >= ADD_Temp)
Data -= ADD_Temp; //数据减少
return(Data);
}
//=================================================================================================
// ----Function: void key_NUM_shift(void);
// -Description: 数据移位键处理
// --Parameters: None
// -----Returns: None
// -------Notes: 没有问题
//=================================================================================================
void key_NUM_shift(void)
{
if(Key_Step == 2) //数据设置时的移位,注意数码管位序
{
Set_LED_Flash(3-Data_NUM,0); //当前位设为正常模式
Data_NUM ++; //指向下一位
if(Key_Ctrl.Key_Data_Mode < 1)
{
if(Data_NUM > 3)
{
if(DF == 2)
{
Data_NUM = 3;
DF = 1;
}
else if(DF == 1)
{
Data_NUM = 0;
if(DIV16(Key_Ctrl.Key_Data_buffer,Key_Ctrl.Key_Data_Q) < 100)
DF = 2; //如果数据小于某值则调整小数点位置
}
}
Data_Dis_ISR(Key_Ctrl.Key_Data_buffer,Key_Ctrl.Key_Data_Q,DF);
}
else if(Data_NUM > 2)
{
Data_NUM = 0;
CD_Data_Dis(Key_Ctrl.Key_Data_buffer);
}
Set_LED_Flash(3-Data_NUM,1); //设置相应的位为闪烁
}
else if(Key_Step == 0) //显示数据切换
{ //显示数据属性设置,决定当前显示数据的特性
if(Dis_set.Dis_Num < 3) Dis_set.Dis_Num ++;
else Dis_set.Dis_Num = 0;
}
}
//=================================================================================================
// ----Function: void Data_UP_Key(void);
// -Description: 数据增加键处理
// --Parameters: None
// -----Returns: None
// -------Notes: 没有问题
//=================================================================================================
void Data_UP_Key(void)
{
unsigned int Temp;
if(Key_Step == 0)
{
Key_F_Buffer += 5;
if(Key_F_Buffer > Key_Ctrl.Key_Data_MAX)
Key_F_Buffer = Key_Ctrl.Key_Data_MAX;
Data_Dis_ISR(Key_F_Buffer,Key_Ctrl.Key_Data_Q,DF);
}
else if(Key_Step == 1)
{
Key_CD_NUM ++;
Backup_Data_Read(&Key_Ctrl.Key_Data_buffer,Key_CD_NUM); //加载设置数据
while(Key_Ctrl.Key_Data_D == 4) //跳过保留区
{
Key_CD_NUM ++;
Backup_Data_Read(&Key_Ctrl.Key_Data_buffer,Key_CD_NUM); //加载设置数据
}
if(Key_CD_NUM > Key_CD_MAX)
{
Key_CD_NUM = 0;
Backup_Data_Read(&Key_Ctrl.Key_Data_buffer,Key_CD_NUM);
}
Temp = BIN_BCD(Key_CD_NUM); //显示菜单号
LED_Dis_fill(Temp&0x0f,3,0);
Temp = Temp >> 4;
LED_Dis_fill(Temp&0x0f,2,0);
}
else if(Key_Step == 2)
{ //根据数据位决定数据的增加量,同时数据的最大值不能大于最大限定
if(!((SPMC75_Return_Moto_state() > STOP)&&(Key_Ctrl.Key_Data_D > 0)))
{ //只设置允许的参数
if(Key_Ctrl.Key_Data_Mode < 1)
{ //带小数数据设置
Key_Ctrl.Key_Data_buffer = Data_DF_ACC(Key_Ctrl.Key_Data_buffer,1);
if(Key_Ctrl.Key_Data_buffer > Key_Ctrl.Key_Data_MAX)
Key_Ctrl.Key_Data_buffer = Key_Ctrl.Key_Data_MAX;
Data_Dis_ISR(Key_Ctrl.Key_Data_buffer,Key_Ctrl.Key_Data_Q,DF);
}
else
{ //整数数据设置
if(Data_NUM == 0) Key_Ctrl.Key_Data_buffer += 1;
else if(Data_NUM == 1) Key_Ctrl.Key_Data_buffer += 10;
else if(Data_NUM == 2) Key_Ctrl.Key_Data_buffer += 100;
else if(Data_NUM == 3) Key_Ctrl.Key_Data_buffer += 1000;
if(Key_Ctrl.Key_Data_buffer > Key_Ctrl.Key_Data_MAX)
Key_Ctrl.Key_Data_buffer = Key_Ctrl.Key_Data_MAX;
CD_Data_Dis(Key_Ctrl.Key_Data_buffer);
}
}
}
}
//=================================================================================================
// ----Function: void Data_Down_Key(void);
// -Description: 数据减少键处理
// --Parameters: None
// -----Returns: None
// -------Notes: 没有问题
//=================================================================================================
void Data_Down_Key(void)
{
unsigned int Temp;
if(Key_Step == 0)
{
Key_F_Buffer -= 5;
if(Key_F_Buffer <= Key_Ctrl.Key_Data_MIN)
Key_F_Buffer = Key_Ctrl.Key_Data_MIN;
Data_Dis_ISR(Key_F_Buffer,Key_Ctrl.Key_Data_Q,DF);
}
else if(Key_Step == 1)
{
Key_CD_NUM --;
Backup_Data_Read(&Key_Ctrl.Key_Data_buffer,Key_CD_NUM); //加载设置数据
while(Key_Ctrl.Key_Data_D == 4) //跳过保留区
{
Key_CD_NUM --;
Backup_Data_Read(&Key_Ctrl.Key_Data_buffer,Key_CD_NUM); //加载设置数据
}
if(Key_CD_NUM < 0)
{
Key_CD_NUM = Key_CD_MAX;
Backup_Data_Read(&Key_Ctrl.Key_Data_buffer,Key_CD_NUM);
}
Temp = BIN_BCD(Key_CD_NUM); //显示菜单号
LED_Dis_fill(Temp&0x0f,3,0);
Temp = Temp >> 4;
LED_Dis_fill(Temp&0x0f,2,0);
}
else if(Key_Step == 2)
{
if(!((SPMC75_Return_Moto_state() > STOP)&&(Key_Ctrl.Key_Data_D == 1)))
{ //只设置允许的参数
if(Key_Ctrl.Key_Data_buffer > 0)
{ //数据减
if(Key_Ctrl.Key_Data_Mode < 1)
{ //带小数数据设置
Key_Ctrl.Key_Data_buffer = Data_DF_ACC(Key_Ctrl.Key_Data_buffer,0);
if(Key_Ctrl.Key_Data_buffer <= Key_Ctrl.Key_Data_MIN)
Key_Ctrl.Key_Data_buffer = Key_Ctrl.Key_Data_MIN;
Data_Dis_ISR(Key_Ctrl.Key_Data_buffer,Key_Ctrl.Key_Data_Q,DF);
}
else
{ //整数数据设置
if((Data_NUM == 0)&&(Key_Ctrl.Key_Data_buffer > 0)) Key_Ctrl.Key_Data_buffer -= 1;
else if((Data_NUM == 1)&&(Key_Ctrl.Key_Data_buffer > 9)) Key_Ctrl.Key_Data_buffer -= 10;
else if((Data_NUM == 2)&&(Key_Ctrl.Key_Data_buffer > 99)) Key_Ctrl.Key_Data_buffer -= 100;
else if((Data_NUM == 3)&&(Key_Ctrl.Key_Data_buffer > 999)) Key_Ctrl.Key_Data_buffer -= 1000;
CD_Data_Dis(Key_Ctrl.Key_Data_buffer);
}
}
}
}
}
//=================================================================================================
// ----Function: void Key_Data_dispose(int Key_NUM);
// -Description: 键盘数据处理,命令分配
// --Parameters: 传递的参数是键号
// -----Returns: None
// -------Notes: 没有问题
//=================================================================================================
void Key_Data_dispose(int Key_NUM)
{
switch(Key_NUM)
{
case 1: Data_Down_Key();
break;
case 2: if((SPMC75_Return_Moto_state() == STOP)&&(F_CH_Set < 2)) //允许启动并且电机在停止状态
SPMC75_Start_Moto(Moto_DIR); //启动电机
break;
case 3: if((Err_Num > 0)&&(Err_Num != 5)) Err_RESET(); //异常时的复位
else if(SPMC75_Return_Moto_state() > MOTO_Start) //允许停止并且电机在运行状态
SPMC75_Stop_Moto(0); //停止
break;
case 4: key_NUM_shift();
break;
case 5: Key_Mode_ISR(); //模式键按下时的服务
break;
case 6: Data_UP_Key();
break;
default: break;
}
}
//=================================================================================================
// ----Function: void Exit_Data_Set(int NUM);
// -Description: 键盘数据设置退出处理
// --Parameters: 传递的参数是菜单号
// -----Returns: None
// -------Notes: 没有问题
//=================================================================================================
extern int UP_Down_Time_NEW;
void Exit_Data_Set(int NUM)
{
switch(NUM)
{
case 8:
case 9: Backup_VAR[NUM] = Key_Ctrl.Key_Data_buffer;
UP_Down_Time_NEW = 1;//得新计算加减速参数
Data_Write(NUM,Backup_VAR[NUM]);//保存数据入EEPROM
break;
default: if(NUM > 0)
{
if(SPMC75_Return_Moto_state() == STOP)
{
Backup_VAR[NUM] = Key_Ctrl.Key_Data_buffer;
Data_Write(NUM,Backup_VAR[NUM]);
}
}
else
{
Backup_VAR[NUM] = Key_Ctrl.Key_Data_buffer;
Data_Write(NUM,Backup_VAR[NUM]);
}
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -