#include "msp430x14x.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define DELAY _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
#define CD_HIGH P4OUT|=BIT1;DELAY;
#define CD_LOW P4OUT&=~BIT1;DELAY;
#define E_HIGH P4OUT|=BIT2;DELAY;
#define E_LOW P4OUT&=~BIT2;DELAY;
#define WR_HIGH P4OUT|=BIT7;DELAY;
#define WR_LOW P4OUT&=~BIT7;DELAY;
#define RD_HIGH P4OUT|=BIT5;DELAY;
#define RD_LOW P4OUT&=~BIT5;DELAY;
#define Dataport_out P2OUT
#define Dataport_in P2IN
#define Dataport_dir P2DIR
uchar qianZT[10]={0,0,0,0,0,0,0,0,0,0};
uchar zuoZT[10]={0,0,0,0,0,0,0,0,0,0};
uchar youZT[10]={0,0,0,0,0,0,0,0,0,0};
uchar a[7]={0,0,0,0,0,0,0};//初始时显示A0:0.00。。。8通道AD采样数值的存储单元
uchar b[7]={0,0,0,0,0,0,0};
uchar c[7]={33,18,26,16,14,16,16};
uchar Bit1[3]={0,0,0};
uchar Bit2[3]={0,0,0};
uchar Bit3[3]={0,0,0};
uint ADCBuf1[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//保存采集到的数据
uint ADCBuf2[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uint ADCBuf3[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
ulong Sum1=0; //20个数据的和
ulong Sum2=0;
ulong Sum3=0;
ulong VBuf1=0; //电压扩大10000000的值
ulong VBuf2=0;
ulong VBuf3=0;
/****************************************************变量设置**************************/
uchar Count=0,x=0,y=0;
uchar INCOM;
uchar turnf[8] = {7,6,5,4,3,2,1,0};
uchar flag=0; //状态标志位
uchar flgfou=0;
uchar flgfan=0;
uchar flgzheng=1;
uint flgqian=0;
uint flgzuo=0;
uint flgyou=0;
uint Low=20;
uint cont=0;
uint MAX=15,MIN=15; // 误差区间
uint stMid=180;
uint stLeft=180;
uint stRigh=180;
ulong datMid=0;
ulong datLeft=0;
ulong datRigh=0;
uchar keyvaluep1=0;
/****************************************************变量设置**************************/
//延时子程序
void DelayMs(uint ms)
{
while(ms--)
{
for(uint i=0;i<800;i++);
}
}
//时钟初始化函数
void InitClock(void)
{
BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频 最高的标称频率
DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率
do{
IFG1&=~OFIFG;//清除振荡器失效标志
for(uint i=255;i>0;i--);
}while(IFG1&OFIFG);//判断XT2是否起振
BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频
}
//端口初始化函数
void InitPort()
{
P1SEL=0x00;//P1口所有引脚设置为一般的IO口
P1DIR=0xfc;//P1.0 P1.1 P1.2 P1.3~p1.5设置为输出方向
P1OUT=0x00;//P1口先输出低电平
P1IE=0x03;//P1.0,p1.1中断允许
P1IES=0x03;//P1.0,p1.1下降沿触发中断
P2SEL=0x00;//P2口所有引脚设置为一般的IO口
P4SEL=0x00;//P4口所有引脚设置为一般的IO口
P5SEL=0x00;
P5DIR=0xff;
P2DIR=0xFF;//P2口所有引脚设置为输出方向
P4DIR=0xFF;//P4口所有引脚设置为输出方向
P2OUT=0x00;//P2口先输出低电平
P4OUT=0xFF;//P4口先输出高电平
P5OUT=0x00;
}
/*******************************LCD12864显示****************************************************/
/***********************************************************************************************/
//读状态字
void Lcdsta()
{
E_HIGH;
Dataport_dir=0x00;
CD_HIGH;
RD_LOW;
WR_HIGH;
INCOM=Dataport_in;
E_LOW;
DELAY;
Dataport_dir=0xff;
}
/************************************************/
/* 状态位STA1,STA0判断读写指令和读写数据*/
/* 在读写数据或者写入命令前必须保证均为1 */
/************************************************/
void fnSTA01()
{
uchar i;
Lcdsta();
for(i=10;i>0;i--)
{
if((INCOM & 0x03) == 0x03) // 读取状态
{
break;
}
}
}
/********************************************/
/* 检查STA2,如果STA2=1 为自动读状态*/
/*****************************************/
void fnSTA2()
{
uchar i;
Lcdsta();
for(i=10;i>0;i--)
{
if((INCOM & 0x04) == 0x04)
{
break;
}
}
}
/***********************************************/
/* 状态位STA3 判断STA3 = 1 数据自动写状态*/
/***********************************************/
void fnSTA3()
{
uchar i;
Lcdsta();
for(i=10;i>0;i--)
{
if((INCOM & 0x08) == 0x08)
{
break;
}
}
}
/************************************************/
/* 状态位STA6 判断STA6 =1 屏读/屏拷贝状态*/
/************************************************/
void fnSTA6()
{
uchar i;
Lcdsta();
for(i=10;i>0;i--)
{
if((INCOM & 0x40) == 0x00)
{
break;
}
}
}
/************************/
/* 写指令 */
/************************/
void WriteCommand(uchar Command)
{
fnSTA01();
E_HIGH;
CD_HIGH;
WR_LOW;
RD_HIGH;
Dataport_out=Command;
E_LOW;
DELAY;
}
/************************/
/* 写数据 */
/************************/
void WriteData(uchar Data)
{
fnSTA3();
E_HIGH;
CD_LOW;
WR_LOW;
RD_HIGH;
E_LOW;
Dataport_out=Data;
DELAY;
}
/************************/
/* 写双参数的指令*/
/************************/
void fnPR1(char cmd,char dat1,char dat2)
{
WriteData(dat1);
WriteData(dat2);
WriteCommand(cmd);
}
/************************/
/* 写单参数的指令*/
/************************/
void fnPR11(char cmd,char dat)
{
WriteData(dat);
WriteCommand(cmd);
}
/************************/
/* 写无参数的指令*/
/************************/
void fnPR12(char Dat)
{
WriteCommand(Dat);
}
/************************/
/* 设置当前地址*/ //RAM里
/************************/
void fnSetPos(unsigned char urow, unsigned char ucol)
{
unsigned int iPos;
iPos = (unsigned int)urow * 30 + ucol; //?~~~~~~~~~~~~~~~~~~
fnPR1(0x24,iPos & 0xFF,iPos / 256);
//gCurRow = urow;
//gCurCol = ucol;
}
/******************************/
/* 在col行row列显示内部字符dat*/
/******************************/
void printf(char col,char row,char dat)
{
uchar D1;
D1=col*16+row;
fnPR1(0x24,D1,0x00); // 置地址指针,d1代表从左至右第D1个字符(0~127),每个字符8*8点
fnPR11(0xc4,dat);//地址不变,写数据,dat为内部字符地址
}
/*************************/
/* 画点*/
/*************************/
void point(unsigned char x,unsigned char y,unsigned char s)
{
unsigned char x1;
x1 = x >> 3; // 取Y方向分页地址
fnSetPos(y,x1); // 起点定位
x1 = turnf[ x & 0x07 ];
x1 = 0xF0 | x1 | s; // 字节内位置计算
fnPR12(x1); // 画上屏幕S显示属性8 画点0 擦除点
}
/************************************************/
/* 画线任意方向的斜线,直线数学方程aX+bY=1 */
/************************************************/
void Linexy(unsigned char x0,unsigned char y0,unsigned char xt,unsigned char yt,unsigned char s)
{
register unsigned char t;
int xerr = 0,yerr = 0;
int delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x = xt-x0; // 计算坐标增量
delta_y = yt-y0;
uRow = x0;
uCol = y0;
if(delta_x>0)
{
incx = 1; // 设置单步方向
}
else if( delta_x==0 )
{
incx=0; // 垂直线
}
else
{
incx = -1;
delta_x = -delta_x;
}
if(delta_y>0)
{
incy=1;
}
else if( delta_y==0 )
{
incy=0; // 水平线
}
else
{
incy=-1;
delta_y=-delta_y;
}
if( delta_x > delta_y )
{
distance=delta_x; // 选取基本增量坐标轴
}
else
{
distance=delta_y;
}
for( t=0;t <= distance+1; t++ ) // 画线输出
{
point(uRow,uCol,s); // 画点
xerr += delta_x;
yerr += delta_y;
if( xerr > distance )
{
xerr -= distance;
uRow += incx;
}
if( yerr > distance )
{
yerr -= distance;
uCol += incy;
}
}
}
/********************************************/
/* 画圆数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
/********************************************/
void circle(unsigned char O