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及跳帽的设置
设计资源 培训 开发板 精华推荐
- AD5312 双路 10 位缓冲数模转换器的典型应用
- 使用 Richtek Technology Corporation 的 RT6576A 的参考设计
- LT6654AHS6-3.3 升压输出电流电压基准的典型应用
- 4-40pin液晶单片机通用测试板V2.1
- LT8303IS5 30 至 80Vin、48Vout 隔离反激式转换器的典型应用电路
- 使用 ROHM Semiconductor 的 BD4929 的参考设计
- 无线耳塞电池超低待机功耗参考设计
- 基于STM32F4的开源伺服驱动器
- LT3091EFE 线性稳压器的典型应用,使用较低值的 RSET 以实现较高的输出电压
- LT6656AIS6-2.048 的典型应用,用于基本连接的 2.048V 电压基准