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

📄 msp430key.c

📁 此为2007年全国大学生电子设计大赛A题音频信号分析仪的源代码
💻 C
字号:
#include<MSP430x16x.h>
#include"MSP430KEY.h"
#include"df_timera.h"

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

//定义键盘管脚
#define KEY_MOD_H 0x0F  //行端口的模(0x0F)
#define KEY_MOD_L 0xF0  //列端口的模(0xF0)
#define KEY_LIE 4

unsigned char KeyZhi=KEY_NONE;   //经过确认的键值
unsigned char KeyCnt;            //某次连续按键的次数
unsigned char KeyDown=KEY_NONE;  //记录连续按键的时间

#define KEY_TIME 50              //连续按键经过此时间,按键次数加1
unsigned char KeyTime;           //记录连续按键的时间

/***************************************************************************
初始化
***************************************************************************/
void InitKey()
{
	KEYDIR &=~KEY_MOD_H;       //设置行端口为输入
	KEYDIR |=KEY_MOD_L;        //设置列端口为输出
	KEYOUT &=~KEY_MOD_L;       //设置列端口输出为低电平
	KEYIES |=KEY_MOD_H;        //设置行端口下降沿中断
	KEYIE |=KEY_MOD_H;         //打开行端口中断
        KEYIFG=0;
	KeyCnt=0;                  //按键次数清零
}

/***************************************************************************
打开或者关闭键盘中断
SW: 0:关闭;   100:打开
***************************************************************************/
void GoKey(unsigned char sw)
{
	if(sw==0)
		KEYIE &=~KEY_MOD_H;     //关闭端口中断
	else
		KEYIE |=KEY_MOD_H;      //打开端口中断
}

/***************************************************************************
获得键值和连续按下的键的有效次数,并清除记录的键值和有效次数
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()
{
	unsigned char key;
	key=ReadKey();
	if(key==KEY_NONE)
	{
		//没有键按下
		KeyDown=KEY_NONE;
		GotimeDfA(0);             //关闭定时器
		GoKey(100);               //打开键盘中断
	}
	else
	{
		if(KeyTime==0)
		{
			KeyTime=KEY_TIME;
			if(key==KeyDown)
			{
				KeyCnt++;
				KeyZhi=key;
			}
			else
			{
				KeyDown=KEY_NONE;
				GotimeDfA(0);     //关闭定时器
				GoKey(100);       //打开键盘中断
			}
		}
		else 
			KeyTime--;
	}
}

/*****************************************************************************
端口1中断函数
多中断中断源:P1IFG。0~P1IFG。7,只响应行端口的中断
进入中断后应首先判断中断源,退出中断前应清除出党中断标志,否则将再次触发中断
*****************************************************************************/
#pragma vector=PORT1_VECTOR
__interrupt void Port1 ()
{
	if((KEYIFG&KEY_MOD_H)!=0)   //判断是否按键触发的中断
	{
		KeyDown=ReadKey();
		if(KeyDown!=KEY_NONE)
		{
			GoKey(0);           //关闭键盘中断
			KeyTime=0;
			KeyCnt=0;
			GotimeDfA(100);     //打开定时器A
		}
	}
	KEYIFG=0;                   //清除中断标志
}

/*****************************************************************************
行列式键盘读取键值,判断哪一个键被按下
返回值:读取的键值
*****************************************************************************/
unsigned char ReadKey()
{
	unsigned char key=0,hang,q0=0,q1;
	//判断按键的列的掩码
	unsigned char lie=0xEF;

	//确定按键的行
	hang=(~KEYIN)&KEY_MOD_H;   //读入的数据取反,然后屏蔽不需要的位
	if(hang!=0)
	{
		//确定按键的列
		for(q0=0;q0<KEY_LIE-1;q0++)
		{
			KEYOUT=0xFF;
			KEYOUT&=lie;       //某一列输出为高电平 ,其他输出为低电平//某一列端口输出低电平,其他输出高电平
			q1=KEYIN&KEY_MOD_H;
			if((q1&hang)==0)
			{
				break;         //确定了列值
			}
			lie<<=1;
		}
		if(q0!=KEY_LIE)
		{
			key=hang+((~lie)&KEY_MOD_L); //键值为行值+列值
		}
		else
			key=KEY_NONE;
	}
	else
		key=KEY_NONE;
	KEYOUT &=(~KEY_MOD_L);      //设置列端口为输出低电平
	return key;
}

/**************************************************************
键盘处理,返回相应的整数值
**************************************************************/
unsigned int KeyHandle(unsigned char keyIndex)
{
  P3DIR=0xFF;
  P3OUT=~keyIndex;
  if(keyIndex==0x11)
    return 1;
  if(keyIndex==0x21)
    return 2;
  if(keyIndex==0x41)
    return 3;
  if(keyIndex==0x12)
    return 4;
  if(keyIndex==0x22)
    return 5;
  if(keyIndex==0x42)
    return 6;
  if(keyIndex==0x14)
    return 7;
  if(keyIndex==0x24)
    return 8;
  if(keyIndex==0x44)
    return 9;
  if(keyIndex==0x28)
    return 0;
  else return 0;
}


⌨️ 快捷键说明

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