TMS320F2812控制PCF8576,模拟I2C总线,驱动4位数码管LCD,第一次发送收答正常,再次发送无应答。
#include "DSP28_Device.h"
#define uint unsigned int #define uchar unsigned char
#define SDA GpioDataRegs.GPADAT.bit.GPIOA11 #define SCL GpioDataRegs.GPADAT.bit.GPIOA12 #define SDADIR GpioMuxRegs.GPADIR.bit.GPIOA11 #define SCLDIR GpioMuxRegs.GPADIR.bit.GPIOA12
uchar Digit[4]; //数据发送缓冲区
uchar F0;
void delay_us(uint time) { uint i,j;
for(i=0 ; i<time ; i++ ) for(j=0 ; j<15; j++ );
}
//起始条件 void start() { SDA = 1; SCL = 1; delay_us(50); SDA = 0; delay_us(50); SCL = 0 ; }
//停止条件 void stop() { SDA = 0 ; SCL = 1 ; delay_us(50); SDA = 1 ; delay_us(50); SCL = 0 ; }
void sendbyte(uchar ch) { uchar i; uchar temp = ch; EALLOW; SDADIR = 1; SCLDIR = 1 ; EDIS;
for(i=0 ; i<8 ; i++ ) { if( ( temp&0x80) == 0x80 ) { SDA = 1 ; } else { SDA = 0; } delay_us(10); SCL = 1; delay_us(50); SCL = 0; delay_us(20); temp = temp<< 1; } delay_us(1); SDA = 1; delay_us(1);
EALLOW; SDADIR = 0; EDIS;
SCL = 1; delay_us(20); F0 = 0; if( SDA == 1) { F0 = 1; } delay_us(10); SCL = 0; }
/* void sendbyte( uchar *ch) { uchar n = 8; uchar temp;
EALLOW; SDADIR = 1; EDIS; temp = *ch; while(n--) { if(( temp&0x80) == 0x80) { SDA = 1; SCL = 1; delay_us( 50 ); SDA = 0; SCL = 0; } else { SDA = 0; SCL = 1; delay_us( 50 ); SCL = 0; } temp = temp<<1; } } */
void clearlcd(void) { start(); //启动I2C 总线 sendbyte(0x70); //送器件地址 sendbyte(0x50); //显示模式1:1/3偏压、1:4背极、节电方式及清除显示(清屏) stop(); } void pcf8576set(void) { start(); sendbyte(0x70); //送器件地址 sendbyte(0x58); //显示模式2:1/3偏压、1:4背极、节电方式及允许显示 stop(); }
void test_lcd() { uchar i; Digit[0]=0xFF; //0 Digit[1]=0xFF; //1 Digit[2]=0xFF; //2 Digit[3]=0xFF; //3
start(); sendbyte( 0x70 ); //器件地址 if( F0 == 1 ) return; sendbyte( 0x80 ); //数据指针 if( F0 == 1 ) return; sendbyte( 0xCB ); //工作模式:正常功耗、允许显示、1/3偏置、1:3多极 if( F0 == 1 ) return; sendbyte( 0x73 ); //闪烁方式 if( F0 == 1 ) return;
for( i=0 ; i<4 ; i++ ) { sendbyte( Digit ) ; if( F0 == 1 ) return; } stop(); delay_us(5000); }
|