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

2013-11-3 18:26 1142 3 4 分类: MCU/ 嵌入式
程序2    4个独立键盘扫描子程序,采用逐键扫描方式
key为全局变量
//**********************************************************************
// 4独立键盘扫描子程序,采用逐键扫描的方式
//**********************************************************************
 
uchar Key_Scan_4(void) 
{ 
  P1SEL = 0X00;                            //设置为普通IO,可省
  P1DIR = 0X0F;                            //高四位输入,低4位输出
  P1OUT= 0XF0;                           //高四位输出值无意义,低四位输出0,
                                   //当有按键按下时,高4位输入值被拉低
 uchar key_check;
  uchar key_checkin;
  key_checkin=P1IN;                   //读取IO口状态,判断是否有键按下
  key_checkin&= 0xF0;           //屏蔽掉低四位的不确定值
  if(key_checkin!=0xF0)             //IO口值发生变化则表示有键按下
    {
      delay_ms(20);                   //键盘消抖,延时20MS
      key_checkin=P1IN;                //再次读取IO口状态
      if(key_checkin!=0xF0)             //确定是否真正的有键按下
        {  
          key_check=P1IN;              //有键按下,读取端口值
          switch (key_check & 0xF0)     //判断是哪个键按下
            {
              case 0xE0:key=1;break;
              case 0xD0:key=2;break;
              case 0xB0:key=3;break;
              case 0x70:key=4;break;
            }
       }
}
  else
   {
     key=0xFF;                          //无键按下,返回FF
   }
  return key;
}
 

程序3    4个独立键盘扫描子程序,采用中断扫描方式

主程序中开启总中断_EINT();之后进入睡眠就可以了
IO设置别忘了。
  P1IES = 0xF0;                         //P14~P17选择下降沿中断
  P1IE  = 0xF0;                         //打开中断使能
  P1IFG = 0x00;                         //中断标志位清零
//*************************************************************************
// 中断服务函数
//*************************************************************************
#pragma vector=PORT1_VECTOR
__interrupt void  PORT1_ISR(void)
{
  if(P1IFG & 0xF0)
  {
    switch(P1IFG&0xF0)                   //进行一个与操作,避免判断值出现其他影响
    {
    case 0x10:
    if(P1IN == 0xE0)                   //如果是第一个按键被按下
    {
      delay_ms(20);                      //20ms的消抖时间
      if(P1IN == 0xE0)
      {
        while(P1IN != 0xF0);           //等待键释放
        KEY_VAL = 1;                        //标志是第几个按键按下
        P1IFG = 0;                            //清除中断标志
        return;
      }
    }
    
    case 0x20:
      if(P1IN == 0xD0)                 //如果是第二个按键被按下
      {
        delay_ms(20);
        if(P1IN == 0xD0)
        {
          while(P1IN != 0xF0);         //等待键释放
          KEY_VAL = 2;
          P1IFG = 0;
          return;
        }
      }
      
    case 0x40:
      if(P1IN == 0xB0)                //如果是第三个按键被按下
      {
        delay_ms(20);
        if(P1IN == 0xB0)
        {
          while(P1IN != 0xF0);       //等待键释放
          KEY_VAL = 3;
          P1IFG = 0;
          return;
        }
      }
      
    case 0x80:
    if(P1IN == 0x70)                 //如果是第四个按键被按下
    {
      delay_ms(20);
      if(P1IN == 0x70)
      {
        while(P1IN != 0xF0);        //等待键释放
        KEY_VAL = 4;
        P1IFG = 0;
        return;
      }
    }
    
    default:
      while(P1IN != 0xF0);          //等待键释放
      P1IFG = 0;
      return;
        }
    }
}
 
数码管
1、数码管按照接法分为共阴和共阳,一般在数码管和MCU之间需要增加驱动芯片。
2、数码管的段指的是单个数码管显示内容用到的8个部分(或7,无小数点),数码管的位指的是选通与否的控制位。
3、利用人眼的视觉特性,分为动态扫描和静态扫描,各有优缺点。
本程序参考的是如下电路图,4个数码管在一起的模块。其中U7控制选通的LED的段码,U8控制位码。
29600440.jpg
程序1    8个LED依次显示0~7
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void Display(void)
{
   uchar i,j;
   j=0x01;                            //此数据用来控制位选
  for(i=0;i<8;i++)
  {
    DCTR1;                            //控制数码管段数据的74HC573的LE管脚置高
    WCTR1;                            //控制数码管位的74HC573的LE管脚置高
    DATAPORT=~j;                      //设置要显示的位,也就是哪一个数码管亮
    WCTR0;                            //锁存位数据,下面送上段数据以后,就显示出来了                          
    DATAPORT=table;                //送要显示的数据,就是段数据,如显示0送的是0x3f
    DCTR0;                            //锁存段数据,数码管亮一个时间片刻
    j=j<<1;                           //移位,准备进行下一位的显示
    delay_ms(1);                      //显示一个时间片刻,会影响亮度和闪烁性
  }
}
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户403664 2013-11-14 15:56

标题也给个中文翻译呗~
相关推荐阅读
用户1643705 2013-11-03 18:24
MSP430 Archive.2 Digital IO,Key,LED part1
本节内容主要结合MSP430的IO总结按键及数码管的相关内容及程序。IO简介1、每组IO可任意组合输入输出2、P1和P2可中断,且可独立配置其中断3、独立的输出输入寄存器注意,430不能位操作,所有对...
用户1643705 2013-11-03 15:24
MSP430 Archive.1 Basic Clock Module
MSP430F149的时钟还是很简单的,没有锁相环等内容。本部分不包含watchdog及其设置。本部分包含延时内容时钟源:LFXT1CLK:可以接32768Hz低频晶振,也可以接450KHz~8MHz...
用户1643705 2013-11-03 13:41
MSP430 Archive 1 综述
接触MSP430也有两年半的时间了,自己用MSP430写程序也有一年多的时间。这么长的时间内编程水平的提高却没有达到让自己满意的水平,想了想一方面自己也没有很努力,另一方面自己没有做好归纳总结的工作。...
我要评论
1
3
关闭 站长推荐上一条 /3 下一条