#include <msp430x14x.h>
//#include "lcd.c"
//#include "key.c"
#define uint unsigned int
#define uchar unsigned char
#define SDA BIT0
#define SCL BIT1
#define DIN P1IN
#define DOUT P1OUT
#define DDIR P1DIR
#define S_SDA DDIR|=SDA,DOUT|=SDA
#define C_SDA DDIR|=SDA,DOUT&=~SDA
#define S_SCL DDIR|=SCL,DOUT|=SCL
#define C_SCL DDIR|=SCL,DOUT&=~SCL
#define SDA_IN DDIR&=~SDA
#define READ_SDA (DIN&SDA)
#define delay() _NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),\
_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP()
/******************************************************/
uchar static key_flag=0;
/********************************************************/
uchar temp=0;
uchar ack;
uchar rom_sed[9];
uchar rom_rec[7];
/************************************
/***************************************/
/******************************************define lcd******/
#define LCD_CS BIT2
#define LCD_DAT BIT4
#define LCD_SCK BIT3
#define WR BIT2
#define RS BIT1
/************************************************************/
uchar charge=0;
uchar SYNCH=0xfe; //LCD显示同步字
uchar time=0;
uchar hour=0,min=0,sec=0;
uchar static adc_flag=0;
void int_clk()
{
uint i;
do
{
BCSCTL1&=~XT2OFF;//SET XT2 IS ON
IFG1&=~OFIFG;//CLEAR Oscillator fault flag
for(i=0;i<=1000;i++)
_NOP();
}
while(IFG1&OFIFG!=0);
BCSCTL2|=SELM1+SELS;//SELECT XT2 FOR MCLK,FOR SMCLK AND DIVIDE FOR 0
//ACLK 32768hz
}
void get_clk()
{
P6DIR|=LCD_SCK;
_NOP();
P6OUT&=~LCD_SCK;
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
P6OUT|=LCD_SCK;
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
}
void inport(uchar com,uchar dat)//com=1,rs=1,com=0,rs=0;
{
uchar i,temp;
P6DIR|=LCD_DAT;
P6DIR|=LCD_CS;
P6OUT|=LCD_CS;
temp=SYNCH;
temp&=~WR;
if(com) temp|=RS;
else temp&=~RS;
for(i=0;i<=7;i++)
{
if(temp<<i&0x80) P6OUT|=LCD_DAT;
else P6OUT&=~LCD_DAT;
get_clk();
}
temp=dat&0xf0;
for(i=0;i<=7;i++)
{
if(temp<<i&0x80) P6OUT|=LCD_DAT;
else P6OUT&=~LCD_DAT;
get_clk();
}
temp=dat&0x0f;
temp=temp<<4;
for(i=0;i<=7;i++)
{
if(temp<<i&0x80) P6OUT|=LCD_DAT;
else P6OUT&=~LCD_DAT;
get_clk();
}
P6OUT|=LCD_DAT;
P6OUT&=~LCD_CS;
}
print_char(uchar add,uchar data)
{
inport(0x00,add);
inport(0x01,data);
}
print_string(uchar add,uchar *pt)
{
uchar i;
inport(0x00,add);
for(i=0;;i++)
{
if(*pt=='\n') break;
inport(0x01,*pt);
pt++;
}
}
print_han(uchar h_neima,uchar l_neima)\
{
inport(0x01,h_neima);
inport(0x01,l_neima);
}
print_float(float data)
{
uint temp;
uchar a1,a2,a3,a4;
temp=data*1000;
a1=temp/1000;
a2=(temp-a1*1000)/100;
temp=(temp-a1*1000)-a2*100;
a3=temp/10;
a4=temp%10;
inport(0x01,a1+0x30);
inport(0x01,'.');
inport(0x01,a2+0x30);
inport(0x01,a3+0x30);
inport(0x01,a4+0x30);
}
void int_lcd()
{
inport(0x00,0x30);
inport(0x00,0x01);
inport(0x00,0x02);
inport(0x00,0x0c);
inport(0x00,0x06);
}
/*********************************************************/
void delay2()
{
uint i;
for(i=0;i<=1000;i++)
;
}
uchar scan_key(uchar line)
{
uchar key;
P5OUT=line;
switch (P5IN&0Xf0)
{
case 0xe0:key=1+line;break;
case 0xd0:key=2+line;break;
case 0xb0:key=3+line;break;
case 0x70:key=4+line;break;
default:key=0xff;break;
}
return(key);
}
void fast_scan()
{
uchar temp;
P5OUT&=0XF0;//低位全部为0,判断有无键按下
temp=P5IN&0xf0;
if(temp==0xf0)key_flag=0;
else
{
key_flag=1;
}
}
void over()
{
uchar temp;
P5OUT&=0XF0;//低位全部为0,判断有无键按下
do
{
temp=P5IN&0xf0;
if(temp==0xf0)break;
}
while(1);
}
uchar get_key()
{
uchar key;
while(1)
{
key=scan_key(0xe);
if(key!=0xff){key|=0x80;P5OUT=0X0f; break;}
key=scan_key(0xd);
if(key!=0xff){key|=0x40;P5OUT=0X0f;break;}
key=scan_key(0xb);
if(key!=0xff){key|=0x20;P5OUT=0X0f;break;}
key=scan_key(0x7);
if(key!=0xff){key|=0x20;P5OUT=0X0f;break;}
}
key=key;
switch(key)
{
case 0x8f:key=0;break;
case 0x90:key=1;break;
case 0x91:key=2;break;
case 0x92:key=3;break;
case 0x4E:key=4;break;
case 0x4F:key=5;break;
case 0x50:key=6;break;
case 0x51:key=7;break;
case 0x2C:key=8;break;
case 0x2D:key=9;break;
case 0x2E:key=10;break;
case 0x2F:key=11;break;
case 0x28:key=12;break;
case 0x29:key=13;break;
case 0x2A:key=14;break;
case 0x2B:key=15;break;
default:key=0xff;break;
}
_NOP();
return(key);
}
/********************************************************/
/********************************************
启动总线函数
**************************************/
void start()
{
S_SDA;
_NOP();
S_SCL;
delay();
C_SDA;
delay();
C_SCL;
_NOP();
_NOP();
}
/************************************
停止总线函数
**************************************/
void stop()
{
C_SCL;
_NOP();
C_SDA;
delay();
S_SCL;
delay();
S_SDA;
_NOP();
_NOP();
_NOP();
_NOP();
}
/************************************
发送一个字节函数
**************************************/
void SendByte(uchar c)
{
uchar i;
for(i=0;i<8;i++)
{
if((c<<i)&0x80)
S_SDA;
else
C_SDA;
delay();
S_SCL;
delay();
C_SCL;
delay();
}
S_SCL;
delay();
SDA_IN;
_NOP();
_NOP();
_NOP();
if(DIN&SDA==SDA)
ack=0;
else
ack=1;
delay();
C_SCL;
_NOP();
_NOP();
}
/************************************
停止总线函数
**************************************/
void send_ack(uchar a)
{
if(a==0)
{
C_SDA;
delay();
S_SCL;
delay();
C_SCL;
delay();
S_SDA;
}
else
{
S_SDA;
delay();
S_SCL;
delay();
C_SCL;
delay();
}
}
/************************************
接收一个字节函数
**************************************/
uchar RcvByte()
{
uchar retc;
uchar i;
retc=0;
SDA_IN;
for(i=0;i<8;i++)
{
delay();
S_SCL;
delay();
retc=retc<<1;
SDA_IN;
if(READ_SDA==SDA)//read p4in
retc+=1;
delay();
C_SCL;
delay();
}
return(retc);
}
/************************************
接收一个字节函数
**************************************/
uchar ISendByte(uchar sla,uchar c)
{
start();
SendByte(sla);
if(ack==0)
return(0);
SendByte(c);
if(ack==0)
return(0);
stop();
return(1);
}
/************************************
发送一个数据串函数
**************************************/
uchar ISendstr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
start();
SendByte(sla);
if(ack==0)
return(0);
SendByte(suba);
if(ack==0)
return(0);
for(i=0;i<no;i+