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

📄 key.c

📁 基于MAX1968的TEC控制程序
💻 C
字号:
/*****************************************************************************\
文件名:key.c
编写者:czhang
描述:MSP430非行列式键盘。适用于MSP430F449,其他型号的需要适当改变。
      使用P1.3、P1.4、P1.5三个I/O口接按键。

版本:1.0	2009-1-22
\*****************************************************************************/
#include <MSP430x44x.h>
#include "key.h"
#include "pid.h"
#include "cry1602.h"
//#include "df_timera.h"

//选用端口定义
#define KEYDIR P1DIR
#define KEYIES P1IES
#define KEYIE P1IE
#define KEYIN P1IN
#define KEYIFG P1IFG

//定义键盘管脚
#define KEY0 BIT3
#define KEY1 BIT4
#define KEY2 BIT5
#define KEY_MOD (KEY0+KEY1+KEY2)

unsigned char KeyZhi=KEY_NONE;  	//经过确认的键值
unsigned char KeyCnt;			//某次连续按键的次数,这里取1,2或者3
unsigned char KeyDown=KEY_NONE; 	//被按下的键

//unsigned int p,i,d;

#define KEY_TIME 50    			//连续按键经过此时间,按键次数加1

unsigned pid_step=1;                    //PID参数的步长
unsigned pid_step_div=10;               //PID参数的步长分度


unsigned char KeyTime; 			//记录连续按键的时间
/*****************************************************************************
初始化
键盘初始化程序                          //会不会于P1.2方波输出有冲突???
*****************************************************************************/
void InitKey()
{
	KEYDIR &= ~(KEY0+KEY1+KEY2); 	//设置端口为输入
	KEYIES |= KEY0+KEY1+KEY2;    	//设置下降沿中断
	KEYIE |= KEY0+KEY1+KEY2; 	//打开端口中断
	KeyCnt=0;			//按键次数请零
}

void Delay_XiaoDou(void)
{
  int i=100;
  while(i--)
  {}
  //for(i=100;i--;i>0);                    //延迟一点时间,消除抖动
}

/*****************************************************************************
打开或者关闭键盘中断
sw: 0:关闭   100:打开
*****************************************************************************/
void GoKey(unsigned char sw)
{
	if(sw==0)
		KEYIE &= ~(KEY0+KEY1+KEY2); 	//关闭端口中断,会不会影响到P1.2的输出???
	else
		KEYIE |= KEY0+KEY1+KEY2; 	//打开端口中断
}

/*****************************************************************************
获得键值和连续按下的键的有效次数,并清除记录的键值和有效次数
key_cnt:返回某一键被连续按下的有效次数
返回值:按下的有效的键的键值
*****************************************************************************/
unsigned char GetKeyZhi(unsigned char *key_cnt)
{
	unsigned char q0;
	q0=KeyZhi;
	KeyZhi=KEY_NONE;   					//清除键值
	*key_cnt =KeyCnt;
	KeyCnt=0;
	return q0;
}

/*****************************************************************************
判断按键的有效性
*****************************************************************************/
void IsKey()
{
	if((KEYIN&KEY_MOD)==KEY_MOD)
	{
		//没有键按下
		KeyDown=KEY_NONE;
		//GotimeDfA(0);      	//关闭定时器
		GoKey(100);        	//打开键盘中断
	}
	else
	{
		if(KeyTime==0)
		{
			//连续按键的时间到
			KeyTime=KEY_TIME;
			if((KEYIN|KEY0==KEY0)&&KeyDown==KEY_P13)
			{
				//P1.3按键按下
				KeyCnt++;
				KeyZhi=KEY_P13;
			}
			else if((KEYIN|KEY1==KEY1)&&KeyDown==KEY_P14)
			{
				//P1.4按键按下
				KeyCnt++;
				KeyZhi=KEY_P14;
			}
			else if((KEYIN|KEY2==KEY2)&&KeyDown==KEY_P15)
			{
				//P1.5按键按下
				KeyCnt++;
				KeyZhi=KEY_P15;
			}
			else
			{
				KeyDown=KEY_NONE;
				//GotimeDfA(0);  			//关闭定时器
				GoKey(100);   				//打开键盘中断
			}
		}
		else
		{
			KeyTime--;
		}
	}
}

