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