#include <msp430x14x.h>
#define uchar unsigned char
#define uint unsigned int
double data;//用来存储ADC12MEM中的数据
char a,b,c=0; //用来存储将要显示在LCD上的各位数据
//初始化时钟
void initClock(void){
BCSCTL1=RSEL2+RSEL1+RSEL0+DIVA_1;//XT2开启 LFXT1工作在低频模式 ACLK 2分频( 注释:原来的人没做分频,我担心频率过高) 最高的标称频率
DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率
do{
IFG1&=~OFIFG;//清除振荡器失效标志
for(unsigned int i=255;i>0;i--);
}while(IFG1&OFIFG);//判断XT2是否起振
BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频
}
//延时函数
void delay(unsigned int m){
for(unsigned int i=0;i<m;i++)
_NOP();
}
void Lcd_InsWrite(uchar type,uchar transdata) //串行通信传输函数 ,transdata为要写入的数据或指令
{
uchar firsttype=0xf8; //firsttype为第一字节,用来判断是写数据还是写指令。默认是写指令
uchar temp;
uchar i,j=3;
if(type) //判断是是写数据还是写指令,0为写指令,1为写数据
firsttype=firsttype|0x02; //如果要写数据,则把第一字节的第二位至高
P1OUT|=BIT0; //给CS高电平开始写入操作
P1OUT&=~BIT2; //给SCLK时钟脉冲,在每个上升沿把数据写入到LCD
while(j>0) //把写数据指令方式和要写入的数据发送给LCD
{
if(j==3) temp=firsttype; //确认要写入第一字节数据,及数据指令判断
else if(j==2) temp=transdata&0xf0;//确认要写入第二字节数据
else temp=(transdata<<4)&0xf0; //确认要写入第三字节数据
for(i=8;i>0;i--) //把要写入的数据每个位由STD发送到LCD,写入
{
if(temp&0x80) P1OUT|=BIT1; //写入第一字节,及最高字节
else P1OUT&=~BIT1;
P1OUT|=BIT2; //给SCLK一个上升沿,写入一位
temp<<=1; //把数据指令左移一位,开始写入下一位数据
P1OUT&=~BIT2; //给SCLK一个低电平,确保下一次写入数据正常
}
delay(1); //做简单的延时
j--; //准备写入下一字节数据
}
P1OUT&=~BIT0; //写入数据指令完毕,给STD和CS低电平
P1OUT&=~BIT1;
}
//ADC12采样初始化,并打开中断子程序计算采样值的大小
void initADC12(){
P6SEL=0X01;//P6.0作为模拟输入
ADC12IE=0X01; //开放中断ADC12IFG.0
ADC12CTL0=ADC12ON+SHT0_4+REFON+REF2_5V;//打开ADC转换的核,采用内部参考电压2.5v;
ADC12CTL1=SHP; //信号源内部触发
ADC12MCTL0=SREF_1;//使用内部2.5V作为参考电压
ADC12CTL0 |=ENC; //开放使能
}
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR(){
data=ADC12MEM0*2.5/4095; //data为全局变量
Lcd_InsWrite(0,0x02);//DDRAM地址归位
}
//LCD初始化函数
//函数声明:采用MSP430端口p3.5-3.7连接LCD的E,RW,和RS端口;P4口用来传送数据
void init_lcd(void)
{
Lcd_InsWrite(0,0x30); //基本指令
delay(400);
Lcd_InsWrite(0,0x01); //清除显示
delay(400);
Lcd_InsWrite(0,0x0e);
// 显示状态设定:整体显示,游标on,游标位置反白
Lcd_InsWrite(0,0x02);//DDRAM地址归位
delay(400);
}
//将ADC转换后的值写入LCD
void WriteData(){
data*=100;
int temp=(int)data;
a=temp/100;//考虑到由于内部参考电压的限制,且仅考虑两位小数的情况
b=(temp%100)/10;
c=(temp%10);
Lcd_InsWrite(1,a+0x30);
Lcd_InsWrite(1,'.');
Lcd_InsWrite(1,b+0x30);
Lcd_InsWrite(1,c+0x30);
delay(400);
}
//主函数部分
void main(){
double temp=0.0;
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
initClock();//初始化时钟
init_lcd(); //lcd初始化
initADC12();//ADC12采样初始化,并打开中断子程序计算采样值的大小
for (;;)
{
ADC12CTL0 |= ADC12SC; // Sampling open
_BIS_SR( GIE); //关闭CPU打开总中断
}
while(1){
if(data!=temp){
temp=data;
Lcd_InsWrite(0,0x80);//确定显示位置
WriteData(); //将采样值分别计算出对应位的输出
}
}
}
------解决方案--------------------
楼主要多多努力啊,可以逐行调试