MSP430矩阵及独立键盘

  在学习MSP430的时候,总是有很多东西记不住,同时又是英文的资料,好多东西也是没怎么看透,英文虽过六级但是看英文资料还是有一种想睡的冲动啊,在学习键盘的时候,我的这块板子有些不同,矩阵键盘和独立键盘公用的,组合式的按键。。这是为了节约硬件的成本啊 。。。

  
  #define keyin    (P1IN & 0x0f)    //低四位保持不变,高4位清零,这个宏定义就是这个意思。

再写主函数的时候有这个语句:    P1DIR = BIT7;               //设置P1.0~P.3为输入状态,P.7为输出
                  P1OUT = 0;          //前面两句确定P1.0~P1.3是独立按键

这是用软件的方式把矩阵键盘独立化,当然P1=BIT7;这一句也可以把BIT7改为BITX(4~7),,这样是确定第几行是独立按键。确实节约了硬件成本啊 。

对于用按键的指示显示到数码管上,就说下数码管的初始化:如下语句

    P4DIR = 0xff;       //P4口对应段选信号
    P5DIR = 0xff;       //P5口对应位选信号
    P4OUT = 0x3f;
    P5OUT = 0xf7;       //4句初始化数码管的IO

有原理图可以知道,在P4.P5输出的时候是说明在第几位数码管上显示。

if(keyin != 0x0f)       //如果有键被按下,说明keyin中有低电平,进入语句中。
        {
            delay();            //延时消抖,人按键是个机械的过程,需要延时来解决,也可以减少硬件的弊端。
            if(keyin != 0x0f)   //再次检测按键状态
            {

    }

while(keyin != 0x0f);   //等待按键被放开,这相当于_nop()一个空语句,如果按键放开,keyin都是高,跳出,如果成立,则在WHILE语句里,说明按键没放开。

下面的程序也就是几种情况啦,用switch语句就可以解决。。。

 

还有一种方式是用中断的方式来读取四个独立式按键的键值还有解决一些其它问题。例如:

void main( void )
{  
    WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗
    BoardConfig(0x88);          //打开数码管,关闭流水灯和电平转换
    
    P1IES = 0x0f;               // P1.0~P1.3选择下降沿中断
    P1IE = 0x0f;                // 打开中断使能
    P1DIR = BIT7;               //设置P1.0~P.3为输入状态,P.7为输出
    P1OUT = 0;
    P4DIR = 0xff;
    P5DIR = 0xff;
    P4OUT = 0x3f;
    P5OUT = 0xf7;
    _EINT();                    //打开全局中断控制位
    while(1)
    {
        LPM1;
        P4OUT = scandata[KeyVal];
    }
}

至于4X4键盘,在51和AVR单片 机中讲的 也多啦,但是第一次看到板子是结合独立按键和矩阵键盘一起的 ,,日、、看来软件的功能是宇宙级别的呀。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MSP430是德州仪器(TI)公司生产的一款微控制器,它可以用来控制各种电子设备。如果你想使用MSP430来控制矩阵键盘,你需要先了解矩阵键盘的原理和接线方法。 矩阵键盘是由多个按键按照一定的排列方式组成的,常见的是4x4和3x4的矩阵键盘。在使用矩阵键盘时,需要将行和列分别接到微控制器的不同引脚上,通过扫描行和列的状态来确定按键是否被按下。 以下是一个简单的MSP430控制矩阵键盘的示例代码,以4x4矩阵键盘为例: ```c #include <msp430.h> #define ROWS 4 #define COLS 4 unsigned char row_pins[ROWS] = {BIT0, BIT1, BIT2, BIT3}; unsigned char col_pins[COLS] = {BIT4, BIT5, BIT6, BIT7}; unsigned char key_map[ROWS][COLS] = {{'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'}}; void init_keyboard() { P1DIR |= (BIT0 | BIT1 | BIT2 | BIT3); // 设置行脚为输出 P1REN |= (BIT4 | BIT5 | BIT6 | BIT7); // 设置列脚为输入 P1OUT &= ~(BIT0 | BIT1 | BIT2 | BIT3); // 行脚输出低电平 } unsigned char get_key() { unsigned char row, col; for (row = 0; row < ROWS; row++) { P1OUT &= ~(BIT0 | BIT1 | BIT2 | BIT3); // 行脚输出低电平 P1OUT |= row_pins[row]; // 设置当前行脚为高电平 for (col = 0; col < COLS; col++) { if ((P1IN & col_pins[col]) == 0) { // 判断当前列脚是否为低电平 return key_map[row][col]; // 返回对应的键值 } } } return 0; // 没有按键按下 } int main(void) { WDTCTL = WDTPW | WDTHOLD; // 禁用看门狗定时器 init_keyboard(); // 初始化矩阵键盘 while (1) { unsigned char key = get_key(); // 获取当前按下的键值 if (key) { // 处理按键事件 } } return 0; } ``` 该示例代码中,先定义了矩阵键盘的行、列引脚以及键值映射表。然后在 `init_keyboard()` 函数中初始化矩阵键盘的引脚状态,将行脚设置为输出、列脚设置为输入,并将行脚输出低电平。在 `get_key()` 函数中,通过循环扫描每一行和每一列的状态来检测按键是否被按下,如果有按键按下,则返回对应的键值。在 `main()` 函数中,通过不断调用 `get_key()` 函数来获取当前按下的键值,并进行相应的处理。 请注意,以上示例代码仅供参考,实际使用时需要根据具体的硬件环境和需求进行相应的修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值