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

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

//msp430F149

4*4矩阵键盘P1口中断扫描

#include<msp430x14x.h>

#define

KEY_DIR

P1DIR

#define

KEY_OUT

P1OUT

#define

KEY_IN

P1IN

#define

KEY_IE

P1IE

#define

KEY_IES

P1IES

#define

KEY_IFG

P1IFG

/***************全局变量***************/

unsigned

char

Key_Val

//存放键值

void

CtrlKey(unsigned

char

sw)

//控制键盘开关//sw=0关

sw=1开

/*******************************************

函数名称:Init_Keypad

能:初始化扫描键盘的IO端口

数:无

返回值

:无

********************************************/

void

Init_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

}

/*******************************************

函数名称:Check_Key

能:扫描键盘的IO端口,获得键值

数:无

返回值

:无

********************************************/

//p14\5\6\7

接上拉电阻

/***************************************

key_Val

对应键值

列:[p14]

[p15]

[p16]

[p17]

行:

[p13]→

1

2

3

4

[p12]→

5

6

7

8

[p11]→

9

10

11

12

[p10]→

13

14

15

16

***************************************/

void

Check_Key(void)

{

unsigned

char

row

,col,tmp1,tmp2

unsigned

char

keymap[]

=

{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}//设置键盘逻辑键值

与程序计算键值的映射

tmp1

=

0x08

for(row

=

0row

<

4row++)

//行扫描

{

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

=

0col

<

4col++)

//

列检测

{

if((KEY_IN

&

tmp2)

==

0x00)

//

是否是该列,等于0为是

{

Key_Val

=

keymap[row*4

+

col]

//

获取键值

return

//

退出循环

}

tmp2

<<=

1

//

tmp2右移1位

}

}

}

}

/*******************************************

函数名称:delay

能:延时约15ms,完成消抖功能

数:无

返回值

:t=

tmp*5*clk

根据使用时钟调整tmp值

********************************************/

void

delay(void)

{

unsigned

int

tmp

for(tmp

=

12000tmp

>

0tmp--)

}

/*******************************************

函数名称:Key_Event

能:检测按键,并获取键值

数:无

返回值

:无

********************************************/

void

Key_Event(void)

{

unsigned

char

tmp

KEY_OUT

=0

//

设置P1OUT全为0,等待按键输入

tmp

=

KEY_IN

//

获取

p1IN

if((tmp

&

0xf0)

<

0xf0)

//如果有键按下

{

delay()

//消除抖动

Check_Key()

//

调用check_Key(),获取键值

}

}

/*********************************************************************

控制打开或者关闭键盘中断

SW=

0:关闭;

ELSE:打开

*********************************************************************/

void

CtrlKey(unsigned

char

sw)

{

if(sw==0)

KEY_IE

=0

//关闭端口中断

else

KEY_IE

=0xf0

//打开端口中断

}

/*端口1按键中断*/

#pragma

vector=PORT1_VECTOR

__interrupt

void

Port(void)

{

if((KEY_IFG&0xf0)!=0)

{

Key_Event()

if(Key_Val!=0)

//键值!=0有键按下

{

CtrlKey(0)

//关键盘中断

}

}

KEY_IFG=0KEY_OUT=0

//清中断标志

}

#include <intrins.h>  //_nop_()所需头文件

/*************键盘扫描******错误*********/

void scan()

{

unsigned int media

P2=0x0f

_nop_()     //在这里延时一个或几个指令周期试试

P2=P2|0xf0

key=P2

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7709498.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-08
下一篇2023-04-08

发表评论

登录后才能评论

评论列表(0条)

    保存