成功驱动5150用HT68F30
生活随笔
收集整理的這篇文章主要介紹了
成功驱动5150用HT68F30
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
用了自己寫的起動總線和停止總線,終于可以成功
// PROGRAM : 4-17.c 2011.0521 // FUNCTION : I2C Master/Slave Mode Demo Program By Steven // Note : Configuration Option Setting-- // SIM Function = Enable //void I2C_START(void); //void I2C_STOP(void); //void WriteByte(unsigned short); //unsigned short ReadByte(void); //void CheckACK(void); //void PAUSEIIC(unsigned short); //void I2C_INIT(void); //void INIT_TVP5150(void); //void IICWRITE_ADDRSSDATA(unsigned char addrss,unsigned char data); //#pragma rambank0 //BIT Data Type Must in Bank 0 //bit RxFlag,DeviceFlag; //unsigned short RxData,TxData; #include "HT68F30.h" #include "ht68f30iic.h"const unsigned char IICADDRSS=0XB8;//I2CSEL接做VD1_OUT7的話地址是0XB8,I2CSEL=0,地址是0XBAvoid I2C_INIT(void) {_cp0c=0x08; _cp1c=0x08; //_acerl=0; //Disable CP0/CP1/ADCWIDEO_PWDN_C=0;//把PWN設置成為輸出狀態WIDEO_PWDN=0;//設置時鐘頻率WIDEO_RESET_C=0;//把復位端口設置成輸出狀態WIDEO_RESET=1; //低電平進行復位 置成1保證處在正常工作狀態 // PWR_EN5150C=0; // PWR_EN5150=1;//電源供電給5150//SEG_Port=0; SEG_PortC=0; //Clear & Config SEG_Port as O/P//ID_PortC=0xFF; ID_Pull=0xFF; //ID_Port as I/P & Enable Pull-up//FG_LED=0; FG_LEDC=0; //Clear FG_LED & Config as O/P//_sima=GetID()<<1; //Get ID from DIP SW//_simc0=0b11000000; //Select I2C Slave Mode//_mf2e=1; _sime=1; _simen=1; _emi=1; //Enable Interrupt and SIM Function } void INIT_TVP5150(void) { unsigned char data; /* unsigned int k;k=10;while(k--){ SCL=0; SDA=0; //Set SCL=0, SDA=0//PAUSEIIC(10);_delay(10);SCL=1; SDA=1; //Set SCL=0, SDA=0 //PAUSEIIC(10);_delay(10);}//I2C_INIT();//開始IIC前開始的初始化工作IICWRITE_ADDRSSDATA(0x03,0x8F);//2. 雜項控制寄存器k=10;SCLC=0;SDAC=0;while(k--){ SCL=0; SDA=0; //Set SCL=0, SDA=0//PAUSEIIC(10);_delay(10);SCL=1; SDA=1; //Set SCL=0, SDA=0 //PAUSEIIC(10);_delay(10);}data =IICREAD_ADDRSSDATA(0x03);//0x0D默認值是0x47 k=10;while(k--){ SCL=0; SDA=0; //Set SCL=0, SDA=0//PAUSEIIC(10);_delay(10);SCL=1; SDA=1; //Set SCL=0, SDA=0 //PAUSEIIC(10);_delay(10);}//if(data!=0)if(data==0x8F){Test_Pc6C=0;Test_Pc6=1; _tmpc0=0;//取消PC5引腳的復用功能Test_Pc5C=0; //如果從機應答的話把這個引腳電平拉高Test_Pc5=1; }*/IICWRITE_ADDRSSDATA(0x03,0x8F);//2. 雜項控制寄存器IICWRITE_ADDRSSDATA(0x0D,0x40);//3. 輸出和數據比率選擇寄存器 } void IICWRITE_ADDRSSDATA(unsigned char addrss,unsigned char data) {I2C_START();WriteByte(IICADDRSS);CheckACK();I2C_START();WriteByte(addrss); CheckACK();WriteByte(data);CheckACK();_delay(64);//5150要求有64us的延時I2C_STOP(); } unsigned char IICREAD_ADDRSSDATA(unsigned char addrss) {unsigned char data;I2C_START();WriteByte(0XB8);//寫器件地址CheckACK();WriteByte(addrss);//寫寄存器地址CheckACK();//_delay(64);I2C_STOP();I2C_START();WriteByte(0XB9);//寫器件地址//_delay(64);CheckACK();data=ReadByte();//讀 I2C_STOP();return data; } void I2C_START(void) { /* SCL=0; SDA=0; //Set SCL=0, SDA=0SCLC=0;SDAC=0; //SCL/SDA as Output Mode_delay(10);SCL=1; SDA=1; _delay(10); //SCL=1, SDA=1, Delay 10usSDA=0; _delay(10); //SDA=0, Delay 10us SCL=0; _delay(10); //SCL=0, Delay 10us */ SCLC=0;SDAC=0;SCL=0;SDA=0;_delay(10);SCL=1;SDA=1;_delay(10);SDA=0;_delay(10);SCL=0;_delay(10); } void I2C_STOP(void) { /* SCL=0; SDA=0; //Set SCL=0, SDA=0SDAC=0; //SDA as Output Mode_delay(10);SCL=1; _delay(10); //SCL=1, Delay 10usSDA=0; _delay(10); //SDA=0, Delay 10usSDA=1; _delay(10); //SDA=1, Delay 10us SCL=0; _delay(10); //SCL=0, Delay 10us */ SCLC=0;SDAC=0;SCL=0;SDA=0;_delay(10);SCL=1;_delay(10);SDA=1;_delay(10);SCL=0;_delay(10); } void WriteByte(unsigned short I2CData) { unsigned short temp=0b10000000;SCLC=0;SCL=0; SDAC=0; //SCL=0, SDAC as Outputdo{ SDA=I2CData & temp; _delay(10); //Set SDA State and delay 10usSCL=1; _delay(10);//_delay(10); SCL=0; _delay(10); //Generate SCL Clocktemp>>=1; //Next Bit} while (temp!=0); } unsigned char ReadByte(void) { unsigned char I2CData=0, temp=0b10000000;SDAC=1; //Config SDAC as InputSCLC=0;SCL=0;do{ SCL=1; _delay(10); //Set SCL=1, Delay 10usif(SDA) I2CData|=temp; //Received DataSCL=0; _delay(10); //Set SCL=0, Delay 10ustemp>>=1; //Next Bit} while (temp!=0);SDA=1; SDAC=0; _delay(10); //Send NoACK SignalSCL=1; _delay(10); SCL=0;return I2CData; } void CheckACK(void) { unsigned short i=200;SDAC=0;SDA=1;// 先由主機把數據線拉高釋放總線 再去檢測數據線的電平高低SDAC=1; //Config SDAC as InputSCL=1; //_delay(10); //Set SCL=1, Delay 10uswhile(i--){//Test_Pc4C=0; //如果從機應答的話把這個引腳電平拉高//Test_Pc4=1; if(!SDA) {//DeviceFlag=1; Test_Pc4C=0; //如果從機應答的話把這個引腳電平拉高Test_Pc4=1; //_tmpc0=0;//取消PC5引腳的復用功能//Test_Pc5C=0; //如果從機應答的話把這個引腳電平拉高//Test_Pc5=1;break;}//Break if Device Respounding_delay(100);//200*100uS=2ms Waiting Time} SCL=0; _delay(10); //Set SCL=0, Delay 10us } void PAUSEIIC(unsigned short i) { unsigned short j;for (j=0;j<i;j++) _delay(10000); //Delay i*10mS }
總結
以上是生活随笔為你收集整理的成功驱动5150用HT68F30的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动移动鼠标避免锁屏
- 下一篇: 初级程序员和二级Java哪个难,软考初级