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; } void LED_ZhengXiang(unsigned char LED_NUM) //LED从0-7闪烁 { 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; } } void LED_FanXiang(unsigned char LED_NUM) //LED从7-0闪烁 { 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; //设置标志位Flag } 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(); delay_ms(100); while(1) { Key_Scan(); //键盘扫描,看是否有按键按下 if(key == 1 || key == 2) { f = 1; } else if(key == 3 || key == 4) { f = 2; } } }
上一篇:MSP430 LaunchPad定时器中断(连续模式)
下一篇:launchpad MSP430G2553 软件UART和硬件UART及跳帽的设置
推荐阅读最新更新时间:2024-11-21 15:46
设计资源 培训 开发板 精华推荐
- AM1D-2405DH30-RZ ±5V 1 瓦 DC-DC 转换器的典型应用
- 基于CS5090EA的两串锂电池充电模块
- OP284ESZ-REEL 仅 5V、12 位 DAC 摆幅轨到轨运算放大器的典型应用
- AD5313 双轨至轨电压输出、10 位 DAC 的典型应用
- AM1/4S-1203SH30Z 3.3V 0.25W DC-DC转换器的典型应用
- LT6656ACDC-3.3、3.3V 升压输出电流电压基准的典型应用
- LTC2945HMS 宽范围双电源监视器的典型应用
- LTC3215EDD 演示板,低噪声、高电流 LED 闪光灯充电泵,VIN = 2.9V-4.4V,LUM
- C8051F991DK,用于工业应用的 C8051F991 8051 微控制器的开发系统
- 基于STM32H7高性能芯片的图像处理模块