平凡

MSP430学习笔记(4)

0
阅读(2235)

MSP430 学习笔记(四)键盘的使用

1.键盘硬件连接

看一看实验板上键盘的接法,如下图所示,可以看到,它与51键盘接法也没有什么区别。

以下程序功能是实现K1~K4分别被按下时,在数码管上分别显示1~4。

2.程序实现

void main( void )

{

uchar temp,keyval = 0;

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

BoardConfig(0x88); //打开数码管,关闭流水灯和电平转换

P1DIR = BIT7; //设置P1.0~P.3为输入状态,P.7为输出

P1OUT = 0;

P3DIR |= BIT4; //设置P3.4为输出状态

P3OUT |= BIT4; //P3.4输出1

P4DIR = 0xff;

P5DIR = 0xff;

P4OUT = 0x3f;

P5OUT = 0xf7;

while(1)

{

if(keyin != 0x0f) //如果有键被按下

{

delay(); //延时消抖

if(keyin != 0x0f) //再次检测按键状态

{

temp=keyin;

while(keyin != 0x0f); //等待按键被放开

switch(temp) //转换键值

{

case 0x0e:

keyval = 1;break;

case 0x0d:

keyval = 2;break;

case 0x0b:

keyval = 3;break;

case 0x07:

keyval = 4;break;

default:

keyval = 0;break;

}

P4OUT = scandata[keyval]; //用一位数码管显示

}

}

}

}

看来,键盘处理程序与其他单片机键盘处理程序也没有什么区别。主要就是来看一看设置。

3.一些符号的函义

1.P1DIR

查找这个符号,可以看到在msp430x14x.h中有这样的定义:

#define P1DIR_ (0x0022) /* Port 1 Direction */

DEFC( P1DIR , P1DIR_)

再查找数据手册:

这样,第1行就不难理解了。定义P1DIR_这个符号是0x0022,即其P1的方向控制寄存器地址。

第2行如何理解呢?查网络,见到这样一段例子

1、#define ME1_ (0x0004)
DEFC( ME1 , ME1_)
me1关联端口0x0004
defc的c是字节的意思,也就是me1 就是地址0004处的一个字节

按此推导,P1DIR是地址0x0022处的一个字节。是否因为MSP430是16位系统,因此所有地址都是16位的,而P1DIR是一个字节,因此需要这样转换一下。

BIT7的定义同样在头文件中:

#define BIT7 (0x0080)

按注释P1DIR=0x0080相当于P1.7作为输出,而P1.0~P1.6均作为输入。也就是P1DIR相应位是0时,引脚作为输入使用,而P1DIR相应位是1时,引脚作为输出使用。从下图可以看出。

按上图所示,当P1DIR某位是0时,门1和门2关闭,门3打开,即该引脚作为输入使用(看图中的红色框)。

当P1DIR某位是1时,门1和门2打开,门3关闭,即该引脚作为输出使用。

P1OUT相关定义如下:

#define P1OUT_ (0x0021) /* Port 1 Output */

DEFC( P1OUT , P1OUT_)

即P1OUT是输出寄存器。

4.修改程序,实现自己的功能

下面让我们对程序略作修改,实现我们自己的功能。

按键K1~K4被定义为分别点亮R、G、B三个发光管,这三个发光管分别接在P2.0,P2.1和P2.2引脚上。

void main( void )

{

uchar temp,keyval = 0;

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

BoardConfig(0xf0); //关闭数码管和电平转换,打开流水灯

P1DIR = BIT7; //设置P1.0~P.3为输入状态,P.7为输出

P1OUT = 0;

P2DIR = 0xff; //设置P2口方向为输出

P2OUT = 0xff;

while(1)

{

if(keyin != 0x0f) //如果有键被按下

{

delay(); //延时消抖

if(keyin != 0x0f) //再次检测按键状态

{

temp=keyin;

while(keyin != 0x0f); //等待按键被放开

switch(temp) //转换键值

{

case 0x0e:

keyval = 0xfe;break;

case 0x0d:

keyval = 0xfd;break;

case 0x0b:

keyval = 0xfb;break;

case 0x07:

keyval = 0xff;break;

default:

keyval = 0;break;

}

P2OUT=keyval;

}

}

}

}

程序实现:修改好代码,编译链接开始仿真。全速运行,按下K1,红灯亮,按下K2绿灯亮,按下K3,蓝灯亮。按下K4,3个灯全灭。