程序网上下的,自己稍微改动了一下
#include <msp430x16x.h>
#include"nokia_5110.h"
#include"nokia_5110.c"
#define SCL_Out P2DIR |= BIT0;
#define SDA_Out P2OUT |= BIT1;
#define SDA_In P2OUT &= ~BIT1;
#define SCL_L P2OUT &= ~BIT0;
#define SCL_H P2OUT |= BIT0;
#define SDA_L P2OUT &= ~BIT1;
#define SDA_H P2OUT |= BIT1;
#define uchar unsigned char
#define uint unsigned int
unsigned int Initdata[4]={0};
extern unsigned int Initdata[4];
uint result_gd=0;
unsigned long sum = 0;
uint real;
void start()
{
SDA_Out;
SDA_L;
SCL_Out;
SCL_H;
SDA_H;
SDA_L;
SCL_L;
}
/*************终止信号*************/
void stop()
{ SDA_Out;
SDA_L;
SCL_H;
SDA_H;
}
/*************向I2C总线发送一个字节************/
void Send1byte(uint byte)
{
uint i;
SDA_Out;
for(i=0;i<8;i++)
{
if((byte<<i) & 0x80)
SDA_H
else
SDA_L;
SCL_H;
SCL_L;
}
SDA_H;
SCL_H;
SCL_L;
}
/**************读取一个字节**************/
uint Read1byte()
{
uint temp=0,i;
SDA_In;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL_L;
SCL_H;
if(P2IN&0x02)
{
temp|=0x01;
}
}
SDA_Out;
SCL_L;
SDA_L;
SCL_H;
SCL_L;
SDA_H;
return temp;
}
/*******************Config寄存器*********************/
void Confige_1115(uchar channel )
{
uchar i=0;
switch(channel)
{
case 0: Initdata[2] = 0xc2; break;
case 1: Initdata[2] = 0x52; break;
case 2: Initdata[2] = 0x62; break;
case 3: Initdata[2] = 0x72;
}
Initdata[0] =0x90; // 启动配置命令
Initdata[1] =0x01; // 指向配置寄存器
Initdata[3] =0x83; // 配置字低字节
SCL_H;
start();
for(i=0;i<4;i++)
{
Send1byte(Initdata[i]);
_NOP();
}
stop();
}
/************指向转换结果寄存器***************/
void Point_reg(void)
{
uchar i=0;
Initdata[0] =0x90; // 地址 + 写命令
Initdata[1] =0x00; // 指向转换结果寄存器
SDA_Out;
SCL_H;
start();
for(i=0;i<2;i++)
{
Send1byte(Initdata[i]);
}
stop();
}
/**************读取转换结果***************/
uint Read_1115(void)
{
uchar ResultL,ResultH;
uint Result;
SCL_H;
start();
Send1byte(0x91);
ResultH=Read1byte();
ResultL=Read1byte();
stop();
Result=ResultH*256+ResultL;
return Result;
}
/**************起始信号***************/
void Init_clk()
{
unsigned int i;
BCSCTL1&=~XT2OFF; //XT2OFF=0x80 初始化XT2(开启xt2振荡器)
BCSCTL2|=SELM1+SELS;//选择MCLK、SMCLK的时钟源是TX2LCK(8M的高频晶体振荡器)
do
{
IFG1&=~OFIFG; //将IFG1.1位置0
for(i=0xff;i>0;i--);
}
while((IFG1&OFIFG)); //晶体振荡器的故障诊断,OFIFG=0x02,若该位是置位状态则振荡器有故障出现,若复位则表示振荡器没有故障,已经起振了
BCSCTL2|=SELM_2; //MCLK的时钟源为XT2CLK
}
/*************************************************************
本例仅供参考,希望各位在浏览程序的同时去看看ADS1115的Datasheet,
这样才能更深刻的体会到怎么去看懂一个芯片的数据手册,当自己拿着
一块从来没有接触过的芯片的时候能凭借自己的能力征服它。
*************************************************************/
unsigned int value;
void main( )
{
uchar j,i;
WDTCTL = WDTPW + WDTHOLD;
Init_clk();
P3SEL = 0x00; //设置IO口为普通I/O模式
P3DIR = 0xff; //设置IO口方向为输出
P3OUT = 0x01;
LCD_Init();
LCD_clear();
while(1)
{ int v1,v2,v3,v4;
for(i=0;i<16;i++)
sum+=Read_1115();//将ad转换的值赋给sum,取16次转换的平均值
sum>>=4;//左移相当于除以16
real=sum/10;//4.096*(2/3)=2.731,因为参考电压3.3/2.731=1.2084,再扩大1000倍便于显示
//对于AINn不是GND的情况,+FS最高为7fff,最低-FS为1000,只显示0~+FS只除以32768,
//90用于误差矫正
v1 = real / 1000; //最高位
v2 = (real - v1*1000)/100;//次高位
v3 = (real - v1*1000 - v2*100)/10;//次低位
v4 = real - v1*1000 - v2*100 - v3*10; //最低位
display_char(7,1,v1+48);
display_char(8,1,46);
display_char(9,1,v2+48);
display_char(10,1,v3+48);
display_char(11,1,v4+48);
}
}
|