原创 MSP430 Archive.2 Digital IO,Key,LED part1

2013-11-3 18:24 912 1 1 分类: MCU/ 嵌入式
本节内容主要结合MSP430的IO总结按键及数码管的相关内容及程序。

IO简介
1、每组IO可任意组合输入输出
2、P1和P2可中断,且可独立配置其中断
3、独立的输出输入寄存器
注意,430不能位操作,所有对IO中单独位的操作均需要波兰表达式实现。在430中BIT0~BIT7是常用的组合。
比如,对P1^4置位:P1OUT |= BIT4;对P1^4复位:P1OUT &=~ BIT4.

操作
430的部分IO具有功能复用或中断,IO操作可按下面步骤设置
1、是否功能复用?设置PxSEL
2、设置IO或复用方向。设置PxDIR
3、若为输出,设置输出寄存器PxOUT。若为输入,查询输入寄存器PxIN。
4、若用到中断,开始中断PxIE;设置上升沿或下降沿PxIES;查询中断标志PxIFG。
5、设置不使用的IO。手册上是这么说的
个人觉得把IO设置成输出低电平即可,即PxDIR = 0XFF;PxOUT = 0X00;

键盘
键盘同LED一样都是基础,任何开发板都少不了,这两样是所有交互的基础,此archive试着尽量整理更多的键盘和LED的知识并提供结合430的例程。
1、键盘一般分为矩阵式和普通的单独按键,矩阵式一般为行列扫描,单独的按键一般结合中断。
2、所有的键盘均需要考虑消抖操作,消抖一般采用延时和重复查询方式。
3、键盘需要上拉电阻构成强1电平。
20131103182119715.jpg
程序1    4*4矩阵键盘扫描子程序,采用逐行(列)扫描的方式
    采用扫描方式,假设KEY0~KEY7连接到P1^0~P1^7.高4位输入,低4位输出。
    key为全局变量
//**********************************************************************
// 4*4矩阵键盘扫描子程序,采用逐行(列)扫描的方式
//**********************************************************************
uchar Key_Scan_4*4(void) 
{
  uchar statevalue,key_checkin,key_check;
  P1SEL = 0X00;                            //设置为普通IO,可省
  P1DIR = 0X0F;                            //高四位输入,低4位输出
  P1OUT= 0XF0;                           //高四位输出值无意义,低四位输出0,
                                                    //当有按键按下时,高4位输入值被拉低
  
  key_checkin=P1IN;                  //读取IO口状态,判断是否有键按下
  if(key_checkin!=0xf0)               //IO口值发生变化则表示有键按下
  {
    delay_ms(20);                     //键盘消抖,延时20MS
    key_checkin=P1IN;
    if(key_checkin!=0xf0)
    {
      P1OUT=0xfe;                    //逐行扫描开始
      P1OUT=0xfe;                    //写两次延时,下同
      key_check=P1IN;
      switch (key_check)               //根据读到的IO口值判断按键的按下情况
      {
        case 0xee:key=15;break;
        case 0xde:key=11;break;
        case 0xbe:key=8;break;
        case 0x7e:key=4;break;
     }
     
     P1OUT=0xfd;
     P1OUT=0xfd;
     key_check=P1IN;
     switch (key_check)
     {
        case 0xed:key=14;break;
        case 0xdd:key=10;break;
        case 0xbd:key=7;break;
        case 0x7d:key=3;break;
     }
     
     P1OUT=0xfb;
     P1OUT=0xfb;
     key_check=P1IN;
     switch (key_check)
     {
        case 0xeb:key=13;break;
        case 0xdb:key=0;break;
        case 0xbb:key=6;break;
        case 0x7b:key=2;break;
     }
     
     P1OUT=0xf7;
     P1OUT=0xf7;
     key_check=P1IN;
     switch (key_check)
     {
        case 0xe7:key=12;break;
        case 0xd7:key=9;break;
        case 0xb7:key=5;break;
        case 0x77:key=1;break;
     }
     
    }
  }
  else
  {
    statevalue=0xff;                      //无按键时返回值0XFF
    key=statevalue;
    return(key);
  }
  return(key);                                 //有按键按下时返回按键值
}




PARTNER CONTENT

文章评论0条评论)

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