新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > MSP430與PCF8576驅(qū)動(dòng)程序(可以借鑒IIC的使用方法)

MSP430與PCF8576驅(qū)動(dòng)程序(可以借鑒IIC的使用方法)

作者: 時(shí)間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
#i nclude "msp430x14x.h"
#define uint unsigned int
#define uchar unsigned char
#define Num_of_Results 8
unsigned int results[Num_of_Results];
uchar PCF8576=0x70;//器件地址
//內(nèi)存數(shù)據(jù)定義
uchar ByteCnt; //I2C 數(shù)據(jù)字節(jié)計(jì)數(shù)器
uchar SlvAdr; //被控器地址
uchar SubAdr; //被控器單元地址
uchar XmtDat[5]; //發(fā)送數(shù)據(jù)緩沖區(qū)
uchar MODE2=0xCD;
uchar Bank_sel=0x78;
uchar flag;
uchar Digit[10];
uint tmp_data;
uchar n=0;
uchar i;
uint j;
uchar k;
uchar tmp[5];
#define SDA BIT6 // P2.3 controls SDA line (pull-up used for logic 1)
#define SCL BIT7 // P2.4 controls SCL line (pull-up used for logic 1)
/******************************************************************************
; 子程序
;名稱:START
;描述:啟動(dòng)I2C 總線子程序--發(fā)送I2C 起始條件
;;*****************************************************************************/
void START(void)
{
P2OUT |= SDA; //SDA=1
_NOP();
P2OUT |= SCL; //SCL=1
_NOP();
P2OUT &= ~SDA; //SDA=0
_NOP();
P2OUT &= ~SCL; //SCL=0
}
/*--------------------------------------------------------------------------
;名稱:STOP
;描述:停止I2C 總線子程序--發(fā)送I2C 總線停止條件
;-------------------------------------------------------------------------*/
void STOP(void)
{
P2OUT &= ~SDA; //SDA=0
_NOP();
P2OUT |= SCL;
_NOP();
P2OUT |= SDA;
_NOP();
P2OUT &= ~SCL;
}
void cack(void) /* 應(yīng)答位檢查 */
{
P2OUT |= SDA;
P2OUT |= SCL;
P2DIR &= ~SDA;
_NOP();
P2OUT &= ~SCL;
P2DIR |= SDA;
}
void delay(uchar time)
{
uchar i;
do{
for(i=100;i!=0;i--);
} while(--time!=0);
}
/*----------------------------------------------------------------------
;名稱:SendByte
;描述:字節(jié)數(shù)據(jù)傳送子程序發(fā)送一個(gè)字節(jié)數(shù)據(jù)或地址給被控器PCF8576
;要發(fā)送的數(shù)據(jù)在ACC 中
;發(fā)送數(shù)據(jù)正常返回標(biāo)志F0=0 F0=1 表示被控器無應(yīng)答或損壞
;------------------------------------------------------------------------*/
void SendByte(uchar Data)
{
uchar i=8;
do
{
if((Data&0x80)==0x80)
P2OUT |= SDA;
else
P2OUT &= ~SDA;

P2OUT |= SCL;
_NOP ();
P2OUT &= ~SCL;
Data=Data<<1;
} while(--i!=0);
cack();
}
/***********************************************************
;發(fā)送數(shù)據(jù)程序
;名稱:SendData
;描述:發(fā)送ByteCnt 個(gè)字節(jié)給被控器PCF8576
;被控器地址在SlvAdr 中單元地址在SubAdr 中
;所發(fā)送數(shù)據(jù)的字節(jié)數(shù)ByteCnt 在中發(fā)送的數(shù)據(jù)在XmtDat 緩沖區(qū)中
;發(fā)送數(shù)據(jù)正常返回標(biāo)志F0=0 F0=1 表示被控器無應(yīng)答或損壞
;**********************************************************/
void Display_Data(void)
{
uchar i=0;
uchar size=ByteCnt;
START(); //發(fā)送I2C 總線起始條件
SendByte(SlvAdr); //發(fā)送被控器總線地址
SendByte(SubAdr); //發(fā)送單元地址
// SendByte(0x73); //閃爍方式為正常,閃爍頻率為0.5Hz 的命令字送緩沖區(qū)首址,
//如果不需要閃爍應(yīng)將數(shù)#70H 送入緩沖區(qū)首址
SendByte(0x70); //不閃爍
do
{
SendByte(XmtDat); //發(fā)送數(shù)據(jù)
i++;
} while(--size!=0);

STOP();
delay(100);
}
void ClearLcd(void)
{
uchar size=ByteCnt;
START(); //啟動(dòng)I2C 總線
SendByte(SlvAdr); //送器件地址
SendByte(SubAdr); //發(fā)送單元地址
SendByte(0x70);
do
{
SendByte(0x00); //發(fā)送數(shù)據(jù)
} while(--size!=0);
STOP();
delay(200);
}
void PCF8576SET(void)
{
START();
SendByte(SlvAdr); //送器件地址
SendByte(MODE2); //取方式命令字
SendByte(Bank_sel);
STOP();
}
/**********************************************************
;ad初始化
*********************************************************/
void AD_Init(void)
{
P6SEL |= 0X01; //設(shè)置P6.0為模擬輸入通道

ADC12CTL0 &= ~(ENC); //設(shè)置ENC為0,從而修改ADC12寄存器的值
ADC12CTL0=ADC12ON+SHT0_1+REF2_5V+REFON;
//AD內(nèi)核打開+采樣保持時(shí)間系數(shù)(2)+選擇內(nèi)部參考電壓+打開內(nèi)部參考電壓發(fā)生器
ADC12CTL1=SHP+CONSEQ_2+SHS_1;
//采樣觸發(fā)源來自采樣定時(shí)器,由采樣輸入信號(hào)(ADC12CLK)的上升沿觸發(fā)采樣定時(shí)器
//+單通道多次采樣+采樣觸發(fā)源Time_A的輸出單元out1輸出的信號(hào)(由ccr1定時(shí)器產(chǎn)生)
ADC12MCTL0=INCH_0+SREF_1;
// 選擇AD通道0+正參考電壓=Vref,負(fù)參考電壓源AVss;
ADC12IE=0x0001; //開中斷允許-ADC12IFG.0;
TACCR0=1500;
TACCTL0|=CCIE; //TA 為比較模式(TA和CCRO比較),TA中斷允許

TACTL=TASSEL_1|MC_1; //TACLK=ACLK,定時(shí)器A為增計(jì)數(shù)模
_BIS_SR(LPM3_bits+GIE); //進(jìn)入LPM3模式,開中斷允許,等待延時(shí)時(shí)間結(jié)束

TACCTL0&=~CCIE;

P2SEL|=BIT3; //設(shè)P2.3為Time_A out1 輸出功能
P2DIR|=0x08; // 設(shè)P2.3為輸出
TACCR0=7; //初始化TACCR0,采樣時(shí)鐘源周期=CCR0J+1;

TACCR1=4;// TACCR1, TimerA,out1 ADc12

TACCTL1=OUTMOD_3;//CCR1 OUT1

TACTL=TACLR|MC_1|TASSEL_1;// 定時(shí)器時(shí)鐘=ACLK,清除TA,增計(jì)數(shù)模式
}
/****************************************************************************
;Time_A0 CCR0中斷服務(wù)程序
***************************************************************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void ta0_isr(void)
{
TACTL=0;
LPM3_EXIT;
}
/*****************************************************************************
;ADC12中斷服務(wù)程序
***************************************************************************
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR(void)
{
static unsigned int index=0; //靜態(tài)變量 

results[index]=ADC12MEM0; //移動(dòng)ADC結(jié)果去往results數(shù)組
}
*/
/***********************************************************
主程序
***********************************************************/
void main(void)
{
P2DIR |= SDA; //SDA輸出
P2DIR |= SCL; //SCL輸出
P2OUT &= ~SDA; //SDA=0
P2OUT &= ~SCL; //SCL=0
P2DIR |=BIT1;
P2OUT |=BIT1;
WDTCTL = WDTPW+WDTHOLD;
Digit[0]=0xFC; //0
Digit[1]=0x60; //1
Digit[2]=0xDA; //2
Digit[3]=0xF2; //3
Digit[4]=0x66; //4
Digit[5]=0xB6; //5
Digit[6]=0xBE; //6
Digit[7]=0xE0; //7
Digit[8]=0xFE; //8
Digit[9]=0xF6; //9
SubAdr=0x80; //數(shù)據(jù)起始地址(總線地址)
SlvAdr=PCF8576;//總線從地址
ByteCnt=5; //位設(shè)置
PCF8576SET();//設(shè)置方式
AD_Init();
ADC12CTL0|=ENC;//使能轉(zhuǎn)換
//ADC12CTL0|=ADC12SC;
ClearLcd(); //清空
}
//----------------------------------
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR(void)
{
static unsigned int index=0;
results[index]=ADC12MEM0;

tmp_data=results[index];
for(i=0;i {
k=tmp_data%10;
tmp_data=tmp_data/10;

XmtDat=Digit[k];
tmp=k;
}
for(i=ByteCnt-1;i!=0;i--)
{

if(tmp==0)
XmtDat=0x00;
else
break;
}
XmtDat[4] |=0x40;
Display_Data();
index=(index+1)%Num_of_Results;
}
/*ADC12CTL1 |= CSTARTADD_0; //轉(zhuǎn)換的起始地址為:ADCMEM0
ADC12MCTL0 = INCH_0 + EOS; //設(shè)置參考電壓分別為AVSS和AVCC,輸入通道為A0

ADC12CTL0 |= ADC12ON;
ADC12CTL0 |= MSC;


ADC12CTL1 |= CONSEQ_1; //轉(zhuǎn)換模式為:多通道、單次轉(zhuǎn)換

ADC12CTL1 |= ADC12SSEL_1; //SMCLK
ADC12CTL1 |= ADC12DIV_0; //時(shí)鐘分頻為1
ADC12CTL1 |= (SHP); //采樣脈沖由采用定時(shí)器產(chǎn)生

ADC12CTL0 |= ENC; //使能ADC轉(zhuǎn)換
return;
}
void Init_TimerA(void)
{
TACTL = TASSEL1 + TACLR; // 選擇SMCLK,清除TAR
TACTL += ID1;
TACTL += ID0; // 1/8 SMCLK
CCTL0 = CCIE; // CCR0 中斷允許
CCR0 = 4000; // 時(shí)間間隔為 250Hz
TACTL |= MC0; // 增記數(shù)模式

return;
}
void main(void)
{
uint out_data;
uint tmp_data;
uchar i;
uchar k;
uchar tmp[5];
P2DIR |= SDA; //SDA
P2DIR |= SCL; //SCL
P2OUT &= ~SDA;
P2OUT &= ~SCL;
WDTCTL = WDTPW+WDTHOLD;
Digit[0]=0x7E; //0
Digit[1]=0x18; //1
Digit[2]=0xB6; //2
Digit[3]=0xBC; //3
Digit[4]=0xD8; //4
Digit[5]=0xEC; //5
Digit[6]=0xEE; //6
Digit[7]=0x38; //7
Digit[8]=0xFE; //8
Digit[9]=0xFC; //9
SubAdr=0x80;
SlvAdr=PCF8576;
ByteCnt=4;
PCF8576SET();
ClearLcd();
AD_Init();
TIME_Init();
out_data=0;
while(1)
{
tmp_data=out_data;
for(i=0;i {
k=tmp_data%10;
tmp_data=tmp_data/10;

XmtDat=Digit[k];
tmp=k;
}
XmtDat[2] |= 0x01;
for(i=ByteCnt-1;i!=0;i--)
{
if( tmp == 0 )
XmtDat=0x00;
else
break;
}
Display_Data();
out_data++;
}
}*/



關(guān)鍵詞: MSP430PCF8576II

評(píng)論


技術(shù)專區(qū)

關(guān)閉