求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

//清中断标志

}

4x4键盘的程序有扫描法与线反法,但我个人认为用线反法较好,用扫描法得依次扫描所有行或列,如果用线反法就简单多了。先使键盘的行置为低、列置为高(或列置为高、行置为低),接着读回端口的值。比如:如果使用P0为键盘接口就先使低四位为低、高四位为高即P0=0xf0然后就读回P0口的值赋给一个变量,a=P0紧接就给行列赋相反的值行置为高、列置为低(或列置为低、行置为高)即P0=0x0f然后就读回再与a运算就能得到唯一的识别码下面的程序就是用线反写一个4x4键盘识别程序:#include<AT89X52.H>

#include<delay.h>#define KEY_SCAN P1

#define uchar unsigned char//char num/********************************/

/*函数名称:KEY_DOWN() */

/*函数功能:延时子函数 */

/*参数:无 */

/*返回:返回1或0*/

/*备注:1表示有键按下,0则无*/

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

bit KEY_DOWN()

{

KEY_SCAN=0x0f //先给键盘口赋个初值

if(KEY_SCAN!=0x0f) //判断是有按键按下,即KEY_SCAN不等于初值时有键按下

{

delayms(10)//消抖

if(KEY_SCAN!=0x0f) //再次判断是否真有键按下

return 1 //真有就返回1没有返回零

else

return 0

}

else

return 0

}/********************************/

/*函数名称:SCAN_GET() */

/*函数功能:键盘值函数 */

/*参数:无 */

/*返回:返回1或0*/

/*备注:无 */

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

uchar SCAN_GET()

{

char button

uchar key_code

button=KEY_SCAN

KEY_SCAN=0xf0

button=(button|KEY_SCAN)

while(KEY_SCAN!=0xf0)

delayms(10)

switch(button)

{

case 0xd7: key_code='1'break

case 0xdb: key_code='2'break

case 0xdd: key_code='3'break

case 0xb7: key_code='4'break

case 0xbb: key_code='5'break

case 0xbd: key_code='6'break

case 0x77: key_code='7'break

case 0x7b: key_code='8'break

case 0x7d: key_code='9'break

case 0xeb: key_code='0'break

case 0xee: key_code=0xeebreak

default : break

}

return key_code

}

//////////////////////////////////////////////////////////////

//此程序是上两个程序结合的

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

/*函数名称:Key_Get() */

/*函数功能:键盘扫描函数*/

/*参数:无 */

/*返回:无 */

/*备注:无 */

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

void Key_Get()

{

char button

KEY_SCAN=0x0f

if(KEY_SCAN!=0x0f)

{

delayms(5)

if(KEY_SCAN!=0x0f)

{

button=KEY_SCAN

KEY_SCAN=0xf0

button=(button|KEY_SCAN)

while(KEY_SCAN!=0xf0)

switch(button)

{

case 0xd7: num='1'P0=0x00break

case 0xdb: num='2'P0=0x0fbreak

case 0xdd: num='3'break

case 0xb7: num='4'break

case 0xbb: num='5'break

case 0xbd: num='6'break

case 0x77: num='7'break

case 0x7b: num='8'break

case 0x7d: num='9'break

case 0xeb: num='0'break

case 0xe7: num='a'break

case 0xed: num='b'break

case 0xee: num='c'break

case 0xde: num='d'break

case 0xbe: num='e'break

case 0x7e: num='f'break

default : break

}

}

}

}

淘bao 旺铺: 广州华电 单片机学习板 单片机外围学习模块/传感器模块

//4*4键盘检测程序,按下键后相应的代码显示在数码管上

#include<reg51.h>

sbit beep=P2^3

sbit dula=P2^6

sbit wela=P2^7

unsigned char i=100

unsigned char j,k,temp,key

void delay(unsigned char i)

{

for(j=ij>0j--)

for(k=125k>0k--)

}

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}

display(unsigned char num)

{

P0=table[num]

dula=1

dula=0

P0=0xc0

wela=1

wela=0

}

void main()

{

dula=0

wela=0

while(1)

{

P3=0xfe

temp=P3

temp=temp&0xf0

if(temp!=0xf0)

{

delay(10)

if(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xee:

key=0

break

case 0xde:

key=1

break

case 0xbe:

key=2

break

case 0x7e:

key=3

break

}

while(temp!=0xf0)

{

temp=P3

temp=temp&0xf0

beep=0

}

beep=1

display(key)

P1=0xfe

}

}

P3=0xfd

temp=P3

temp=temp&0xf0

if(temp!=0xf0)

{

delay(10)

if(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xed:

key=4

break

case 0xdd:

key=5

break

case 0xbd:

key=6

break

case 0x7d:

key=7

break

}

while(temp!=0xf0)

{

temp=P3

temp=temp&0xf0

beep=0

}

beep=1

display(key)

}

}

P3=0xfb

temp=P3

temp=temp&0xf0

if(temp!=0xf0)

{

delay(10)

if(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xeb:

key=8

break

case 0xdb:

key=9

break

case 0xbb:

key=10

break

case 0x7b:

key=11

break

}

while(temp!=0xf0)

{

temp=P3

temp=temp&0xf0

beep=0

}

beep=1

display(key)

}

}

P3=0xf7

temp=P3

temp=temp&0xf0

if(temp!=0xf0)

{

delay(10)

if(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xe7:

key=12

break

case 0xd7:

key=13

break

case 0xb7:

key=14

break

case 0x77:

key=15

break

}

while(temp!=0xf0)

{

temp=P3

temp=temp&0xf0

beep=0

}

beep=1

display(key)

}

}

}

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存