msp430的矩阵键盘程序Word文档格式.docx
《msp430的矩阵键盘程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《msp430的矩阵键盘程序Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
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]→
1
2
3
4
[p12]→
5
6
7
8
[p11]→
9
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