//******************************************************************************
#include <msp430.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
unsigned char Count, First_Time;
unsigned int REdge1, REdge2, FEdge;
unsigned char MST_Data, SLV_Data;
#define DC P2OUT = P2OUT|(1<<5)
#define SCE P2OUT = P2OUT|(1<<4)
#define CLK_H P1OUT=P1OUT|(1<<5)
#define CLK_L P1OUT=P1OUT&(~(1<<5))
#define Data_H P1OUT=P1OUT|((1<<7))
#define Data_L P1OUT=P1OUT&(~(1<<7))
#define u8 unsigned char
#define u16 unsigned int
typedef struct
{
u8 x;
u8 y;
}point;
/*------5110屏幕尺寸和功能宏定义------*/
#define DATA 1 //数据
#define CMD 0 //命令
#define LCD_X 84 //液晶屏横坐标宽度
#define LCD_ROW LCD_X //液晶屏列宽度
void LCD_write_byte(unsigned char dat, unsigned char command);
void LCD_init(void);
void LCD_init(void);
void LCD_set_XY(unsigned char X, unsigned char Y);
void LCD_clear(void);
void LCD_write_char(unsigned char c);
void LCD_write_String(unsigned char X,unsigned char Y,unsigned char *s);
void LCD_write_byte(unsigned char dat, unsigned char command)
{
unsigned int i;
// LCD_SCE = 0; //5110片选有效,允许输入数据
P2OUT &=~BIT4;
if (command == 0) //写命令
// LCD_DC = 0;
P2OUT &=~BIT5;
else // LCD_DC = 1;
P2OUT |=BIT5;//写数据
for (i=0;i<8;i++)
{
CLK_L;//spi_clk=0;
if((dat & 0x80)==0x80)
{
Data_H;
}
else
{
Data_L;
}
CLK_H; // spi_clk=1;
dat=(dat<<1);
}
P2OUT |=BIT4;
}
void LCD_init(void)
{
P2OUT &=~BIT4;
P1OUT &= ~BIT4;
P1OUT |= BIT4;
LCD_write_byte(0x21, 0); // LCD模式设置:芯片活动,水平寻址,使用扩展指令
LCD_write_byte(0xc8, 0); // 设置液晶偏置电压
LCD_write_byte(0x06, 0); // 温度校正
LCD_write_byte(0x13, 0); // 1:48
LCD_write_byte(0x20, 0); // 使用基本命令,V=0,水平寻址
LCD_clear(); // 清屏
LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示
P2OUT |=BIT4;
}
void LCD_set_XY(unsigned char X, unsigned char Y)
{
LCD_write_byte(0x80 | X, 0); // X 行(横坐标)
LCD_write_byte(0x40 | Y, 0); // column 列(纵坐标)
}
/*------------------------------------------
//LCD_clear: LCD清屏函数
--------------------------------------------*/
void LCD_clear(void)
{
unsigned char t;
unsigned char k;
LCD_set_XY(0,0);
for(t=0;t<6;t++)
{
for(k=0;k<84;k++)
{
LCD_write_byte(0x00,1);
}
}
}
void LCD_write_char(unsigned char c)
{
unsigned char i;
c-=0x20; //ASCII码减去 0x20
for (i=0; i<6; i++)
LCD_write_byte(ASCII_6_8[c], 1);
}
void LCD_write_String(unsigned char X,unsigned char Y,unsigned char *s)
{
LCD_set_XY(X,Y);
while (*s) //等效*s!='\0'
{
LCD_write_char(*s);
s++;
}
}
static float speed;
static unsigned char display[10];
static unsigned char display2[10];
static unsigned int temp ;
static unsigned int distance=0;
static float Period;
static float Distance_km;
int main(void)
{
volatile unsigned int i;
unsigned char lcd_buf[6][84];
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= BIT0; // P1.0/LED Output
P1OUT &= ~BIT0; // LED off
if (CALBC1_8MHZ==0xFF) // If calibration constant erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_8MHZ; // Set DCO to 8MHz
DCOCTL = CALDCO_8MHZ;
P1DIR &= ~BIT2;
P1SEL |= BIT2;
P2DIR &= ~BIT2;
P2DIR &= ~BIT1;
P2IES |=BIT2+BIT1;
P2IE |=BIT2+BIT1;
P1DIR |= BIT0;
P1DIR|=BIT4|BIT5|BIT7;
TA0CCTL1 = CAP + CM_3 + CCIE + SCS + CCIS_0;
TA0CTL |= TASSEL_1 + MC_2 + TACLR; // ACLK, Cont Mode; start timer
Count = 0x0;
First_Time = 0x01;
P2OUT = 0x00;
P2DIR |=BIT5+BIT4 ;
P1DIR |=BIT4 ;
_EINT();
P1OUT &= ~BIT4; // Now with SPI signals initialized,
P1OUT |= BIT4; // reset slave
LCD_init(); //初始化LCD模块
LCD_clear(); //清屏幕
LCD_write_String(0,1,"Speed:");
LCD_write_String(60,1,"km/h");
LCD_write_String(0,3,"Dista:");
while(1)
{
__bis_SR_register(LPM0_bits+GIE); // Enter LPM0
Period = REdge2 - REdge1; // Calculate Period
speed = 1.0362*(32768/Period)*3.6;
memset(display,0,sizeof(display));
sprintf((char*)display,"%4.1f",speed);
LCD_write_String(36,1," ");
LCD_write_String(36,1,display);
LCD_write_String(60,1,"km/h");
LCD_write_String(50,3," ");
Distance_km=(float)distance*2.073656/1000.0;
if(Distance_km<1)
{
LCD_write_String(34,3," ");
Distance_km=Distance_km*1000;
sprintf((char*)display2,"%d",(int)Distance_km);
LCD_write_String(44,3,display2);
}
else
{
LCD_write_String(36,3," ");
sprintf((char*)display2,"%6.3f",Distance_km);
LCD_write_String(34,3,display2);
LCD_write_String(72,3,"km");
}
}
}
// TA0_A1 Interrupt vector
#pragma vector = TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR (void)
{
switch(__even_in_range(TA0IV,0x0A))
{
case TA0IV_NONE: break; // Vector 0: No interrupt
case TA0IV_TACCR1: // Vector 2: TACCR1 CCIFG
// distance++;
if (TA0CCTL1 & CCI) // Capture Input Pin Status
{
distance++;
if (!Count)
{
REdge1 = TA0CCR1;
Count++;
}
else
{
REdge2 = TA0CCR1;
Count=0x0;
__bic_SR_register_on_exit(LPM0_bits +GIE); // Exit LPM0 on return to main
}
if (First_Time)
First_Time = 0x0;
}
else
{
if(!First_Time)
{
FEdge = TA0CCR1;
}
}
break;
default: break;
}
}
#pragma vector=PORT2_VECTOR
__interrupt void PORT2 (void)
{
unsigned int i;
for(i=0;i<20000;i++);
if(P2IFG&BIT1)
{
distance=0;
while(!(P2IN&BIT1));
}
if(P2IFG&BIT2)
{
P1OUT=P1OUT^BIT0;
while(!(P2IN&BIT2));
}
P2IFG=0x00;
__bic_SR_register_on_exit(LPM0_bits +GIE); // Exit LPM0 on return to main
}