单片机
返回首页

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

2019-04-10 来源:eefocus

1.实验目的


    学会定时器使用。


2.实验要求


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


3.实验内容


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


(2)编写LED显示程序。


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


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


4.参考资料


#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;

    }

  }

}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章