在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > I2C讀寫(xiě)心得(DS1307)

            I2C讀寫(xiě)心得(DS1307)

            作者: 時(shí)間:2017-06-04 來(lái)源:網(wǎng)絡(luò) 收藏
            由于是個(gè)初學(xué)者,對(duì)從來(lái)沒(méi)有接觸過(guò),看了幾遍規(guī)則后,有了點(diǎn)了解,覺(jué)的在這樣IO口資源不是相對(duì)充足的芯片上,來(lái)擴(kuò)展總線接口,I2C是最好的選擇了,他只占用的兩個(gè)IO口,還可以將不同和相同的I2C器件掛接在相同的總線上,
            但好的東西,簡(jiǎn)潔的東西,操作起來(lái)不是那么簡(jiǎn)單的,因?yàn)樗挥袃筛€,SDA和SCL,所有的讀寫(xiě)都要通過(guò)這兩根線的不同電平來(lái)控制,看了幾遍總線規(guī)則,對(duì)他的讀寫(xiě)時(shí)序還是不懂.最叫人郁悶的是對(duì)AT24C02的讀寫(xiě),我寫(xiě)了一個(gè)晚上的程序,竟然讀不出來(lái),時(shí)序什么好像都沒(méi)有錯(cuò),到現(xiàn)在我還是不知道什么原因,后來(lái)?yè)Q了一個(gè)DS1307來(lái)試,還好這次可以了,對(duì)DS1307的讀寫(xiě),當(dāng)每次向寫(xiě)時(shí),要等待從器件的應(yīng)答位,我在這里就是這樣處理,用時(shí)間的延遲來(lái)代替對(duì)應(yīng)答位的檢測(cè),實(shí)踐證明這樣完全是可以的
            #include reg51.h>
            #include intrins.h>
            /*********************************LCD定義部分********************************/
            //輸入方式設(shè)置
            #define LCD_AC_AUTO_INCREMENT 0x06 //數(shù)據(jù)讀、寫(xiě)操作后,AC自動(dòng)增一
            #define LCD_AC_AUTO_DECREASE 0x04 //數(shù)據(jù)讀、寫(xiě)操作后,AC自動(dòng)減一
            #define LCD_MOVE_ENABLE 0x05 //數(shù)據(jù)讀、寫(xiě)操作,畫(huà)面平移
            #define LCD_MOVE_DISENABLE 0x04 //數(shù)據(jù)讀、寫(xiě)操作,畫(huà)面不動(dòng)
            #define LCD_GO_HOME 0x02 //AC=0,光標(biāo)、畫(huà)面回HOME位
            //設(shè)置顯示、光標(biāo)及閃爍開(kāi)、關(guān)
            #define LCD_DISPLAY_ON 0x0C //顯示開(kāi)
            #define LCD_DISPLAY_OFF 0x08 //顯示關(guān)
            #define LCD_CURSOR_ON 0x0A //光標(biāo)顯示
            #define LCD_CURSOR_OFF 0x08 //光標(biāo)不顯示
            #define LCD_CURSOR_BLINK_ON 0x09 //光標(biāo)閃爍
            #define LCD_CURSOR_BLINK_OFF 0x08 //光標(biāo)不閃爍
            //光標(biāo)、畫(huà)面移動(dòng),不影響DDRAM
            #define LCD_LEFT_MOVE 0x18 //LCD顯示左移一位
            #define LCD_RIGHT_MOVE 0x1C //LCD顯示右移一位
            #define LCD_CURSOR_LEFT_MOVE 0x10 //光標(biāo)左移一位
            #define LCD_CURSOR_RIGHT_MOVE 0x14 //光標(biāo)右移一位
            //工作方式設(shè)置
            #define LCD_DISPLAY_DOUBLE_LINE 0x38 //兩行顯示
            #define LCD_DISPLAY_SINGLE_LINE 0x30 //單行顯示
            #define LCD_CLEAR_SCREEN 0X01 //清屏
            /***********************LCD1602地址相關(guān)******************************/
            #define LINE1_HEAD 0x80 // 第一行DDRAM起始地址
            #define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址
            #define LINE1 0 //第一行
            #define LINE2 1 //第二行
            #define LINE_LENGTH 16 //每行的最大字符長(zhǎng)度
            /***********************LCD1602接線引腳定義**************************
            **********************可根據(jù)實(shí)際電路改變*******************************/
            #define LCDIO P2 //定義P2口與LCD1602的數(shù)據(jù)口相接
            sbit LCD_RS=P1^4;
            sbit LCD_RW=P1^3;
            sbit LCD_EN=P1^2;
            sbit LCD_BUSY=LCDIO^7;
            /**********************另外相關(guān)的定義*********************************/
            #define HIGH 1
            #define LOW 0
            #define TURE 1
            #define FALSE 0
            #define uchar unsigned char
            #define uint unsigned int

            /*************************以下是函數(shù)的申明部分*************************/
            void LCD_init(void); //LCD1602初始化
            void LCD_send_command(uchar command); //
            void LCD_send_data(uchar dat);
            void LCD_write_char(uchar x,uchar y,uchar dat);
            void LCD_write_string(uchar x,uchar y,char *Data);
            void delay_ms(uint n);
            void LCD_check_busy(void);
            /*********************結(jié)束***********************************************/
            /***************************DS1307開(kāi)始*****************************************************************/
            #define Wait1us _nop_();
            #define Wait2us {_nop_();_nop_();}
            #define Wait4us {Wait2us;Wait2us;}
            #define Wait8us {Wait4us;Wait4us;}
            #define Wait10us {Wait8us;Wait2us;}
            #define WRITEDS1307 0xD0
            #define READDS1307 0xD1
            sbit SDA=P2^7; //DS1307 Serial-Data Input pin 5
            sbit SCL=P2^6; //DS1307 Serial-Clock Input pin 6
            /************************************************************/
            void I2C_start(void);//I2C start function
            void I2C_stop(void);//I2C stop function
            //void I2C_send_ack(void);//I2C send responsion function
            void I2C_send_noack(void);
            void I2C_write_byte(unsigned char IIC_data);//I2C bus write byte function
            unsigned char I2C_read_byte(void);//I2C bus read byte function
            /***********************************************************************/
            void Write1307(unsigned char add,unsigned char dat);//write information to ds1307
            unsigned char Read1307(unsigned char add);//read information from ds1307
            void Read_RTC(void);//read RTC
            void Set_RTC(void);//set RTC
            /***********************************************************************/
            code unsigned char set_rtc_code[7]={0,30,7,4,20,4,6};
            code unsigned char rtc_address[7]={0x00,0x01,0x02,0x03,0x04,0x05,0x06};
            code unsigned char *day[7]={Mon,Tue,Wen,Thu,Fri,Sat,Sun};
            unsigned char read_rtc_code[7];
            /***********************************************************************/
            void Initial(void);//system initize function
            void Display(void);//RTC display function
            /***********************************************************************/
            /***********************************************************************/
            void main(void)
            {
            Initial();
            while(1)
            {
            Read_RTC();
            Display();
            }
            }
            /***********************************************************************/
            void Initial(void)
            {
            LCD_init();
            Set_RTC();
            }
            /***********************************************************************/
            void I2C_start(void)
            {
            SDA=1;
            SCL=1;
            Wait8us;
            SDA=0;
            Wait8us;
            SCL=0;

            }
            /***********************************************************************/
            void I2C_stop(void)
            {
            SDA=0;
            SCL=1;
            Wait8us;
            SDA=1;
            Wait4us;
            SCL=0;
            }
            /***********************************************************************
            void I2C_send_ack(void)
            {
            SDA=0;
            SCL=1;
            Wait4us;
            SCL=0;
            }
            *************************************************************************/
            void I2C_send_noack(void)
            {
            SDA=1;
            SCL=1;
            Wait4us;
            SCL=0;
            }
            /***********************************************************************/
            void I2C_write_byte(unsigned char IIC_data)
            {
            unsigned char i;
            for(i=0;i8;i++)
            {
            SCL=0;
            if((IIC_datai) 0x80)
            SDA=1; //判斷發(fā)送位
            else SDA=0;
            Wait2us;
            SCL=1;
            Wait4us;
            SCL=0;
            }
            Wait4us;
            SDA=1; //發(fā)送完8bit,釋放總線準(zhǔn)備接收應(yīng)答位
            Wait2us;
            SCL=1;
            Wait4us; //sda上數(shù)據(jù)即是從應(yīng)答位
            SCL=0; //不考慮從應(yīng)答位 但要控制好時(shí)序
            }
            /***********************************************************************/
            unsigned char I2C_read_byte(void)
            {
            unsigned char i,dat;
            dat=0;
            SDA=1;
            for (i=0;i8;i++)
            {
            dat=dat1;
            SCL=1;
            Wait2us;
            if(SDA==1)
            {
            dat++;
            }

            SCL=0;
            }
            return (dat);
            }
            /***********************************************************************/
            /******************************** DS1307 PART START ****************/
            void Write1307(unsigned char add,unsigned char dat)
            {
            I2C_start();
            I2C_write_byte(WRITEDS1307);
            I2C_write_byte(add);
            I2C_write_byte(dat);
            I2C_stop();
            }

            /***********************************************************************/
            unsigned char Read1307(unsigned char add)
            {

            unsigned char dat;
            I2C_start();
            I2C_write_byte(WRITEDS1307);
            I2C_write_byte(add);
            I2C_start();
            I2C_write_byte(READDS1307);
            dat=I2C_read_byte();
            I2C_send_noack();
            I2C_stop();
            return (dat);
            }
            /****************************讀DS1307的寄存器*******************************************/
            void Read_RTC(void)
            {
            unsigned char i,*p;
            p=rtc_address;
            for(i=0;i7;i++)
            {
            read_rtc_code[i]=Read1307(*p);
            p++;
            }
            }
            /***************************DS1307的初始化********************************************/
            void Set_RTC(void)
            {
            unsigned char i,*p;
            p=rtc_address;
            for(i=0;i7;i++)
            {
            Write1307(*p,set_rtc_code[i]);
            p++;
            }
            }
            /******************** OTHER PART ******************************/
            void Display(void)
            {
            LCD_write_char(0x0f,LINE2,(read_rtc_code[0]%10) 0x30);
            LCD_write_char(0x0e,LINE2,(read_rtc_code[0]/10) 0x30);
            LCD_write_char(0x0c,LINE2,(read_rtc_code[1]%10) 0x30);
            LCD_write_char(0x0b,LINE2,(read_rtc_code[1]/10) 0x30);
            LCD_write_char(0x09,LINE2,(read_rtc_code[2]%10) 0x30);
            LCD_write_char(0x08,LINE2,(read_rtc_code[2]/10) 0x30);
            LCD_write_char(0x09,LINE1,(read_rtc_code[4]%10) 0x30);
            LCD_write_char(0x08,LINE1,(read_rtc_code[4]/10) 0x30);
            LCD_write_char(0x06,LINE1,(read_rtc_code[5]%10) 0x30);
            LCD_write_char(0x05,LINE1,(read_rtc_code[5]/10) 0x30);
            LCD_write_char(0x03,LINE1,(read_rtc_code[6]%10) 0x30);
            LCD_write_char(0x02,LINE1,(read_rtc_code[6]/10) 0x30);

            LCD_write_string(0x0d,LINE1,day[read_rtc_code[3]-1]);
            LCD_write_string(0x0d,LINE2,:);
            LCD_write_string(0x0a,LINE2,:);
            LCD_write_string(0x07,LINE1,-);
            LCD_write_string(0x04,LINE1,-);
            LCD_write_string(0x00,LINE1,20);
            }
            /*********************************************************/
            /**************LCD1602的初始化***************************/
            void LCD_init(void)
            {
            LCD_send_command(LCD_DISPLAY_DOUBLE_LINE);
            LCD_send_command(LCD_AC_AUTO_INCREMENT LCD_MOVE_DISENABLE);
            LCD_send_command(LCD_DISPLAY_ON LCD_CURSOR_OFF);
            LCD_send_command(LCD_CLEAR_SCREEN);
            }
            /***********************檢測(cè)LCD狀態(tài)*********************************/

            void LCD_check_busy(void)
            {
            do
            {
            LCD_EN=0;
            LCD_RS=0;
            LCD_RW=1;
            LCDIO=0xff;
            LCD_EN=1;
            }
            while(LCD_BUSY==1);

            LCD_EN=0;
            }
            /************LCD1602寫(xiě)命令*******************************/
            void LCD_send_command(uchar command)
            {
            LCD_check_busy();
            LCD_RS=LOW;
            LCD_RW=LOW;
            LCD_EN=HIGH;
            LCDIO=command;
            LCD_EN=LOW;
            }
            /********************************************************/
            /*****************LCD1602寫(xiě)數(shù)據(jù)**************************/
            void LCD_send_data(uchar dat)
            {
            LCD_check_busy();
            LCD_RS=HIGH;
            LCD_RW=LOW;
            LCD_EN=HIGH;
            LCDIO=dat;
            LCD_EN=LOW;
            }
            /***********************LCD1602顯示字符*********************************/
            void LCD_write_char(uchar x,uchar y,uchar dat)
            {
            unsigned char address;
            if (y == LINE1)
            address = LINE1_HEAD + x;
            else
            address = LINE2_HEAD + x;
            LCD_send_command(address);
            LCD_send_data(dat);
            }
            /******************LCD1602顯示字符串*********************/
            void LCD_write_string(uchar x,uchar y,uchar *Data)
            {
            if(y==LINE1)
            {
            if(xLINE_LENGTH)
            {
            LCD_send_command(LINE1_HEAD+x);
            for(;xLINE_LENGTH*Data!=''