/****************主函数****************/ void main(void) {
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
// BoardConfig(0xf0); //关闭数码管和电平转换,打开流水灯
CCTL0 = CCIE; //使能CCR0中断
CCR0 = 2047; //设定周期0.5S
TACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式 P6DIR = 0xff; //设置P6口方向为输出 P6OUT = 0xff;
_EINT(); //使能全局中断
LPM3; //CPU进入LPM3模式 }
/******************************************* 函数名称:Timer_A
功 能:定时器A的中断服务函数 参 数:无 返回值 :无
********************************************/ #pragma vector = TIMERA0_VECTOR __interrupt void Timer_A (void) {
P6OUT ^= 0xff; //P2口输出取反 }
/*********************************************** 程序功能:实现流水灯以三种流动方式和四种流动速度 的不同组合而进行点亮\流动\------------------------------------------------
测试说明:观察流水灯流动顺序和速度的变化
************************************************/ /*********************************************** 程序功能:实现流水灯以三种流动方式和四种流动速度 的不同组合而进行点亮\流动\------------------------------------------------
测试说明:观察流水灯流动顺序和速度的变化
************************************************/ #include
uint i = 0,j = 0,dir = 0;
uint flag = 0,speed = 0; //flag--灯光流动方式,speed--灯光流动速度
6
/****************主函数****************/ void main(void) {
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 // BoardConfig(0xf0);
CCTL0 = CCIE; //使能CCR0中断 CCR0 = 50000;
TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,8分频 增计数模式 P6DIR = 0xff; //设置P2口方向为输出 P6OUT = 0xff;
_EINT(); //使能全局中断
LPM0; //CPU进入LPM0模式 }
/******************************************* 函数名称:Timer_A
功 能:定时器A的中断服务函数,在这里通过标志 控制流水灯的流动方向和流动速度 参 数:无 返回值 :无
********************************************/ #pragma vector = TIMERA0_VECTOR __interrupt void Timer_A (void) {
if(flag == 0) {
P6OUT = ~(0x80>>(i++)); //灯的点亮顺序D8 -> D1 }
else if(flag == 1) {
P6OUT = ~(0x01<<(i++)); //灯的点亮顺序D1 -> D8 } else {
if(dir) //灯的点亮顺序 D8 -> D1,D1 -> D8,循环绕圈 {
P6OUT = ~(0x80>>(i++)); } else {
P6OUT = ~(0x01<<(i++));
7
} }
if(i == 8) {
i = 0; dir = ~dir; }
j++;
if(j == 40) {
i = 0; j = 0; flag++;
if(flag == 4) flag = 0; switch(speed) {
case 0:
TACTL &=~ (ID0 + ID1); TACTL |= ID_3; break; case 1:
TACTL &=~ (ID0 + ID1); TACTL |= ID_2; break; case 2:
TACTL &=~ (ID0 + ID1); TACTL |= ID_1; break; case 3:
TACTL &=~ (ID0 + ID1); TACTL |= ID_0; break; default: break; }
if(flag != 3) speed++; if(speed == 4) speed = 0; } }
/******************************************************* 程序功能:用从P2.3和P2.4输出的PWM波形驱动LED闪烁 P2.3口输出方波的占空比为75%
8
P2.4口输出方波的占空比为25% -------------------------------------------------------
测试说明:观察LED的亮灭的时间长短 用来连2.3到6.1口看 *******************************************************/ #include
WDTCTL = WDTPW + WDTHOLD; // 关狗
//BoardConfig(0xb0); // 关闭数码管和电平转换,打开流水灯 P2DIR = 0xff; // P2端口设置为输出 P2OUT = 0xff; // 关闭其他LED
P2SEL |= BIT3 + BIT4; // P2.3和P2.4连接内部模块 CCR0 = 4096-1; // PWM周期为1S CCTL1 = OUTMOD_7; // CCR1 reset/set
CCR1 = 3072; // CCR1 PWM duty cycle CCTL2 = OUTMOD_7; // CCR2 reset/set
CCR2 = 1024; // CCR2 PWM duty cycle TACTL = TASSEL_1 + ID_3 + MC_1; // ACLK/8, up mode
_BIS_SR(LPM3_bits); // Enter LPM3 }
//****************************************************************************** // MSP-FET430P140 Demo - Basic Clock, Output Buffered SMCLK, ACLK and MCLK //
// Description: Output buffered MCLK, SMCLK and ACLK.
// ACLK = LFXT1 = 32768, MCLK = DCO Max, SMCLK = XT2 // //* XTAL's REQUIRED - NOT INSTALLED ON FET *//
// //* Min Vcc required varies with MCLK frequency - refer to datasheet *// //
// MSP430F149 // -----------------
// /|\\| XIN|- // | | | 32k // --|RST XOUT|- // | | // | XT2IN|-
// | | XTAL (455k - 8Mhz) // |RST XT2OUT|- // | |
// | P5.4|-->MCLK = DCO Max // | P5.5|-->SMCLK = XT2 // | P5.6|-->ACLK = 32kHz //
// M. Buccini
9
// Texas Instruments Inc. // Feb 2005
// Built with IAR Embedded Workbench Version: 3.21A
//******************************************************************************
#include
void main(void) {
BoardConfig(0xb8);
WDTCTL = WDTPW +WDTHOLD; // Stop Watchdog Timer DCOCTL = DCO0 + DCO1 + DCO2; // Max DCO
BCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2on, max RSEL BCSCTL2 |= SELS; // SMCLK = XT2 P5DIR |= 0x70; // P5.6,5,4 outputs P5SEL |= 0x70; // P5.6,5,5 options
while(1) { } }
//****************************************************************************** // MSP-FET430P140 Demo - Basic Clock, LPM3 Using WDT ISR, 32kHz ACLK //
// Description: This program operates MSP430 normally in LPM3, pulsing P3.4 // at 4 second intervals. WDT ISR used to wake-up system. All I/O configured // as low outputs to eliminate floating inputs. Current consumption does
// increase when LED is powered on P3.4. Demo for measuring LPM3 current. // ACLK= LFXT1/4= 32768/4, MCLK= SMCLK= default DCO // //* External watch crystal on XIN XOUT is required for ACLK *// // //
// MSP430F149 // ---------------
// /|\\| XIN|-
// | | | 32kHz // --|RST XOUT|- // | |
// | P3.5|-->LED //
// Dasheng
// LiTian Electronic Inc. // Feb 2008
10
一、基础_实验【10个】
1、入门试验:LED闪烁(1个)
2、时钟实验:设置MCLK、ACLK、SMCLK(1个) 3、低功耗实验:设置低功耗模式(1个) 4、IO端口试验: IO端口寄存器设置(1个)
5、定时器:看门狗定时器、TimerA寄存器设置(2个) 6、比较器:比较器A寄存器(1个) 7、Flash:flash读写(1个)
8、异步通信:异步通信寄存器设置(1个) 9、ADC:ADC12寄存器设置(1个)
二、开发板模块简单程序【56个】
1、LED流水灯实验(红、黄、绿)
(1)LED1:检测开发板
(2)LED2:普通IO控制闪烁 (3)LED3:PWM信号控制闪烁
2、蜂鸣器实验
(1)蜂鸣器1:单频音(步进变音调) (2)蜂鸣器2:奏乐(祝你平安)
3、数码管实验
(1)数码管1(显示123456) (2)数码管2(动态显示0~F) (3)数码管3(流动光圈) (4)数码管4(来回光标)
4、4×1独立按键实验
(1)4×1键盘1:扫描数码管显示
(2)4×1键盘2:中断数码管显示 (3)4×1键盘3:控制LED (4)4×1键盘4:控制蜂鸣器
5、4×4矩阵键盘实验
(1)4×4键盘1:行列扫描数码管显示
(2)4×4键盘2:行列扫描1602液晶显示
1
(3)4×4键盘3:控制LED蜂鸣器
6、1602液晶实验
(1)1602液晶1:动态字符显示 (2)1602液晶2:静态字符显示 (3)1602液晶3:内部时钟显示
7、3.3V-5V电平转换实验
(1)电平转换1:输出5V方波
(2)电平转换2:输出不同占空比的方波 (3)电平转换3:MCLK,SMCLK,ACLK
8、RS232接口实验
(1)RS232接口1:MCU发送数据PC机显示
(2)RS232接口2:按键控制MCU发送数据PC机显示(3)RS232接口3:PC机发送数据MCU液晶显示 (4)RS232接口4:MCU回发接收到的PC机数据 (5)RS232接口5:RS232控制蜂鸣器
9、RS485接口实验
(1)RS485接口1:发送程序 (2)RS485接口2:接收程序
10、USB接口实验
(1)USB接口1:简单连接测试 (2)USB接口2:USB接收数据 (3)USB接口3:USB发送数据
11、PS2接口实验
(1)PS2接口1: PS2控制1602显示 (2)PS2接口2: PS2控制数码管显示 (3)PS2接口3:PS2控制LED和蜂鸣器
12、12-Bit高精度温度传感器实验
(1)温度传感器1:DS18B20在数码管显示 (2)温度传感器2:DS18B20在液晶显示
13、RTC实时时钟实验
(1)实时时钟1:DS1302测试
2
(2)实时时钟2:DS1302电子钟
14、2k Bit EEPROM实验
(1)EEPROM1:AT24C02测试
(2)EEPROM2:读出数据通过串口在PC机显示
15、12-Bit模数转换器(ADC)接口实验
(1)模数转换器1:ADC在数码管显示
(2)模数转换器2:ADC在1602液晶在显示 (3)模数转换器3:ADC通过串口在PC机显示
16、8-Bit数模转换器(DAC)实验
(1)数模转换器1:DAC控制LED
(2)数模转换器2:DAC输出电压,ADC采样转换并在液晶上显示17、12864液晶实验(与12864液晶配套)
(1)12864液晶并口1:字符显示 (2)12864液晶并口2:汉字显示 (3)12864液晶并口3:图形显示 (4)12864液晶并口4:综合演示 (5)12864液晶串口5:字符显示 (6)12864液晶串口6:汉字显示 (7)12864液晶串口7:图形显示 (8)12864液晶串口8:综合演示
18、射频模块CC1000实验
(1)射频模块1:发送数据 (2)射频模块2:接收数据
19、ucos移植
注:17、18程序随模块赠送
三、开发板综合程序【30】
1、键盘综合实验
(1)4×4键盘+蜂鸣器+LED+数码管显示 (2)4×4键盘+蜂鸣器+LED+1602液晶显示 (3)4×4键盘+蜂鸣器+LED+PC机显示 (4)PS2键盘+UART+PC机显示
3
(5)PS2键盘+USB+PC机显示
2、接口综合实验
(1)USB?UART (2)UART?USB (3)RS232?RS485 (4)RS485?RS232
3、温度时间综合实验
(1)DS18B20 + DS1302 + 数码管 (2)DS18B20 + DS1302 + USB (3)DS18B20 + DS1302 + UART (4)DS18B20 + DS1302 + 1602
4、AD DA综合实验
(1)ADC + 1602 (2)ADC + UART (3)ADC + USB
(4)DAC + LED + KEY (5)DAC + UART (6)DAC + USB
(7)ADC + UART + DS1302 (8)ADC + DAC + 1602 + KEY (9)ADC + DAC + UART + KEY
5、其他综合实验
(1)AT24C02高级应用(搜索,擦除,读出全部)(2)DS1302高级应用(内部RAM存取数据)
6、12864液晶综合实验
(1)汉字库 (2)图形库
7、3.2寸TFT触摸屏实验
(1)静态图片 (2)动画
4
/*************************************************** 程序功能:BoardConfig.h 头文件 ---------------------------------------------------
***************************************************/ typedef unsigned char uchar; typedef unsigned int uint;
//控制位的宏定义
#define Ctrl_Out P3DIR |= BIT3 + BIT6 + BIT7; #define Ctrl_0 P3OUT &= ~(BIT3 + BIT6 + BIT7) #define SRCLK_1 P3OUT |= BIT7 #define SRCLK_0 P3OUT &= ~BIT7 #define SER_1 P3OUT |= BIT6 #define SER_0 P3OUT &= ~BIT6 #define RCLK_1 P3OUT |= BIT3 #define RCLK_0 P3OUT &= ~BIT3
//板上资源配置函数
void BoardConfig(uchar cmd) {
uchar i;
Ctrl_Out; Ctrl_0;
for(i = 0; i < 8; i++) {
SRCLK_0;
if(cmd & 0x80) SER_1; else SER_0; SRCLK_1; cmd <<= 1; }
RCLK_1; _NOP(); RCLK_0; }
/*************************************************** 程序功能:控制8个LED闪烁,用于测试下载功能是否正常 --------------------------------------------------- 测试说明:观察LED闪烁
***************************************************/ #include
5
// Built with IAR Embedded Workbench Version: 3.42A
//******************************************************************************
#include
void main(void) {
BoardConfig(0xb8);
BCSCTL1 |= DIVA_2; // ACLK/4
WDTCTL = WDT_ADLY_1000; // WDT 1s/4 interval timer IE1 |= WDTIE; // Enable WDT interrupt
P1DIR = 0xFF; // All P1.x outputs P1OUT = 0; // All P1.x reset P2DIR = 0xFF; // All P2.x outputs P2OUT = 0; // All P2.x reset P3DIR = 0xFF; // All P3.x outputs P3OUT = 0x30; // All P3.x reset P4DIR = 0xFF; // All P4.x outputs P4OUT = 0; // All P4.x reset P5DIR = 0xFF; // All P5.x outputs P5OUT = 0; // All P5.x reset P6DIR = 0xFF; // All P6.x outputs P6OUT = 0x80; // All P6.x reset
while(1) {
uint i;
_BIS_SR(LPM3_bits + GIE); // Enter LPM3
P3OUT &= ~BIT5; // Set P3.5 LED on for (i = 18000; i>0; i--); // Delay
P3OUT |= BIT5; // Clear P3.5 LED off } }
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer (void) {
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR) }
//******************************************************************************* // MSP-FET430P140 Demo - Software Toggle P3.4 //
11
// Description: Toggle P3.4 by xor'ing P3.4 inside of a software loop. // ACLK= n/a, MCLK= SMCLK= default DCO ~800k //
// MSP430F149 // -----------------
// /|\\| XIN|- // | | | // --|RST XOUT|- // | |
// | P3.4|-->LED //
// Dasheng
// LiTian Electronic Inc. // Feb 2008
// Built with IAR Embedded Workbench Version: 3.42A
//******************************************************************************
#include
void main(void) {
BoardConfig(0xb8);
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P3DIR |= BIT4; // Set P3.4 to output direction
for (;;) {
volatile unsigned int i;
P3OUT ^= BIT4; // Toggle P3.4 using exclusive-OR
i = 50000; // Delay do (i--);
while (i != 0); } }
//****************************************************************************** // MSP-FET430P140 Demo - WDT, Toggle P3.4, Interval Overflow ISR, DCO SMCLK //
// Description: Toggle P3.4 using software timed by the WDT ISR. Toggle rate // is approximately 30ms based on default ~ 800khz DCO/SMCLK clock source // used in this example for the WDT.
// ACLK= n/a, MCLK= SMCLK= default DCO~ 800k
12
// // MSP430F149
// -----------------
// /|\\| XIN|- // | | | // --|RST XOUT|- // | |
// | P3.4|-->LED //
// Dasheng
// LiTian Electronic Inc. // Feb 2008
// Built with IAR Embedded Workbench Version: 3.42A
//****************************************************************************** #include
void main(void) {
BoardConfig(0xbf); //关闭数码管、流水灯和电平转换
WDTCTL = WDT_MDLY_32; // Set Watchdog Timer interval to ~30ms IE1 |= WDTIE; // Enable WDT interrupt P3DIR |= BIT4; // Set P3.4 to output direction
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt }
// Watchdog Timer interrupt service routine #pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void) {
P3OUT ^= BIT4; // Toggle P3.4 using exclusive-OR }
//****************************************************************************** // MSP-FET430P140 Demo - WDT, Toggle P3.4, Interval Overflow ISR, 32kHz ACLK //
// Description: Toggle P3.4 using software timed by WDT ISR. Toggle rate is // exactly 250ms based on 32kHz ACLK WDT clock source. In this example the // WDT is configured to divide 32768 watch-crystal(2^15) by 2^13 with an ISR // triggered @ 4Hz.
// ACLK= LFXT1= 32768, MCLK= SMCLK= DCO~ 800kHz
// //* External watch crystal installed on XIN XOUT is required for ACLK *// // // MSP430F149
// -----------------
13
// /|\\| XIN|-
// | | | 32kHz // --|RST XOUT|- // | |
// | P3.4|-->LED //
// Dasheng
// LiTian Electronic Inc. // Feb 2008
// Built with IAR Embedded Workbench Version: 3.42A
//******************************************************************************
#include
void main(void) {
BoardConfig(0xb8);
WDTCTL = WDT_ADLY_250; // WDT 250ms, ACLK, interval timer IE1 |= WDTIE; // Enable WDT interrupt P3DIR |= BIT4; // Set P3.4 to output direction
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interrupt }
// Watchdog Timer interrupt service routine #pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void) {
P3OUT ^= BIT4; // Toggle P3.4 using exclusive-OR }
//****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, CCR0 Cont. Mode ISR, DCO SMCLK //
// Description: Toggle P3.4 using software and TA_0 ISR. Toggles every // 50000 SMCLK cycles. SMCLK provides clock source for TACLK.
// During the TA_0 ISR, P3.4 is toggled and 50000 clock cycles are added to // CCR0. TA_0 ISR is triggered every 50000 cycles. CPU is normally off and // used only during TA_ISR.
// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz //
// MSP430F149 // ---------------
// /|\\| XIN|- // | | |
14
// --|RST XOUT|- // | |
// | P3.4|-->LED //
// Dasheng
// LiTian Electronic Inc. // Feb 2008
// Built with IAR Embedded Workbench Version: 3.42A
//******************************************************************************
#include
void main(void) {
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BoardConfig(0xb8); //关闭数码管、流水灯和电平转换 P3DIR |= BIT4; // P3.4 output
CCTL0 = CCIE; // CCR0 interrupt enabled CCR0 = 50000;
TACTL = TASSEL_2 + MC_2; // SMCLK, contmode
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt }
// Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) {
P3OUT ^= BIT4; // Toggle P3.4
CCR0 += 50000; // Add Offset to CCR0 }
//****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, CCR0 Up Mode ISR, DCO SMCLK //
// Description: Toggle P3.4 using software and TA_0 ISR. Timer_A is // configured for up mode, thus the timer overflows when TAR counts // to CCR0. In this example, CCR0 is loaded with 20000.
// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz //
// MSP430F149 // ---------------
// /|\\| XIN|- // | | | // --|RST XOUT|-
15
// | |
// | P3.4|-->LED //
// Dasheng
// LiTian Electronic Inc. // Feb 2008
// Built with IAR Embedded Workbench Version: 3.42A
//******************************************************************************
#include
WDTCTL = WDTPW + WDTHOLD; // Stop WDT BoardConfig(0xb8);
P3DIR |= BIT4; // P3.4 output
CCTL0 = CCIE; // CCR0 interrupt enabled CCR0 = 20000;
TACTL = TASSEL_2 + MC_1; // SMCLK, upmode
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt }
// Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) {
P3OUT ^= BIT4; // Toggle P3.4 }
//****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, Overflow ISR, DCO SMCLK //
// Description: Toggle P3.4 using software and Timer_A overflow ISR. // In this example an ISR triggers when TA overflows. Inside the TA // overflow ISR P3.4 is toggled. Toggle rate is approximatlely 12Hz. // Proper use of the TAIV interrupt vector generator is demonstrated. // ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz //
// MSP430F149 // ---------------
// /|\\| XIN|- // | | | // --|RST XOUT|- // | |
// | P3.4|-->LED
16
//
// Dasheng
// LiTian Electronic Inc. // Feb 2008
// Built with IAR Embedded Workbench Version: 3.42A
//******************************************************************************
#include
WDTCTL = WDTPW + WDTHOLD; // Stop WDT BoardConfig(0xb8);
P3DIR |= BIT4; // P3.4 output
TACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, contmode, interrupt
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt }
// Timer_A3 Interrupt Vector (TAIV) handler #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A(void) {
switch( TAIV ) {
case 2: break; // CCR1 not used case 4: break; // CCR2 not used case 10: P3OUT ^= BIT4; // overflow break; } }
//****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, Overflow ISR, 32kHz ACLK //
// Description: Toggle P3.4 using software and the Timer_A overflow ISR. // In this example an ISR triggers when TA overflows. Inside the ISR P3.4 // is toggled. Toggle rate is exactly 0.5Hz. Proper use of the TAIV interrupt // vector generator is demonstrated.
// ACLK = TACLK = 32768Hz, MCLK = SMCLK = default DCO ~800kHz // //* An external watch crystal on XIN XOUT is required for ACLK *// //
// MSP430F149 // ---------------
// /|\\| XIN|-
// | | | 32kHz
17
// --|RST XOUT|- // | |
// | P3.4|-->LED //
// Dasheng
// LiTian Electronic Inc. // Feb 2008
// Built with IAR Embedded Workbench Version: 3.42A
//******************************************************************************
#include
void main(void) {
WDTCTL = WDTPW + WDTHOLD; // Stop WDT BoardConfig(0xb8);
P3DIR |= BIT4; // P3.4 output
TACTL = TASSEL_1 + MC_2 + TAIE; // ACLK, contmode, interrupt
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt }
// Timer_A3 Interrupt Vector (TAIV) handler #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A(void) {
switch( TAIV ) {
case 2: break; // CCR1 not used case 4: break; // CCR2 not used case 10: P3OUT ^= BIT4; // overflow break; } }
#include
WDTCTL = WDTHOLD + WDTPW; // 关看门狗
BoardConfig(0xb0); //开流水灯,关数码管和电平转换 CACTL1 = CARSEL + CAREF0 + CAON ; // Vcc/4 = - cmp CACTL2 = P2CA0; // 使用 CA0
18
P2DIR = 0xff; P2OUT = 0xff;
while(1) {
if((CACTL2 | 0xfe) ==0xff)
{ // 比较电压是否超过0.25Vcc P2OUT &= ~BIT4;
CACTL1 &= 0xfe; // CAIFG = 0 } else {
P2OUT |= BIT4; } } }
//**************************************************************************** // MSP-FET430P140 Demo - Flash In-System Programming, Copy SegA to SegB //
// Description: This program first erases flash seg A, then it increments all // values in seg A, then it erases seg B, then copies seg A to seg B. // Assumed MCLK 550kHz - 900kHz.
// //* Set Breakpoint on NOP in the Mainloop to avoid Stressing Flash *// //
// MSP430F149 // -----------------
// /|\\| XIN|- // | | | // --|RST XOUT|- // | | //
// M. Mitchell
// Texas Instruments Inc. // Feb 2005
// Built with IAR Embedded Workbench Version: 3.21A
//******************************************************************************
#include
uchar value; // 8-bit value to write to segment A uchar DataBuffer[128];
19
// Function prototypes
void write_SegA (uchar value); void copy_A2B (void);
void main(void) {
BoardConfig(0xb8);
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
FCTL2 = FWKEY + FSSEL0 + FN0; value = 0;
while(1) {
write_SegA(value++); copy_A2B(); _NOP(); } }
void write_SegA (uchar value) {
uchar *Flash_ptr; uint i;
Flash_ptr = (uchar *) 0x1080; FCTL1 = FWKEY + ERASE; FCTL3 = FWKEY; *Flash_ptr = 0;
FCTL1 = FWKEY + WRT;
for (i=0; i<128; i++) {
*Flash_ptr++ = value; }
FCTL1 = FWKEY; FCTL3 = FWKEY + LOCK; }
void copy_A2B (void) {
uchar *Flash_ptrA;
// MCLK/2 for Flash Timing Generator // Initialize value // Repeat forever // Write segment A, increment value // Copy segment A to B
// SET BREAKPOINT HERE // Flash pointer // Initialize Flash pointer // Set Erase bit // Clear Lock bit
// Dummy write to erase Flash segment // Set WRT bit for write operation // Write value to flash // Clear WRT bit // Set LOCK bit // Segment A pointer
20
uchar *Flash_ptrB; // Segment B pointer uint i;
Flash_ptrA = (uchar *) 0x1080; // Initialize Flash segment A pointer Flash_ptrB = (uchar *) 0x1000; // Initialize Flash segment B pointer FCTL1 = FWKEY + ERASE; // Set Erase bit FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptrB = 0; // Dummy write to erase Flash segment B FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<128; i++) {
DataBuffer[i] = *Flash_ptrA++;
*Flash_ptrB++ = DataBuffer[i]; // Copy value segment A to segment B }
FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCK; // Set LOCK bit }
//****************************************************************************** // MSP-FET430P140 Demo - USART0, Ultra-Low Pwr UART 2400 Echo ISR, 32kHz ACLK //
// Description: Echo a received character, RX ISR used. In the Mainloop UART0 // is made ready to receive one character with interrupt active. The Mainloop // waits in LPM3. The UART0 ISR forces the Mainloop to exit LPM3 after // receiving one character which echo's back the received character.
// ACLK = UCLK0 = LFXT1 = 32768, MCLK = SMCLK = DCO~ 800k
// Baud rate divider with 32768hz XTAL @2400 = 32768Hz/2400 = 13.65 (000Dh) // //* An external watch crystal is required on XIN XOUT for ACLK *// //
// MSP430F149 // -----------------
// /|\\| XIN|-
// | | | 32kHz // --|RST XOUT|- // | |
// | P3.4|-----------> // | | 2400 - 8N1 // | P3.5|<----------- // //
// M. Buccini
// Texas Instruments Inc. // Feb 2005
// Built with IAR Embedded Workbench Version: 3.21A
21
//******************************************************************************
#include
void main(void) {
BoardConfig(0xb8);
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD UCTL0 |= CHAR; // 8-bit character UTCTL0 |= SSEL0; // UCLK = ACLK UBR00 = 0x0D; // 32k/2400 - 13.65 UBR10 = 0x00; //
UMCTL0 = 0x6B; // Modulation
UCTL0 &= ~SWRST; // Initialize USART state machine IE1 |= URXIE0; // Enable USART0 RX interrupt
// Mainloop for (;;) {
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interrupt while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready? TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0 } }
// UART0 RX ISR will for exit from LPM3 in Mainloop #pragma vector=UART0RX_VECTOR __interrupt void usart0_rx (void) {
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR) }
//****************************************************************************** // MSP-FET430P140 Demo - USART0, Ultra-Low Pwr UART 9600 Echo ISR, 32kHz ACLK //
// Description: Echo a received character, RX ISR used. In the Mainloop UART0 // is made ready to receive one character with interrupt active. The Mainloop // waits in LPM3. The UART0 ISR forces the Mainloop to exit LPM3 after // receiving one character which echo's back the received character.
// ACLK = UCLK0 = LFXT1 = 32768, MCLK = SMCLK = DCO~ 800k
// Baud rate divider with 32768hz XTAL @9600 = 32768Hz/9600 = 3.41 (0003h 4Ah ) // //* An external watch crystal is required on XIN XOUT for ACLK *//
22
//
// MSP430F149 // -----------------
// /|\\| XIN|-
// | | | 32kHz // --|RST XOUT|- // | |
// | P3.4|-----------> // | | 9600 - 8N1 // | P3.5|<----------- // //
// M. Buccini
// Texas Instruments Inc. // Feb 2005
// Built with IAR Embedded Workbench Version: 3.21A
//******************************************************************************
#include
void main(void) {
BoardConfig(0xb8);
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD UCTL0 |= CHAR; // 8-bit character UTCTL0 |= SSEL0; // UCLK = ACLK UBR00 = 0x03; // 32k/9600 - 3.41 UBR10 = 0x00; //
UMCTL0 = 0x4A; // Modulation
UCTL0 &= ~SWRST; // Initialize USART state machine IE1 |= URXIE0; // Enable USART0 RX interrupt
// Mainloop for (;;) {
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interrupt while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready? TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0 } }
23
// UART0 RX ISR will for exit from LPM3 in Mainloop #pragma vector=UART0RX_VECTOR __interrupt void usart0_rx (void) {
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR) }
//****************************************************************************** // MSP-FET430P140 Demo - USART0, UART 19200 Echo ISR, XT2 HF XTAL ACLK //
// Description: Echo a received character, RX ISR used. Normal mode is LPM0, // USART0 RX interrupt triggers TX Echo. Though not required, MCLK = XT2. // ACLK = n/a, MCLK = SMCLK = UCLK0 = XT2 = 8MHz
// Baud rate divider with 8Mhz XTAL @19200 = 8MHz/19200 = 416.66 ~ 417 (01A0h) // //* An external 8MHz XTAL on X2IN X2OUT is required for XT2CLK *// // //* Min Vcc required varies with MCLK frequency - refer to datasheet *// // //
// MSP430F149 // -----------------
// /|\\| XT2IN|-
// | | | 8Mhz // --|RST XT2OUT|- // | |
// | P3.4|------------> // | | 19200 - 8N1 // | P3.5|<------------ // //
// M. Buccini
// Texas Instruments Inc. // Feb 2005
// Built with IAR Embedded Workbench Version: 3.21A
//******************************************************************************
#include
void main(void) {
volatile unsigned int i;
BoardConfig(0xb8);
P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD WDTCTL = WDTPW + WDTHOLD; // Stop WDT
24
BCSCTL1 &= ~XT2OFF; // XT2on do {
IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0xFF; i > 0; i--); // Time for flag to set }
while ((IFG1 & OFIFG)); // OSCFault flag still set?
BCSCTL2 |= SELM_2 + SELS; // MCLK = SMCLK = XT2 (safe)
ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD UCTL0 |= CHAR; // 8-bit character UTCTL0 |= SSEL1; // UCLK = SMCLK UBR00 = 0xA0; // 8Mhz/19200 ~ 417 UBR10 = 0x01; //
UMCTL0 = 0x00; // no modulation
UCTL0 &= ~SWRST; // Initialize USART state machine IE1 |= URXIE0; // Enable USART0 RX interrupt
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt }
#pragma vector=UART0RX_VECTOR __interrupt void usart0_rx (void) {
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready? TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0 }
//****************************************************************************** // MSP-FET430P140 Demo - USART0, UART 115200 Echo ISR, XT2 HF XTAL ACLK //
// Description: Echo a received character, RX ISR used. Normal mode is LPM0, // USART0 RX interrupt triggers TX Echo. Though not required, MCLK= XT2. // ACLK = n/a, MCLK = SMCLK = UCLK0 = XT2 = 8MHz
// Baud rate divider with 8Mhz XTAL = 8000000/115200 = 0069 (0045h) // //* An external 8MHz XTAL on X2IN X2OUT is required for XT2CLK *// // //* Min Vcc required varies with MCLK frequency - refer to datasheet *// // //
// MSP430F149 // -----------------
// /|\\| XT2IN|-
// | | | 8Mhz // --|RST XT2OUT|-
25
{
delay();
if(keyin == 0x07) {
while(keyin != 0x0f); //等待按键放开 P6OUT |= BIT7;
TACCTL0 &= ~CCIE; //停止发声 P2OUT = 0xf7; P1IFG = 0; return; } } default:
while(keyin != 0x0f); //等待按键放开 P1IFG = 0; return; } }
P1IFG = 0; }
//数码管7位段码:0--f
unsigned char scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //记录显示位数的全局变量 unsigned char cnt = 0; //显示缓存
unsigned char Dispbuf[2];
//引用外部变量的声明
extern unsigned char key_Pressed; extern unsigned char key_val; extern unsigned char key_Flag;
void Init_Keypad(void); void Check_Key(void); void delay();
void Key_Event(void);
#include
/***************全局变量***************/
uchar key_Pressed; //按键是否被按下:1--是,0--否
46
uchar key_val; //存放键值
uchar key_Flag; //按键是否已放开:1--是,0--否 //设置键盘逻辑键值与程序计算键值的映射
uchar key_Map[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
/******************************************* 函数名称:Init_Keypad
功 能:初始化扫描键盘的IO端口 参 数:无 返回值 :无
********************************************/ void Init_Keypad(void) {
P1DIR = 0xf0; //P1.0~P1.3设置为输入状态, P1.4~P1.7设置为输出状态 P1OUT |= 0xf0; // P1.4~P1.7输出高电平 key_Flag = 0; key_Pressed = 0; key_val = 0; }
/********************************************* * Check_Key(),检查按键,确认键值
*********************************************/ /******************************************* 函数名称:Check_Key
功 能:扫描键盘的IO端口,获得键值 参 数:无 返回值 :无
********************************************/ void Check_Key(void) {
uchar row ,col,tmp1,tmp2;
tmp1 = 0x80;
for(row = 0;row < 4;row++) //行扫描 {
P1OUT = 0xf0; //P1.4~P1.7输出全1
P1OUT -= tmp1; //P1.4~p1.7输出四位中有一个为0 tmp1 >>=1;
if ((P1IN & 0x0f) < 0x0f) //是否P1IN的P1.0~P1.3中有一位为0 {
tmp2 = 0x01; // tmp2用于检测出那一位为0 for(col = 0;col < 4;col++) // 列检测 {
if((P1IN & tmp2) == 0x00) // 是否是该列,等于0为是 {
47
key_val = key_Map[row * 4 + col]; // 获取键值 return; // 退出循环 }
tmp2 <<= 1; // tmp2右移1位 } } } }
/******************************************* 函数名称:delay
功 能:延时约15ms,完成消抖功能 参 数:无 返回值 :无
********************************************/ void delay() {
uint tmp;
for(tmp = 12000;tmp > 0;tmp--); }
/******************************************* 函数名称:Key_Event
功 能:检测按键,并获取键值 参 数:无 返回值 :无
********************************************/ void Key_Event(void) {
uchar tmp;
P1OUT &= 0x00; // 设置P1OUT全为0,等待按键输入 tmp = P1IN; // 获取 p1IN
if ((key_Pressed == 0x00)&&((tmp & 0x0f) < 0x0f)) //如果有键按下 {
key_Pressed = 1; // 如果有按键按下,设置key_Pressed标识 delay(); //消除抖动
Check_Key(); // 调用check_Key(),获取键值 }
else if ((key_Pressed == 1)&&((tmp & 0x0f) == 0x0f)) //如果按键已经释放 {
key_Pressed = 0; // 清除key_Pressed标识 key_Flag = 1; // 设置key_Flag标识 } else {
48
_NOP(); } }
/*********************************************** 程序功能:扫描4X4键盘并将键值在数码管上显示 ------------------------------------------------ 跳线设置:将跳线座J3上的短路帽拔下 ------------------------------------------------
测试说明:按动K1~K16按键,观察数码管显示
************************************************/ #include
/********************主函数********************/ void main(void) {
BoardConfig(0x88); //打开数码管,关闭流水灯和电平转换
WDTCTL = WDT_ADLY_1_9; //设置内部看门狗工作在定时器模式,1.9ms中断一次 IE1 |= WDTIE; //使能看门狗中断
P4DIR = 0xff; //设置P4,P5的IO方向为输出 P5DIR = 0xff;
P4OUT = 0x00; //设置P4,P5的输出初值 P5OUT = 0xff;
_EINT(); //打开全局中断 Init_Keypad(); while(1) {
Key_Event();
if(key_Flag == 1) {
key_Flag = 0;
Dispbuf[0] = key_val / 10; Dispbuf[1] = key_val % 10; } } }
/******************************************* 函数名称:watchdog_timer
功 能:看门狗中断服务函数,在这里输出数码管的 段选和位选信号
49
参 数:无 返回值 :无
********************************************/ #pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void) {
P5OUT = 0xff;
P4OUT = scandata[Dispbuf[cnt]]; //输出段选信号 P5OUT &= ~(1 << (cnt+2)); //输出位选信号
cnt++; //位计数变量在0~1之间循环 if(cnt == 2) cnt = 0; }
void DispStr(unsigned char x,unsigned char y,unsigned char *ptr);
void DispNChar(unsigned char x,unsigned char y, unsigned char n,unsigned char *ptr); void LocateXY(unsigned char x,unsigned char y);
void Disp1Char(unsigned char x,unsigned char y,unsigned char data); void LcdReset(void);
void LcdWriteCommand(unsigned char cmd,unsigned char chk); void LcdWriteData( unsigned char data ); void WaitForEnable(void); void Delay5ms(void);
#include
typedef unsigned char uchar; typedef unsigned int uint;
/**************宏定义***************/ #define DataDir P4DIR #define DataPort P4OUT #define Busy 0x80 #define CtrlDir P3DIR
#define CLR_RS P3OUT&=~BIT0; //RS = P3.0 #define SET_RS P3OUT|=BIT0;
#define CLR_RW P3OUT&=~BIT1; //RW = P3.1 #define SET_RW P3OUT|=BIT1;
#define CLR_EN P3OUT&=~BIT2; //EN = P3.2 #define SET_EN P3OUT|=BIT2;
/*********************************************** 函数名称:DispStr
功 能:让液晶从某个位置起连续显示一个字符串 参 数:x--位置的列坐标 y--位置的行坐标
50