求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 init(void)

{

P1DIR=0XFF

P1OUT=0x00

P2DIR=0XFF

P2OUT=0x00

P3DIR=0XF0

P3OUT|=0XF0

}

中有个

P1DIR=0XFF

P1OUT=0x00

很简单的啊,不太清楚你的电路图,我把主要程序写一下:

#include<reg52.h>

unsigned char flag=0//设置flag作为标志位,初值为0,一旦产生中断,将其置1

void main()

{

EA=1//开总中断

EX0=1//开外部中断0 ,假设是由P3.2产生的中断

IT0=1//设置产生中断的方式,这是表示下降沿触发

P0=0X0F//假设矩阵键盘接P0口,给所有列线低电平,所有行线高电平

while(1)

{

if(flag==1) //这个是表示,如果中断不产生,下面的程序不会运行,只有中断了,才会键盘扫描

{

按键扫描程序,这个我就不写了,写法有很多啦

}

数码管显示程序,这个我也不写了,不晓得你是什么电路图

}

}

void scan() interrupt 0

{

flag=1//表示,一旦中断产生了,将flag置1

}

希望对你有用,呵呵


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存