#include <msp430x14x.h>
typedef unsigned char uchar;
typedef unsigned int uint; /***************全局变量***************/
uchar key_pressed; //按键是否被按下:1--是,0--否
uchar key_val;//存放键值
uchar key_flag;//按键是否已放开:1--是,0--否
uchar key_map[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
/*******************************************
函数名称:Init_Keypad
功 能:初始化扫描键盘的IO端口
参 数:无
返回值 :无
********************************************/
void Init_Keypad(void)
{
P1DIR=0X3f; //P1.0-P1.5设置为输出
P1OUT |=0X3f; //置P1.0-P1.5为高电平
P2DIR=0XC0; //P2.6-P2.7设置为输出
P2OUT |=0XC0; //置P2.6-P2.7为高电平
key_flag=0;
key_pressed=0;
key_val=0;
}
/*******************************************
函数名称:Check_Key
功 能:扫描键盘的IO端口,获得键值
参 数:无
返回值 :无
********************************************/
void check_key(void)
{
uchar row,col,tmp1,tmp2;
tmp1=0x20;
for(row=0;row<6;row++) //行扫描
{
P1OUT=0X3F; //P1.0-P1.5全输出1
P1OUT -=tmp1; //P10-P1.5输出六位中有一个为0
tmp1>>=1;
if((P2IN&0X3F)<0X3F) //是否P2IN的P2.0-P2.5中有一个为0
{
tmp2=0x01; //tmp2用于检测出哪一位为0
for(col=0;col<6;col++)
{
if((P2IN&tmp2)==0x00)
{
key_val=key_map[row*6+col];
return;
}
tmp2<<=1;
}
}
}
}
/*******************************************
函数名称:delay
功 能:延时约15ms,完成消抖功能
参 数:无
返回值 :无
********************************************/
void delay()
{
uint tmp;
for(tmp=12000;tmp>0;tmp--);
}
/*******************************************
函数名称:Key_Event
功 能:检测按键,并获取键值
参 数:无
返回值 :无
********************************************/
void key_event(void)
{
uchar tmp;
P1OUT&=0X00; //设置P1OUT全是0,等待按键输入
tmp=P2IN; //获取P2IN
if((key_pressed==0x00)&&((tmp&0x3f)<0x3f))
{
key_pressed=1;
delay();
check_key();
}
else if((key_pressed==1)&&((tmp&0x3f)==0x3f))
{
key_pressed=0;
key_flag=1;
}
else
{
_NOP();
}
}
这样改能实现6*6么?大神帮忙看看 |