万用表测量电压正常,但是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;
}
|