/*****************************************************************************
端口1中断函数
多中断中断源:P1IFG.0~P1IFG7,键盘中断只用到P1.3 P1.4 P1.5三个中断源
进入中断后应首先判断中断源,退出中断前应清除中断标志,否则将再次引发中断
******************************************************************************/
/*#pragma vector=PORT1_VECTOR
__interrupt void Port1()
{
	unsigned char q0=0;                    //有无按键,按下标志
        
        unsigned char *sp = "PID---Setup";     //第一行显示:PID———Setup
        unsigned char *sxp="Xp:";              //第二行显示:Xp:
        unsigned char *sxi="Xi:";              //第二行显示:Xi:
        unsigned char *sxd="Xd:";              //第二行显示:Xd:
        unsigned char p_add,i_add,d_add;       //PID参数改变标志符
        unsigned int xp_new,xi_new,xd_new;     //新的PID参数值
        unsigned char lcd1602_pid_buffer[6];   //lcd1602的显示缓冲区
        
	if((KEYIFG&KEY0) ==KEY0)
	{
		//处理P1IN.3中断
		KEYIFG &= ~KEY0;		//清除中断标志
		KeyDown=KEY_P13;  		//记录按下的键值
		q0=1;
                //DispStr(0,0,sp);                //菜单键,液晶第一行显示:PID---Setup
                DispNChar(0,0,11,sp); 
                IsKey();                        //判断按了几次按键
                if(KeyCnt==0x01)
                {
                  p_add=1;                      //来确定是改哪个参数
                  DispNChar(0,1,3,sxp);             //如果按键一次,则液晶第二行显示Xp:
                }
                else if(KeyCnt==0x02)
                {
                  i_add=1;                      //来确定是改哪个参数
                  DispNChar(0,1,3,sxi);             //如果按键一次,则液晶第二行显示Xi:
                }
                else if(KeyCnt==0x03)
                {
                  d_add=1;                      //来确定是改哪个参数
                  DispNChar(0,1,3,sxd);             //如果按键一次,则液晶第二行显示Xd:               
                }
                else
                {
                  ;
                }
                
	}
	else if((KEYIFG&KEY1) ==KEY1)           //+键
	{
		//处理P1IN.4中断
		KEYIFG &= ~KEY1;		//清除中断标志
		KeyDown=KEY_P14;  		//记录按下的键值
		q0=1;
                //DispStr(0,0,sp);                //菜单键,液晶第一行显示:PID---Setup
                DispNChar(0,0,11,sp); 
                IsKey();                        //判断按了几次按键
                if(KeyCnt==0x01)
                {
                  if(p_add==1)
                  {
                    xp_new=pid_xp_value_add(pid_step,pid_step_div);     //改变xp参数的值
                    
                    //xp_new=xp*10;
                    lcd1602_pid_buffer[0]='0'+xp_new%100;            //取百位  
                    lcd1602_pid_buffer[1]='0'+(xp_new/10)%10;        //取十位
                    lcd1602_pid_buffer[2]='.';
                    lcd1602_pid_buffer[3]='0'+xp_new%10;             //取个位
                    
                    DispNChar(4,1,12,lcd1602_pid_buffer);                 //显示新更改后的数据
                    
                  }
                  else if(i_add==1)
                  {
                    xi_new=pid_xi_value_add(pid_step,pid_step_div);     //改变xp参数的值
                    
                    //xi_new=xi*10;
                    lcd1602_pid_buffer[0]='0'+xi_new%100;            //取百位  
                    lcd1602_pid_buffer[1]='0'+(xi_new/10)%10;        //取十位
                    lcd1602_pid_buffer[2]='.';
                    lcd1602_pid_buffer[3]='0'+xi_new%10;             //取个位
                    
                    DispNChar(4,1,12,lcd1602_pid_buffer);                 //显示新更改后的数据
                  }
                  else if(d_add==1)
                  {
                    xd_new=pid_xd_value_add(pid_step,pid_step_div);     //改变xp参数的值
                    
                    //xd_new=xp*10;
                    lcd1602_pid_buffer[0]='0'+xd_new%100;            //取百位  
                    lcd1602_pid_buffer[1]='0'+(xd_new/10)%10;        //取十位
                    lcd1602_pid_buffer[2]='.';
                    lcd1602_pid_buffer[3]='0'+xd_new%10;             //取个位
                    
                    DispNChar(4,1,12,lcd1602_pid_buffer);                 //显示新更改后的数据
                  }
                  else
                  {
                    ;
                  }
                  //显示处理子程序
                  
                  
                                                 //补充一个计算数值的函数????????????????
                  //DispStr(4,1,sxp);             //如果按键一次,则对应的设置值加0.1
                }
                else
                {
                  ;
                }
	}
	else if((KEYIFG&KEY2) ==KEY2)            //-键
	{
		//处理P1IN.5中断
		KEYIFG &= ~KEY2;		//清除中断标志
		KeyDown=KEY_P15;  		//记录按下的键值
		q0=1;
                //DispStr(0,0,sp);                //菜单键,液晶第一行显示:PID---Setup
                DispNChar(0,0,3,sp); 
                IsKey();                        //判断按了几次按键
                if(KeyCnt==0x01)
                {
                  if(p_add==1)
                  {
                    xp_new=pid_xp_value_dec(pid_step,pid_step_div);     //改变xp参数的值
                    
                    //xp_new=xp*10;
                    lcd1602_pid_buffer[0]='0'+xp_new%100;            //取百位  
                    lcd1602_pid_buffer[1]='0'+(xp_new/10)%10;        //取十位
                    lcd1602_pid_buffer[2]='.';
                    lcd1602_pid_buffer[3]='0'+xp_new%10;             //取个位
                    
                    DispNChar(4,1,12,lcd1602_pid_buffer);                 //显示新更改后的数据
                  }
                  else if(i_add==1)
                  {
                    xi_new=pid_xi_value_dec(pid_step,pid_step_div);     //改变xp参数的值
                    
                    //xi_new=xp*10;
                    lcd1602_pid_buffer[0]='0'+xi_new%100;            //取百位  
                    lcd1602_pid_buffer[1]='0'+(xi_new/10)%10;        //取十位
                    lcd1602_pid_buffer[2]='.';
                    lcd1602_pid_buffer[3]='0'+xi_new%10;             //取个位
                    
                    DispNChar(4,1,12,lcd1602_pid_buffer);                 //显示新更改后的数据
                    
                  }
                  else if(d_add==1)
                  {
                    xd_new=pid_xd_value_dec(pid_step,pid_step_div);     //改变xp参数的值
                    
                    //xd_new=xp*10;
                    lcd1602_pid_buffer[0]='0'+xd_new%100;            //取百位  
                    lcd1602_pid_buffer[1]='0'+(xd_new/10)%10;        //取十位
                    lcd1602_pid_buffer[2]='.';
                    lcd1602_pid_buffer[3]='0'+xd_new%10;             //取个位
                    
                    DispNChar(4,1,12,lcd1602_pid_buffer);                 //显示新更改后的数据
                  }
                  else
                  {
                    ;
                  }
                  //显示处理子程序
                  
                                                 //补充一个计算数值的函数????????????????
	}
	else
	{
		//其他干扰引起的中断,不进行处理,只清除中断标志
		//KEYIFG=0;                    //定时器0引起的中断和这里没有影响吗?
	}

	if(q0==1)
	{
		GoKey(0);			//关闭键盘中断
		KeyTime=0;
		KeyCnt=0;
		//GotimeDfA(100);			//打开定时器A
	}
}
}
*/


⌨️ 快捷键说明

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