
你要放到“死循袭备环”中不断扫描。他的原理图一般是这样的
以第一个按键为例,当你按下时I/O口读到的数据就不是0x0f了。好吧你最开始的赋值错了。你要用0xee,0xde检测的话你应该给0xfe。拍梁毁每四个按键是一组。我这有一个我做密码锁的程序你参考一下。
void key()
{
P3=0xfe
if(P3!=0xfe)
{
time(50)
if(P3!=0xfe)
{
switch(P3)
{
case 0xee:num=1,cs++
break
case 0xde:num=2,cs++
break
case 0xbe:num=3,cs++
break
case 0x7e:num=4,cs++
break
}
渣悉 }
while(P3!=0xfe)
}
P3=0xfd
if(P3!=0xfd)
{
time(50)
if(P3!=0xfd)
{
switch(P3)
{
case 0xed:num=5,cs++
break
case 0xdd:num=6,cs++
break
case 0xbd:num=7,cs++
break
case 0x7d:num=8,cs++
break
}
}
while(P3!=0xfd)
}
P3=0xfb
if(P3!=0xfb)
{
time(50)
if(P3!=0xfb)
{
switch(P3)
{
case 0xeb:num=9,cs++
break
case 0xdb:num=0,cs++
break
case 0xbb:cs++
break
case 0x7b:num=10,cs=0,a=b=c=d=e=f=10,ply=1
break
}
}
while(P3!=0xfb)
}
}
ucharkeyscan(void)//键盘扫描函数,使用行列反转扫描法
比如:行为低电位,列为高四位
{
uchar
cord_h,cord_l//行列值
P3=0x0f
//行线输出全为0
cord_h=P3&0x0f
//读入列线值
if(cord_h!=0x0f)
//这个句话意思是这样的,如果有启余按键按下的话。那肯定就不是0x0f了。
{
主要就是识别按键按下作用
delay(100)
//去抖
if(cord_h!=0x0f)
//这是双重判定作用而已
{
cord_h=P3&0x0f
//读入列线值
P3=cord_h|0xf0
//输出当前列线值
cord_l=P3&0xf0
//读入液碧行线值
return(cord_h+cord_l)//键盘最后组合码值
}
}return(0xff)
//返回该值
}
好像你的程序解释得很好了。但是好像这么快,最好要延时下才准的。
我教闹旁举你按键的原理吧
就是那根线如果是高电平的话,遇到底电平就会变为底电平的。所以如果有按键按下的话,高电平就会变为低电平了。所以就可以读取了。
//msp430F1494*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
//清中断标志
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)