当前位置: 代码迷 >> 单片机 >> 生手已经调试好几天了,MSP430做ad采样然后再LCD12864上输出的程序,还请各位大神帮忙看看
  详细解决方案

生手已经调试好几天了,MSP430做ad采样然后再LCD12864上输出的程序,还请各位大神帮忙看看

热度:84   发布时间:2016-04-28 14:55:09.0
新手已经调试好几天了,MSP430做ad采样然后再LCD12864上输出的程序,还请各位大神帮忙看看
#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(); //将采样值分别计算出对应位的输出
}
}
}










------解决方案--------------------
楼主要多多努力啊,可以逐行调试