MSP430定时器综合试验(2学时)

1.实验目的

    学会定时器使用。

2.实验要求

    掌握定时器的定时控制编程。

3.实验内容

(1)编写键盘扫描程序。

(2)编写LED显示程序。

(3)用定时器控制8个LED循环显示程序(间隔时间1秒)。

(4)编写用键控制LED灯循环方向,按键可以随时切换。。


#include <msp430x14x.h>
#include "Config.h"                     //开发板配置头文件,主要配置IO端口信息


uchar Flag=0;                           //标志位
uchar Time=0;                           //时间计数变量
uchar count=0;
uchar key;
int f;
//***********************************************************************
//               MSP430IO口初始化
//***********************************************************************
void Port_Init()
{
  P1SEL = 0x00;                   //P1普通IO功能
  P1DIR = 0xF0;                   //P10~P13输入模式,外部电路已接上拉电阻
  P6DIR  = 0xFF;                      //设置IO口方向为输出
  LED8 = 0xFF;                        //P6口初始设置为FF
}


//***********************************************************************
//             TIMERA初始化,设置为UP模式计数
//***********************************************************************
void TIMERA_Init(void)                                   //连续计数模式,计数到0XFFFF产生中断
{
  TACTL |= TASSEL1 + TACLR + ID0 + ID1 + MC0 + TAIE;     //SMCLK做时钟源,8分频,连续计数模式,计数到0XFFFF,开中断
  CCR0=9999;
}


//***********************************************************************
//             TIMERA中断服务程序,需要判断中断类型
//***********************************************************************
#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
  switch(TAIV)                                  //需要判断中断的类型
  {
  case 2:break;
  case 4:break;
  case 10:count++;break;                         //设置标志位Flag
  }
  if(count==100){
    Flag++;
    count =0; 
  }
}


void LED_ZhengXiang()    //LED从0-7闪烁
{
  switch(Flag%8)
  {
    case 0: LED8=0xfe; break;
    case 1: LED8=0xfd; break;
    case 2: LED8=0xfb; break;
    case 3: LED8=0xf7; break;
    case 4: LED8=0xef; break;
    case 5: LED8=0xdf; break;
    case 6: LED8=0xbf; break;
    case 7: LED8=0x7f; break;
  }
}


void LED_FanXiang()      //LED从7-0闪烁
{
  switch(Flag%8)
  {
    case 0: LED8=0x7f; break;
    case 1: LED8=0xbf; break;
    case 2: LED8=0xdf; break;
    case 3: LED8=0xef; break;
    case 4: LED8=0xf7; break;
    case 5: LED8=0xfb; break;
    case 6: LED8=0xfd; break;
    case 7: LED8=0xfe; break;
  }
}


uchar Key_Scan(void) 
{
  uchar key_check;
  uchar key_checkin;
  key_checkin=KeyPort;          //读取IO口状态,判断是否有键按下
  key_checkin&= 0x0F;          //读取IO口状态,判断是否有键按下
  if(key_checkin!=0x0F)            //IO口值发生变化则表示有键按下
    {
      delay_ms(20);                  //键盘消抖,延时20MS
      key_checkin=KeyPort;
      if(key_checkin!=0x1F)
        {  
          key_check=KeyPort;
          switch (key_check & 0x0F)
            {
              case 0x0E:key=1;break;
              case 0x0D:key=2;break;
              case 0x0B:key=3;break;
              case 0x07:key=4;break;
            }
          
        }
      
   }
  else
   {
     key=0xFF;        
   }
  return key;





//*************************************************************************
//           主函数
//*************************************************************************
void main(void)

  WDT_Init();                                   //看门狗设置
  Clock_Init();                                 //系统时钟设置
  Port_Init();                                  //端口初始化
  TIMERA_Init();                                //设置TIMERA
  _EINT();
  delay_ms(100);
  while(1)
  {
    Key_Scan();                       //键盘扫描,看是否有按键按下
      if(key!=0xff)                     //如果有按键按下,则显示该按键键值1~4
      {
          if(key == 1 || key == 2)
          {
            f = 0;
          }
          else if(key == 3 || key == 4)
          {
            f = 1;
          }
          if(f == 0)
            while(1)
            {
              LED_ZhengXiang();
              Key_Scan();                       //键盘扫描,看是否有按键按下
              if(key!=0xff)                     //如果有按键按下,则显示该按键键值1~4
              {
                  if(key == 1 || key == 2)
                  {
                    f = 0;
                  }
                  else if(key == 3 || key == 4)
                  {
                    f = 1;
                  }
              }
              if(f == 1)
                break;
            }
          else
          {
            while(1)
            {
              LED_FanXiang();
              Key_Scan();                       //键盘扫描,看是否有按键按下
              if(key!=0xff)                     //如果有按键按下,则显示该按键键值1~4
              {
                  if(key == 1 || key == 2)
                  {
                    f = 0;
                  }
                  else if(key == 3 || key == 4)
                  {
                    f = 1;
                  }
              }
              if(f == 0)
                break;
            }
          }
      }
      else{
        LED8 = 0xff;
      }
  }
}

猜你喜欢

转载自blog.csdn.net/huluwadeyeye/article/details/80765095