6018|11

25

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

430f169的ad采样及lcd12864的显示程序修改 [复制链接]

 
10芯积分
无论怎么改,lcd都没有显示。。。。#ifndef shiyanh
#define shiyanh
#include "msp430.h"
#define uchar unsigned char
#define uint unsigned int
static double data;//用来存储ADC12MEM中的数据
/*=============================
#define SID P2.1;
#define CLCLK P2.0;
接线:LCD12864的5脚接P2.1
      LCD12864的6脚接P2.0
      LCD12864的4引脚直接接VCC
==============================*/
#define SID_1 P2OUT|=0x02;
#define SID_0 P2OUT&=~0x02;
#define CLK_1 P2OUT|=0x01;
#define CLK_0 P2OUT&=~0x01;
#define nop _NOP();
void delay(uchar z);
void W_8bits(uchar W_bits);
void W_byte(uchar rw,uchar rs,uchar W_data);
void lcdinit();
void W_str(uchar x,uchar y,uchar *s);
void write_com(uchar x);
void write_data(uchar x);
void write_string(uchar x,uchar y,uchar *s);
void initClock(void);
void initADC12(void);
void SendDouble(double data);
#endif




#include "msp430.h"
#include "shiyan.h"
#define uchar unsigned char
#define uint unsigned int
static double data;//用来存储ADC12MEM中的数据
  char a,b,c=0; //用来存储将要显示在LCD上的各位数据
/*=============================
#define SID P2.1;
#define CLCLK P2.0;
接线:LCD12864的5脚接P2.1
      LCD12864的6脚接P2.0
      LCD12864的4引脚直接接VCC
==============================*/
#define SID_1 P2OUT|=0x02;
#define SID_0 P2OUT&=~0x02;
#define CLK_1 P2OUT|=0x01;
#define CLK_0 P2OUT&=~0x01;
#define nop _NOP();
void delay(uchar z);
void W_8bits(uchar W_bits);
void W_byte(uchar rw,uchar rs,uchar W_data);
void lcdinit();
void W_str(uchar x,uchar y,uchar *s);
void write_com(uchar x);
void write_data(uchar x);
void write_string(uchar x,uchar y,uchar *s);
void initClock(void);
void initADC12();
void SendDouble(double data);
//初始化时钟
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(uchar z)
{
        uchar x,y;
        for(x=z;x>0;x--)
                for(y=20;y>0;y--);
}

void W_8bits(uchar W_bits)
{
  uchar i,temp;
  for(i=0;i<8;i++)
  {
    temp=W_bits;
    temp<<=i;
    if((temp&0x80)==0)
    {
      SID_0;
      nop;
      CLK_1;
      nop;
      nop;
      CLK_0;
      nop;
      SID_0;
    }
    else
    {
      SID_1;
      nop;
      CLK_1;
      nop;
      nop;
      CLK_0;
      nop;
      SID_0;
    }
  }
}
/*
  rw=1  则表示读出
  rw=0  则表示输入
  rs=1  则表示写数据
  rs=0  则表示写命令
  W_byte(0,0,x)写命令x;
  W_byte(0,1,y)写数据y;
*/
void W_byte(uchar rw,uchar rs,uchar W_data)
{
  uchar H_data,L_data,s_id=0xf8;
  if(rw==0)
  {
    s_id&=~0x04;
  }
  else
  {
    s_id|=0x04;
  }
  if(rs==0)
  {
    s_id&=~0x02;
  }
  else
    {
      s_id|=0x02;
    }
  H_data=W_data;
  H_data&=0xf0;
  L_data=W_data;
  L_data&=0x0f;
  L_data<<=4;

  W_8bits(s_id);
  W_8bits(H_data);
  W_8bits(L_data);

}
void lcdinit()
{

  delay(10);
  W_byte(0,0,0x38);
  delay(5);
  W_byte(0,0,0x38);
  delay(5);
  W_byte(0,0,0x0c);
  delay(5);
  W_byte(0,0,0x01);
  delay(5);
  W_byte(0,0,0x02);
  delay(5);
  W_byte(0,0,0x80);
  delay(5);   
}
/*很神奇的一个函数,可以输入字符串,不管是汉字还是字母表*/
/*
  x代表偏移量
  y代表第几行
  *S是字符串的指针
*/
void W_str(uchar x,uchar y,uchar *s)
{
  switch(y)
  {
  case 1:W_byte(0,0,0x80+x);break;//0x80是第一行起始位置
  case 2:W_byte(0,0,0x90+x);break;//0x90是第二行起始位置
  case 3:W_byte(0,0,0x88+x);break;//0x88是第三行起始位置
  case 4:W_byte(0,0,0x98+x);break;//0x98是第四行起始位置
  default:W_byte(0,0,0x80+x);//否则都当成第一行处理
  }
  while(*s)
  {
    W_byte(0,1,*s);
    s++;
  }
}
void write_com(uchar x)
{
  W_byte(0,0,x);
}
void write_data(uchar x)
{
  W_byte(0,1,x);
}
void write_string(uchar x,uchar y,uchar *s)
{
  switch(y)
  {
  case 1:W_byte(0,0,0x80+x);break;//0x80是第一行起始位置
  case 2:W_byte(0,0,0x90+x);break;//0x90是第二行起始位置
  case 3:W_byte(0,0,0x88+x);break;//0x88是第三行起始位置
  case 4:W_byte(0,0,0x98+x);break;//0x98是第四行起始位置
  default:W_byte(0,0,0x80+x);//否则都当成第一行处理
  }
  while(*s)
  {
    W_byte(0,1,*s);
    s++;
  }
}




