|
#include<intrins.h> #define uchar unsigned char sbit sda = P1^7; sbit scl = P1^1; /****************************I2C總線開始*************************/ void start_24c04(void) { sda = 1; _nop_(); scl = 1; _nop_(); sda = 0; _nop_(); scl = 0; } /****************************I2C總線停止*************************/ void stop_24c04(void) { sda = 0; _nop_(); scl = 1; _nop_(); sda = 1; _nop_(); } /*****************************應(yīng)答程序**************************/ void ack_24c04(void) { uchar i = 255; scl = 1; _nop_(); while(sda && i--); scl = 0; _nop_(); } /***************************I2C總線初始化************************/ void init_24c04(void) { sda = 1;_nop_();//常態(tài) scl = 0;_nop_();//常態(tài) } /***************************讀取一個(gè)字節(jié)*************************/ uchar read_onebyte_24c04(void) { uchar i,dat; sda = 1; // 釋放總線 for(i = 0;i < 8;i++) { scl = 1; dat = dat << 1; if(sda)dat = dat | 0x01; scl = 0; } sda = 1;scl = 0; return(dat); } /*****************************寫入一個(gè)字節(jié)**********************/ void write_onebyte_24c04(uchar dat) { uchar i; for(i = 0;i < 8;i++) { sda = (bit)(dat & 0x80); dat = dat << 1; scl = 1; scl = 0; } sda = 1;scl = 0; } /*********************對(duì)某個(gè)地址寫一個(gè)字節(jié)的數(shù)據(jù)***********************/ void write_add_dat_24c04(uchar add,uchar dat) { start_24c04(); write_onebyte_24c04(0xa0); ack_24c04(); write_onebyte_24c04(add); ack_24c04(); write_onebyte_24c04(dat); ack_24c04(); stop_24c04(); } /********************讀取某個(gè)地址一個(gè)字節(jié)的數(shù)據(jù)*******************/ uchar read_add_dat_24c04(uchar add) { uchar dat; start_24c04(); write_onebyte_24c04(0xa0); ack_24c04(); write_onebyte_24c04(add); ack_24c04(); start_24c04(); write_onebyte_24c04(0xa1); ack_24c04(); dat = read_onebyte_24c04(); stop_24c04(); return(dat); } |
|