电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

MSP430 Archive.2 Digital IO,Key,LED part2

程序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控制位码。

程序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[i];                //送要显示的数据,就是段数据,如显示0送的是0x3f

    DCTR0;                            //锁存段数据,数码管亮一个时间片刻

    j=j<<1;                           //移位,准备进行下一位的显示

    delay_ms(1);                      //显示一个时间片刻,会影响亮度和闪烁性

  }

}

博主
zuomujie@yeah.net
Galdius
觉得自己浪费了大把的光阴,不能再这么继续下去。。。就从这个博客开始,开始excelsior吧!
点击跳转