实验四: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;
}
}
}