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)
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)