久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

C51單片機通過I2C對EEPROM進行頁讀取的問題求助

查看數: 4469 | 評論數: 7 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2018-11-13 07:58

正文摘要:

我在嘗試移植教材上的程序時,發現在頁讀取EEPROM時,第9位應答位假如直接置1或置0,就可以順利讀取,但由形參傳遞1或0給應答位時,就只能讀到一串0,這是什么原因?

回復

ID:111634 發表于 2018-11-14 08:23
實例49  讀寫AT24C02
ID:424091 發表于 2018-11-13 22:11
ahshmj 發表于 2018-11-13 15:53
怎么用圖形貼出來,而不用文本格式呢?別人想試一試程序還要照圖抄一遍?

大佬求幫忙看看
ID:424091 發表于 2018-11-13 17:39
----------------------------------------------------------------主函數
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int

extern void Int_Lcd();
extern void Lcd_Show(u8 x,u8 y,u8 *set);
extern void EE_Read(u8 *buf,u8 addr,u8 len);
extern void EE_Write(u8 *buf,u8 addr,u8 len);

void Str_Convert(u8 *str,u8 *src,u8 len);

void main()
{
        u8 buf[5]={5,2,8,6,1};
        u8 str[20];
       
        Int_Lcd();
//        EE_Write(buf,0x00,sizeof(buf));              //EEPROM寫入
        EE_Read(buf,0x00,sizeof(buf));          //EEPROM讀取
        Str_Convert(str,buf,sizeof(buf));       //字符串轉化函數
        Lcd_Show(0,0,str);                      //1cd1602顯示
        while(1);
}

void Str_Convert(u8 *str,u8 *src,u8 len)
{
        u8 tem;
        while(len--)
        {
                tem=*src>>4;
                if(tem<=9)
                        *str++=tem+'0';
                else
                        *str++=tem-10+'a';
                tem=*src&0x0f;
                if(tem<=9)
                        *str++=tem+'0';
                else
                        *str++=tem-10+'a';
                *str++=' ';
                src++;
        }
}
----------------------------------------------------------------LCD1602
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
#define LCD_DB P0

sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
       
void LCD_Wait_Ready()
{
        u8 sta;

        LCD_DB=0xff;
        LCD_RS=0;
        LCD_RW=1;
        do
        {
                LCD_E=1;
                sta=LCD_DB;
                LCD_E=0;
        }
        while(sta & 0x80);
}

void LCD_Write_Cmd(u8 cmd)
{
        LCD_Wait_Ready();
        LCD_RS=0;
        LCD_RW=0;
        LCD_DB=cmd;
        LCD_E=1;
        LCD_E=0;
}

void LCD_Write_Dat(u8 dat)
{
        LCD_Wait_Ready();
        LCD_RS=1;
        LCD_RW=0;
        LCD_DB=dat;
        LCD_E=1;
        LCD_E=0;
}

void Lcd_Set_Cursor(u8 x,u8 y)
{
        u8 addr;
        if(y==0)
                addr=0x00+x;
        else
                addr=0x40+x;
        LCD_Write_Cmd(addr | 0x80);
}

void Lcd_Show(u8 x,u8 y,u8 *str)
{
        Lcd_Set_Cursor(x,y);
        while(*str!='\0')
        {
                LCD_Write_Dat(*str++);
        }
}

void Int_Lcd()
{
        LCD_Write_Cmd(0x38);
        LCD_Write_Cmd(0x0c);
        LCD_Write_Cmd(0x06);
        LCD_Write_Cmd(0x01);
}
----------------------------------------------------------------I2C
#include <reg52.h>
#include <intrins.h>
#define u8 unsigned char
#define u16 unsigned int

sbit SCL=P2^1;
sbit SDA=P2^0;
sbit LED1=P0^0;
sbit LED2=P0^1;

void Dealy()
{
        u8 i;
       
        for(i=0;i<10;i++)
                _nop_();
}

void I2C_Start()
{
        SDA=1;
        SCL=1;
        Dealy();
        SDA=0;
        Dealy();
        SCL=0;
        Dealy();
}

void I2C_Stop()
{
        SCL=0;
        SDA=0;
        Dealy();
        SCL=1;
        Dealy();
        SDA=1;
        Dealy();
}

bit I2C_Write(u8 dat)         //I2C寫入
{
        bit ack;
        u8 mask;
       
        for(mask=0x80;mask>0;mask>>=1)
        {
                if((mask & dat)==0)
                        SDA=0;
                else
                        SDA=1;
                Dealy();
                SCL=1;
                Dealy();
                SCL=0;
                Dealy();
        }
        SDA=1;
        Dealy();
        SCL=1;
        ack=SDA;
        Dealy();
        SCL=0;
        Dealy();
        return (~ack);
}

