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

📄 key_isr.c

📁 基于SPMC75的变频电机驱动例子,相当于一个简单的变频器. 望对变频器开发的工程式师有一定的帮助!
💻 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 + -