MSP430定时器综合试验

MSP430定时器综合试验

1.实验目的: 学会定时器使用。

2.实验要求:掌握定时器的定时控制编程。

3.实验内容

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

(2)编写LED显示程序。

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

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

代码如下:

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

uchar Flag=0;                           //标志位
uchar Time=0;                           //时间计数变量
uchar count=0;
uchar key;
int f = 0;
uint flag_run = 0;

//***********************************************************************
//               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;
}

//***********************************************************************
//             正向循环LED
//***********************************************************************

void LED_ZhengXiang(unsigned char LED_NUM)
{
  switch(LED_NUM)
  {
    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;
  }
}

//***********************************************************************
//             反向循环LED
//***********************************************************************

void LED_FanXiang(unsigned char LED_NUM)
{
  switch(LED_NUM)
  {
    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;  
}   

//***********************************************************************
//             TIMERA中断服务程序,需要判断中断类型
//***********************************************************************
#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
  switch(TAIV)                                  //需要判断中断的类型
  {
  case 10:count++;break;                        
  }
  if(count==100)
  {
    Flag++;
    count = 0;
    if(f == 1)
    {
      if(flag_run == 1)
      {
        Flag = 8-(Flag%8);
        flag_run = 0;
      }
      LED_ZhengXiang(Flag%8);
    }
    else if(f == 2)
    {
      if(flag_run == 0)
      {
        Flag = 8-(Flag%8);
        flag_run = 1;
      }
      LED_FanXiang(Flag%8);
    }
  }
}

//*************************************************************************
//           主函数
//*************************************************************************
void main(void)
{ 
  WDT_Init();                                   //看门狗设置
  Clock_Init();                                 //系统时钟设置
  Port_Init();                                  //端口初始化
  TIMERA_Init();                                //设置TIMERA
  _EINT();
  while(1)
  {
    Key_Scan();
    if(key==1||key==2)
    {
      f = 1;
    }
    else if(key == 3||key == 4)
    {
      f = 2;
    }
  }
}

你可能感兴趣的:(单片机)