u8 I2C_Read(bit ack)         //I2C讀取
{
        u8 dat,i;
       
        SDA=1;
        Dealy();             //延時10us
        for(i=0;i<8;i++)
        {
                SCL=1;
                Dealy();
                dat<<=1;
                dat |= SDA;
                Dealy();
                SCL=0;
                Dealy();
        }
        SDA=ack;     //SDA由形參ack控制
        Dealy();
        SCL=1;
        Dealy();
        SCL=0;
        Dealy();
        return dat;
}

u8 I2C_ReadACK()
{
        u8 dat,i;
       
        SDA=1;
        Dealy();         //延時10us
        for(i=0;i<8;i++)
        {
                SCL=1;
                Dealy();
                dat<<=1;
                dat |= SDA;
                Dealy();
                SCL=0;
                Dealy();
        }
        SDA=0;      //SDA直接置0
        Dealy();
        SCL=1;
        Dealy();
        SCL=0;
        Dealy();
        return dat;
}

u8 I2C_ReadNAK()
{
        u8 dat,i;
       
        SDA=1;
        Dealy();
        for(i=0;i<8;i++)
        {
                SCL=1;
                Dealy();
                dat<<=1;
                dat |= SDA;
                Dealy();
                SCL=0;
                Dealy();
        }
        SDA=1;       //SDA直接置1
        Dealy();
        SCL=1;
        Dealy();
        SCL=0;
        Dealy();
        return dat;
}
----------------------------------------------------------------EEPROM
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int

extern void I2C_Start();
extern void I2C_Stop();
extern bit I2C_Write(u8 dat);
extern bit I2C_Read(bit ack);
extern u8 I2C_ReadACK();
extern u8 I2C_ReadNAK();

void EE_Read(u8 *buf,u8 addr,u8 len)       //EEPROM讀取,len讀取長度
{
        do
        {
                I2C_Start();
                if(I2C_Write(0x50<<1))
                        break;
                I2C_Stop();
        }
        while(1);
        I2C_Write(addr);            //寫入讀取的起始地址
        I2C_Start();
        I2C_Write((0x50<<1)|0x01);
        while(len>1)
        {
                *buf++=I2C_Read(0);       //應答位置0
//                *buf++=I2C_ReadACK();
                len--;
        }
        *buf=I2C_Read(1);           //應答位置1
//        *buf=I2C_ReadNAK();
        I2C_Stop();
}

void EE_Write(u8 *buf,u8 addr,u8 len)       //EEPROM寫入
{
        while(len>0)
        {
                do
                {
                        I2C_Start();
                        if(I2C_Write(0x50<<1))
                                break;
                        I2C_Stop();
                }
                while(1);
                I2C_Write(addr);
                while(len>0)
                {
                        I2C_Write(*buf++);
                        len--;
                        addr++;
                        if((addr&0x07)==0)
                                break;
                }
                I2C_Stop();       
        }
}
ID:424091 發表于 2018-11-13 17:35
ahshmj 發表于 2018-11-13 15:53
怎么用圖形貼出來,而不用文本格式呢?別人想試一試程序還要照圖抄一遍?

額,好吧,我把程序列出來
ID:7485 發表于 2018-11-13 15:53
怎么用圖形貼出來,而不用文本格式呢?別人想試一試程序還要照圖抄一遍?
ID:424091 發表于 2018-11-13 12:16
浮念 發表于 2018-11-13 11:02
你可以在論壇里面搜集一下,有很多現成的程序可以參考學習。要善用論壇的搜索功能。

程序上我沒有太大的問題,這部分程序我也是移植后再自己重新編寫了的,主要就是想不明白為啥直接置位可以,用形參置位就出問題了,形參置位和直接置位有啥區別嗎?
ID:411940 發表于 2018-11-13 11:02
你可以在論壇里面搜集一下,有很多現成的程序可以參考學習。要善用論壇的搜索功能。

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品一区二区三区四区外站 | 81精品国产乱码久久久久久 | 欧美日韩在线播放 | 人人干人人超 | 狠狠骚| 久久亚洲国产精品日日av夜夜 | 久久a久久 | 日本中文在线视频 | 五月天综合影院 | 男人天堂av网 | 欧美在线亚洲 | 精品一区二区三区在线视频 | 欧美日韩在线一区二区三区 | 亚洲视频区 | 毛片av免费看 | 国产精品久久久久久久久久久久 | a免费观看 | 亚洲一区二区三区免费观看 | 91av视频| 精品视频在线观看 | 中文字幕一区二区三区四区五区 | 午夜精品一区二区三区在线视频 | 日本aa毛片a级毛片免费观看 | 美女张开腿露出尿口 | 成人九区 | 有码在线 | av性色| 黄色三级免费网站 | 男女午夜免费视频 | 国产视频一视频二 | 欧美日韩国产一区二区三区不卡 | 三级黄色片在线播放 | www.亚洲视频.com | 中文字幕日韩av | 午夜看片网站 | 在线观看午夜视频 | 久久国产精品99久久久久久丝袜 | 精品国产不卡一区二区三区 | 精品成人一区二区 | 99国产精品视频免费观看一公开 | 免费v片 |