原创 MSP430学习笔记(4)

2011-8-6 14:12 2318 10 10 分类: MCU/ 嵌入式

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

1.键盘硬件连接

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

20110806141201001.jpg

以下程序功能是实现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_)

再查找数据手册:

20110806141222001.jpg

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

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

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

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

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

#define BIT7                (0x0080)

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

20110806141222002.jpg

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

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

P1OUT相关定义如下:

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

DEFC(   P1OUT             , P1OUT_)

P1OUT是输出寄存器。

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

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

按键K1~K4被定义为分别点亮RGB三个发光管,这三个发光管分别接在P2.0,P2.1P2.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,蓝灯亮。按下K43个灯全灭。

 

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /2 下一条