MSP430 学习笔记(四)键盘的使用
看一看实验板上键盘的接法,如下图所示,可以看到,它与51键盘接法也没有什么区别。
以下程序功能是实现K1~K4分别被按下时,在数码管上分别显示1~4。
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]; //用一位数码管显示
}
}
}
}
看来,键盘处理程序与其他单片机键盘处理程序也没有什么区别。主要就是来看一看设置。
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是输出寄存器。
下面让我们对程序略作修改,实现我们自己的功能。
按键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个灯全灭。
文章评论(0条评论)
登录后参与讨论