//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/4096;  //data为全局变量
write_com(0x02);
_BIC_SR_IRQ(CPUOFF);                    // Clear CPUOFF bit from 0(SR)
}

void SendDouble(double data)
{
data*=100;
int temp=(int)data;
a=temp/100;//考虑到由于内部参考电压的限制,且仅考虑两位小数的情况
b=(temp%100)/10;
c=(temp%10);
write_data(a);
write_data('.');
write_data(b);
write_data(c);
write_data(' ');
write_data('V');
}




#include "msp430.h"
#include "shiyan.h"
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
double temp=0.0;  
initClock();//初始化时钟
initADC12();
P2DIR=0x03;//就是少了这条指令,导致研究好久!!!
//  CS_0;
//  P2OUT|=~BIT2;
   CLK_0;
   SID_0;
   lcdinit();
while(1)
  {
     ADC12CTL0 |= ADC12SC;                   // Sampling open
    _BIS_SR(CPUOFF + GIE);                  // LPM0, ADC12_ISR will force exit
        if(temp!=data)
    {
      temp=data;
      SendDouble(data);
    }
  }
  return 0;
}

此帖出自单片机论坛

最新回复

参考这个代码  详情 回复 发表于 2017-8-10 10:53
点赞 关注
 

回复
举报

1059

帖子

1

TA的资源

版主

沙发
 
你的LCD12864是什么样的接口,根据你的程序猜测是两线,确定一下你的接口到底对不对,给出LCD12864引脚图,帮你分析一下
此帖出自单片机论坛
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
qwerghf 发表于 2017-8-9 08:07
你的LCD12864是什么样的接口,根据你的程序猜测是两线,确定一下你的接口到底对不对,给出LCD12864引脚图, ...

是两线的,我怀疑可能是我的senddouble函数不对,接口感觉应该没有接错……

此帖出自单片机论坛

点评

你这个12864不是两线的,所以不对  详情 回复 发表于 2017-8-9 10:43
 
 
 

回复

373

帖子

0

TA的资源

纯净的硅(中级)

4
 
我怀疑是12864应该是5V供电,MSP430一般都是3.3V供电,直接连电平不匹配
此帖出自单片机论坛
 
 
 

回复

1059

帖子

1

TA的资源

版主

5
 
夜深月微凉 发表于 2017-8-9 10:11
是两线的,我怀疑可能是我的senddouble函数不对,接口感觉应该没有接错……

你这个12864不是两线的,所以不对
此帖出自单片机论坛
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

6
 
qwerghf 发表于 2017-8-9 10:43
你这个12864不是两线的,所以不对

可是我这个12864试过两线的程序而且成功了……= =
此帖出自单片机论坛
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

7
 
wudayongnb 发表于 2017-8-9 10:32
我怀疑是12864应该是5V供电,MSP430一般都是3.3V供电,直接连电平不匹配

是要在lcd上的vcc和bla和v0接5v的电吗……
此帖出自单片机论坛
 
 
 

回复

10

帖子

2

TA的资源

一粒金砂(初级)

8
 
f169上应该有5V供电口啊?
此帖出自单片机论坛
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

9
 
senddouble那个函数里,把a b c赋值给字符型数组后,只能出邪恶0.0 v的字样,还是不能正常显示= =
此帖出自单片机论坛
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

10
 
void SendDouble(float data)
{
data*=100;
int temp=(int)data;
a=temp/100;//考虑到由于内部参考电压的限制,且仅考虑两位小数的情况
b=(temp%100)/10;
c=(temp%10);
char tab[6];
tab[0]=a+'0';
tab[1]='.';
tab[2]=b+'0';
tab[3]=c+'0';
tab[4]=' ';
tab[5]='v';
write_com(0x80);
write_data(tab[0]);
write_com(0x81);
write_data(tab[1]);
write_com(0x82);
write_data(tab[2]);
write_com(0x83);
write_data(tab[3]);
write_com(0x84);
write_data(tab[4]);
write_com(0x85);
write_data(tab[5]);
}

但是lcd一直显示0.00v
此帖出自单片机论坛
 
 
 

回复

1059

帖子

1

TA的资源

版主

11
 
参考这个代码

玩转430之12864显示.rar

631.8 KB, 下载次数: 5

此帖出自单片机论坛

点评

谢谢版主已经ok了  详情 回复 发表于 2017-8-10 12:23
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

12
 

谢谢版主已经ok了
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表