求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

//清中断标志

}

安装 程序插件Keymap Editor,进行设置。

具体 *** 作如下:1.先下载 程序插件Keymap Editor运行Keymap Editor插件,选择Edit后,界面上提供了各个场景选择Keymap Editor插件就是让用户在不同场景下设置各个按键的功能,你可以改变你遥控器按键原来的功能,实现退出、关闭、播放列表、关机、重启各种各样的按键映射。

2.返回键停止播放,解决KODI默认在播放时返回键会返回上级菜单而视频继续在后台播放。

3.运行程序插件Keymap Editor---Edit---Fullscrenn Video---Playback---Stop---Edit key---点击并在5秒内按遥控器返回键---退回几步点Save。

4.KODI设置---PVR和直播电视---菜单/OSD---切换频道时显示频道信息。

5.KODI设置---PVR和直播电视---播放---按“确定”确认频道切换--关闭。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存