求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

//清中断标志

}

大概可以这么写void EXIT(){ key_read()//读键值 function = 0x01//判断键值}void key_judge(){ switch(键值) { case 键值雹袜1: {function=0x10break} case 键值2: {function=0x11break} . . . }}void key_handing1();//按键1处理{ 处理…… function = 0}void man(){ INIT()while(1) { if(function == 0x01) key_judge();//键值判断 if(function == 0x10) key_handing1();//按键1处理 if(function == 0x11) key_handing2();//按键2处理 。中春 。源培激 。 }}

中断你定时器判断键盘时候有按键,设立一个标志,然后你主程序里面的键大锋盘处理通过判断这个标志是有成立来决定时候进入键盘处理部分。

比如:

void time0() interrupt 2

{

//重载time0的时间设定

//添加你的键盘扫描程序,有按键就让标行嫌志置1

}

void main()

{

//自己的代码

if(滚带晌标志==1)

{

//键盘处理;

}

}


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

原文地址: http://outofmemory.cn/yw/12566433.html

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

发表评论

登录后才能评论

评论列表(0条)

保存