📄 449stk2.c
字号:
//******************************************************************************
#include <msp430x44x.h>
//#include <io430x44x.h>
#define B1 P3IN & BIT4 //B1 - P4.4
#define B2 P3IN & BIT5 //B2 - P4.5
#define B3 P3IN & BIT6 //B3 - P4.6
#define B4 P3IN & BIT7 //B4 - P4.7
#define STATUS_LED BIT3 //STATUS_LED - P1.3
#define time 200
#define time_s 200
#define BUZ1_ON P1OUT |= BIT0 //P4.2
#define BUZ1_OFF P1OUT &= ~BIT0 //P4.2
#define BUZ2_ON P1OUT |= BIT2 //P4.3
#define BUZ2_OFF P1OUT &= ~BIT2 //P4.3
#define DALLAS P2IN & BIT7 //P2.7 - DALLAS
#define CR 0x0d
#define LF 0x0a
#define LED_OFF P1OUT |= BIT3
#define LED_ON P1OUT &= ~BIT3
//LCD digit segments
unsigned char i,time_segment,TXData;
unsigned int j;
const unsigned char UART_Message [] = "http://www.olimex.com/dev";
void Delay (unsigned int a);
void DelayX(unsigned int b);
void Clear_LCD(void);
void LCD_all(void);
void BUZZER (void);
void UART_transmit (unsigned char Transmit_Data);
void main(void)
{
//++++++++++++++++++++++++++++++
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
FLL_CTL0 &= ~XTS_FLL; // XT1 as low-frequency
_BIC_SR(OSCOFF); // turn on XT1 oscillator
do // wait in loop until crystal is stable
IFG1 &= ~OFIFG;
while (IFG1 & OFIFG);
FLL_CTL1 &= ~FLL_DIV0; // ACLK = XT1
FLL_CTL1 &= ~FLL_DIV1;
IFG1 &= ~OFIFG; // clear osc. fault int. flag
FLL_CTL1 &= ~SELM0; // set DCO as MCLK
FLL_CTL1 &= ~SELM1;
//++++++++++++++++++++++++++++++
// SVSCTL = 0x68; //brown out
// WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
// SCFI0 = BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7;
// SCFI0 |= FN_4; // x2 DCO frequency, 8MHz nominal DCO
// SCFQCTL = SCFQ_1M;
// FLL_CTL0 = /*DCOPLUS + */XCAP10PF; //Set load Cap. for Cristal = 10pF // x2 DCO frequency, 8MHz nominal DCO
// FLL_CTL1 |= SELM_XT2; //Select XT2 for CPU MCLK
// SCFI1 = 0;
// SCFQCTL = SCFQ_M | SCFQ_1M; //M=1, 1Mhz
// _BIS_SR(SCG0+SCG1); //disable DCO in status_reg
// DelayX(200);
//UART ini
U1TCTL = SSEL0; //UCLOCK = ACLK
U1BR0 = 0x03; //BAUD RATE = 9600
U1BR1 = 0x00;
U1MCTL = 0x4a; //with modulation
U1CTL = CHAR; //Start 8bit 1stop, N
ME2 = UTXE1 | URXE1; //enable RX and TX
P4SEL |= BIT0 | BIT1; //select UART pins
P4DIR |= BIT0; //port direction for TXD0
P4DIR &= ~BIT1; //port direction for RXD0
// IE1 |= URXIE0; // Enable USART0 RX interrupt
// _EINT(); // Enable interrupts
// U1CTL &= ~SWRST; //reset UART logic
//LCD ini
Clear_LCD();
TACTL = TASSEL0 | TACLR; //set timer_A
LCDCTL = LCDON + LCD4MUX + LCDP0 + LCDP1 + LCDP2; // STK LCD 4Mux, S0-S39
BTCTL = BT_fLCD_DIV64; // STK LCD freq ACLK/64
P5SEL = 0xFC; // Common and Rxx all selected
//IO port ini
P1SEL=BIT5; //p1.5 is 32768Hz
P1DIR=BIT5 | BIT3 | BIT0 | BIT2; //BUZ,LED are outputs
LCD_all(); //light all LCD segments
for (i=0; i!=15; i++)
{
LED_ON;
DelayX(60);
LED_OFF;
DelayX(60);
}
UART_transmit (CR); //send message by RS232
UART_transmit (LF);
for (i=0; i!=26; i++) UART_transmit (UART_Message[i]);
UART_transmit (CR);
UART_transmit (LF);
//---------------MAIN LOOP-----------------------------------
while (1)
{
if ((IFG2 & URXIFG1) != 0) UART_transmit (U1RXBUF+1); //test RS 232 (echo+1)
while ((DALLAS) == 0) BUZZER(); //test DALLAS button
L1: if ((B1) == 0) Clear_LCD();
if ((B2) == 0) LCD_all();
if ((B3) == 0)
{
time_segment=100;
for (i=0; i!= 20; i++)
{
for (j=0; j!=9; j++)
{
LCDMEM[i] = (BIT0 << j);
if ((IFG2 & URXIFG1) != 0) UART_transmit (U1RXBUF+1); //test RS 232 (echo+1)
DelayX(time_segment);
if((B1) == 0 ) goto L1;
if((B2) == 0 ) goto L1;
if((B4) == 0 )
{
LCD_all();
goto L1;
}
}
}
}
if((B4) == 0)
{
BUZZER();
P1OUT &= ~STATUS_LED; //switch on status_led
}
else P1OUT |= STATUS_LED; //switch off status led
}
}
void Delay (unsigned int a) //9+a*12 cycles
{
unsigned int l;
for (l=0 ; l != a; l++);
}
void Clear_LCD(void)
{
for (i=0; i!= 20; i++) LCDMEM[i]=0x00; //clear Sxx
}
void LCD_all(void)
{
for (i=0; i!= 20; i++) LCDMEM[i]=0xff; //turnon all LCD segments
}
void DelayX(unsigned int b)
{
unsigned int m;
for(m=0;m!=b;m++) Delay(255);
}
void BUZZER (void)
{
BUZ1_OFF;
BUZ2_ON;
Delay(40);
BUZ2_OFF;
BUZ1_ON;
Delay(40);
}
void UART_transmit (unsigned char Transmit_Data) //UART1 Transmit Subroutine
{
while ((IFG2 & UTXIFG1) == 0); //Wait for ready U1TXBUF
U1TXBUF = Transmit_Data; //send data
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -