msp430的矩阵键盘程序Word文档格式.docx

上传人:b****5 文档编号:17506638 上传时间:2022-12-06 格式:DOCX 页数:10 大小:19.68KB
下载 相关 举报
msp430的矩阵键盘程序Word文档格式.docx_第1页
第1页 / 共10页
msp430的矩阵键盘程序Word文档格式.docx_第2页
第2页 / 共10页
msp430的矩阵键盘程序Word文档格式.docx_第3页
第3页 / 共10页
msp430的矩阵键盘程序Word文档格式.docx_第4页
第4页 / 共10页
msp430的矩阵键盘程序Word文档格式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

msp430的矩阵键盘程序Word文档格式.docx

《msp430的矩阵键盘程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《msp430的矩阵键盘程序Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。

msp430的矩阵键盘程序Word文档格式.docx

P1OUT=0;

P1IES=0xf0;

//P1.4~P1.7允许中断

P1IE 

=0xf0;

//P1.4~P1.7下降沿触发中断

P1IFG=0;

//中断标志清0

Key_Val=0;

}

Check_Key

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

//p14\5\6\7接上拉电阻

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

key_Val对应键值 

列:

[p14] 

[p15] 

[p16] 

[p17]

↓ 

↓ 

行:

[p13]→ 

[p12]→ 

[p11]→ 

10 

11 

12 

[p10]→ 

13 

14 

15 

16 

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

voidCheck_Key(void)

{

unsignedcharrow,col,tmp1,tmp2;

unsignedcharkeymap[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

//设置键盘逻辑键值

tmp1=0x08;

for(row=0;

row<

4;

row++) 

//行扫描

P1OUT=0x0f;

//P1.0~P1.3输出全1

P1OUT-=tmp1;

//P1.0~p1.3输出四位中有一个为0

tmp1>

>

=1;

if((P1IN&

0xf0)<

0xf0) 

//是否P1IN的P1.4~P1.7中有一位为0

tmp2=0x10;

//tmp2用于检测出哪一位为0 

for(col=0;

col<

col++) 

//列检测 

if((P1IN&

tmp2)==0x00) 

//是否是该列,等于0为是

Key_Val=keymap[row*4+col];

//获取键值

return;

//退出循环

tmp2<

<

=1;

//tmp2右移1位 

}

delay

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

t=tmp*5*clk根据使用时钟调整tmp值

voiddelay(void)

unsignedinttmp;

for(tmp=12000;

tmp>

0;

tmp--);

Key_Event

检测按键,并获取键值

voidKey_Event(void)

unsignedchartmp;

P1OUT=0;

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

tmp=P1IN;

//获取p1IN

if((tmp&

0xf0)<

0xf0) 

//如果有键按下

delay();

//消除抖动

Check_Key();

//调用check_Key(),获取键值

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

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

SW=0:

关闭;

ELSE:

打开

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

voidCtrlKey(unsignedcharsw)

if(sw==0)

P1IE=0;

//关闭端口中断

else

P1IE=0xf0;

//打开端口中断

/*端口1按键中断*/

#pragmavector=PORT1_VECTOR

__interruptvoidPort(void)

if((P1IFG&

0xf0)!

=0)

Key_Event();

if(Key_Val!

=0) 

//键值!

=0有键按下

{

CtrlKey(0);

//关键盘中断

P1IFG=0

1OUT=0;

//清中断标志

下面的程序是自己改了下,端口发生了变化!

按键矩阵也发生了变化!

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

voidmain()

WDTCTL=WDTPW+WDTHOLD;

Init_Keypad();

_BIS_SR(LPM3_bits+GIE);

//最低功耗睡眠

while

(1);

P1DIR=0x38;

P1IES=0xC0;

=0xC0;

//p13\14\15接上拉电阻

[p13] 

[p17]→ 

[p16]→ 

unsignedcharkeymap[]={1,2,3,4,5,6};

//从(xxxx1xxx相左移)

3;

//列扫描

P1OUT=0x38;

//P1.3~P1.5输出全1

//P1.3~p1.5输出四位中有一个为0

tmp1<

0xC0)<

0xC0) 

tmp2=0x80;

2;

//行检测 

tmp2>

if((P1IN&

0XC0)<

0XC0)

Check_Key();

switch(Key_Val)

case1:

自己接相应按键的功能

break;

case2:

break;

case3:

case4:

case5:

case6:

default:

P1IFG=0;

下面这个按键用了数组了,存放按键的值,可以应用于密码锁之类的应用!

为网上淘来

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

//此示例程序为中断方式,得到键盘的键值,存放在队列keybuff[10]中

//此示例程序没有显示,

//键盘的按键按下引起P1口的中断服务程序,得到键盘的键值,保存到键值队列

//在其他的中断服务程序中通过键值队列中的数据引导程序的流程

#include<

msp430x14x.h>

unsignedcharkeybuff[10];

unsignedcharkeypoint=0;

voiddelay(intv)

while(v!

=0)v--;

unsignedcharkey(void)

unsignedcharx=0xff;

P1DIR=0X0F;

P1OUT=0X01;

//扫描第一行

0X70)==0X10) 

x=0;

else

0X70)==0X20)

x=1;

if((P1IN&

0X70)==0x40)

x=2;

else 

P1OUT=0X2;

//扫描第二行

0X70)==0X10)

x=3;

x=4;

x=5;

P1OUT=0X4;

//扫描第三行

x=6;

x=7;

x=8;

{P1OUT=8;

//扫描第四行

x=9;

x=10;

x=11;

return(x);

unsignedcharkeyj(void) 

{unsignedcharx;

P1DIR=0x0f;

P1OUT=0x0f;

//键盘硬件:

P10--P13为行线,最上面一根为P10

x=(P1IN&

0X70);

// 

P14--P16为列线,最左边一根为P14,列线下拉

return(x);

//无按键,返回0?

;

有按键返回非0

interrupt[PORT1_VECTOR]voidport1key(void)

if(keyj()!

=0X00)

delay(300) 

//消抖动

=0X0)

keybuff[keypoint]=key();

//按键见键值保存到队列

keypoint++;

//

if(keypoint==10)

keypoint=0;

P1OUT=0X0F;

P1IFG=0X0;

//清除中断标志

voidmain(void)

WDTCTL=WDTPW+WDTHOLD;

/* 

//StopWDT*/

P1DIR=0XF;

P1OUT=0XF;

P1IES=0X0;

P1IE=0X70;

//列线上升沿允许P1中断

_EINT();

/*/Enableinterrupts 

*/

while

(1)

LPM0;

_NOP();

这个是单个按键是,输入端的P1REN要设为1。

允许上拉电阻!

关于msp430g2553的按键程序,虽然很简单,但是纠结了一个下午,错就错在看视频的时候那个老师的片子没有加上拉电阻但是正常运行,我的却不可以,现在找到问题,希望对和我一样遇着这个问题的人有所帮助;

#include"

msp430g2553.h"

#definekeyin(P1IN&

0x08)

voiddelay(void);

intmain(void)

//Stopwatchdogtimerto

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1