求MSP430单片机4X4矩阵键盘的中断扫描程序?

2022-03-24 教育 85阅读
//msp430F1494*4矩阵键盘P1口中断扫描
#include

#defineKEY_DIRP1DIR
#defineKEY_OUTP1OUT
#defineKEY_INP1IN
#defineKEY_IEP1IE
#defineKEY_IESP1IES
#defineKEY_IFGP1IFG


unsignedcharKey_Val;//存放键值

voidCtrlKey(unsignedcharsw);//控制键盘开关//sw=0关sw=1开


voidInit_Keypad(void)
{
KEY_DIR=0x0f;//P1.0~P1.3设置为输出状态,P1.4~P1.7输入状态(上拉H)
KEY_OUT=0;

KEY_IES=0xf0;//P1.4~P1.7允许中断
KEY_IE=0xf0;//P1.4~P1.7下降沿触发中断
KEY_IFG=0;//中断标志清0

Key_Val=0;
}


//p14\5\6\7接上拉电阻

voidCheck_Key(void)
{
unsignedcharrow,col,tmp1,tmp2;
unsignedcharkeymap[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};//设置键盘逻辑键值

与程序计算键值的映射

tmp1=0x08;
for(row=0;row<4;row++)//行扫描
{
KEY_OUT=0x0f;//P1.4~P1.7输出全1
KEY_OUT-=tmp1;//P1.4~p1.7输出四位中有一个为0
tmp1>>=1;
if((KEY_IN&0xf0)<0xf0)//是否P1IN的P1.0~P1.3中有一位为0
{
tmp2=0x10;//tmp2用于检测出哪一位为0
for(col=0;col<4;col++)//列检测
{
if((KEY_IN&tmp2)==0x00)//是否是该列,等于0为是
{
Key_Val=keymap[row*4+col];//获取键值
return;//退出循环
}
tmp2<<=1;//tmp2右移1位
}
}
}
}


voiddelay(void)
{
unsignedinttmp;

for(tmp=12000;tmp>0;tmp--);
}

voidKey_Event(void)
{
unsignedchartmp;

KEY_OUT=0;//设置P1OUT全为0,等待按键输入
tmp=KEY_IN;//获取p1IN
if((tmp&0xf0)<0xf0)//如果有键按下
{
delay();//消除抖动
Check_Key();//调用check_Key(),获取键值
}
}


voidCtrlKey(unsignedcharsw)
{
if(sw==0)
KEY_IE=0;//关闭端口中断
else
KEY_IE=0xf0;//打开端口中断
}


#pragmavector=PORT1_VECTOR
__interruptvoidPort(void)
{
if((KEY_IFG&0xf0)!=0)
{
Key_Event();
if(Key_Val!=0)//键值!=0有键按下
{
CtrlKey(0);//关键盘中断
}
}

KEY_IFG=0;KEY_OUT=0;//清中断标志
}
声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com