登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] C51----I2C总线 and E2PROM

[复制链接]
发表于 2023-1-24 23:18:51 | 显示全部楼层 |阅读模式
学习笔记
学习科目: C51
学习安排: 学习I2C总线和E2PROM
开始时间: 2023-01-24
结束时间: 2023-01-24
本帖最后由 王煜 于 2023-1-24 23:25 编辑


#include<intrins.h>
#include<reg52.h>
#define  I2CDelay()   {_nop_();_nop_();}sbit SDA = P3^7;
sbit SCL = P3^6;

extern void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);
extern void InitLcd1602();

bit I2CAddressing(unsigned char addr);


void main()
{
bit ack;
unsigned char str[10];

InitLcd1602();
ack = I2CAddressing(0x51);
str[0] = '5';str[1] = '1';str[2] = ':';str[3] = (unsigned char)ack+'0';str[4] = '\0';
LcdShowStr(8,0,str);
ack = I2CAddressing(0x50);
str[0] = '5';str[1] = '0';str[2] = ':';str[3] = (unsigned char)ack+'0';str[4] = '\0';
LcdShowStr(0,0,str);
while(1);
}
void I2CStop()
{
SDA = 0;SCL = 0;
I2CDelay();
SCL = 1;
I2CDelay();
SDA = 1;
I2CDelay();
}
void I2CStart()
{
SDA = 1;SCL = 1;
I2CDelay();
SDA = 0;
I2CDelay();
SCL = 0;
}



bit I2CWrite(unsigned char dat)
{
bit ack;
unsigned char mask;

for(mask = 0x80;mask != 0;mask>>=1)
{
if((mask&dat) == 0)
SDA = 0;
else
SDA = 1;
I2CDelay();
SCL = 1;
I2CDelay();
SCL = 0;
}
SDA = 1;
I2CDelay();
SCL = 1;
ack = SDA;
I2CDelay();
SCL = 0;
return ack;
}

bit I2CAddressing(unsigned char addr)
{
bit ack;
I2CStart();
ack = I2CWrite(addr<<1);
I2CStop();
return ack;
}


//Lcd1602.c

#include<reg52.h>

#define LCD1602_DB P0
sbit LCD1602_RS = P2^0;
sbit LCD1602_RW = P2^1;
sbit LCD1602_E = P1^2;


void LcdWaitReady()
{
unsigned char sta;

LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do{
LCD1602_E = 1;
sta = LCD1602_DB;
LCD1602_E = 0;
}while(sta&0x80);
}

void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
delay();
LCD1602_E = 1;
delay();
LCD1602_E = 0;
}

void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
delay();
LCD1602_E = 1;
delay();
LCD1602_E = 0;
}

void LcdSetCursor(unsigned char x,unsigned char y)
{
unsigned char addr;

if(y == 0)
addr = 0x00+x;
else
addr = 0x40+x;
LcdWriteCmd(addr | 0x80);
}

void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str)
{
LcdSetCursor(x,y);
while(*str!='\0')
{
LcdWriteDat(*str++);
}
}

void InitLcd1602()
{
LcdWriteCmd(0x38);
LcdWriteCmd(0x0C);
LcdWriteCmd(0x06);
LcdWriteCmd(0x01);
}
void delay()
{
unsigned int i;
i=5;
while(--i);
}

//e2prom单字节读写

//i2c.c

#include<reg52.h>
#include<intrins.h>

#define I2CDelay(){_nop_();_nop_();_nop_();_nop_();}

sbit SCL = P3^6;
sbit SDA = P3^7;

void I2CStart()
{
SDA = 1;
SCL = 1;
I2CDelay();
SDA = 0;
I2CDelay();
SCL = 0;
}

void I2CStop()
{
SDA = 0;
SCL = 0;
I2CDelay();
SCL = 1;
I2CDelay();
SDA = 1;
I2CDelay();
}

bit I2CWrite(unsigned char dat)
{
bit ack;
unsigned char mask;

for(mask = 0x80;mask != 0;mask>>=1)
{
if((mask&dat) == 0)
SDA = 0;
else
SDA = 1;
I2CDelay();
SCL = 1;
I2CDelay();
SCL = 0;
}
SDA = 1;
I2CDelay();
SCL = 1;
ack = SDA;
I2CDelay();
SCL = 0;
return (~ack);
}

unsigned char I2CReadNAK()
{
unsigned char mask;
unsigned char dat;

SDA = 1;
for(mask = 0x80;mask!=0;mask>>=1)
{
I2CDelay();
SCL = 1;
if(SDA == 0)
dat&=~mask;
else
dat|=mask;
I2CDelay();
SCL = 0;
}
SDA = 1;
I2CDelay();
SCL = 1;
I2CDelay();
SCL = 0;
return dat;
}

unsigned char I2CReadACK()
{
unsigned char mask;
unsigned char dat;

SDA = 1;
for(mask = 0x80;mask!=0;mask>>=1)
{
I2CDelay();
SCL = 1;
if(SDA == 0)
dat&=~mask;
else
dat|=mask;
I2CDelay();
SCL = 0;
}
SDA = 0;
I2CDelay();
SCL = 1;
I2CDelay();
SCL = 0;
return dat;
}


//Lcd1602.c

#include<reg52.h>

#define LCD1602_DB P0
sbit LCD1602_RS = P2^0;
sbit LCD1602_RW = P2^1;
sbit LCD1602_E = P1^2;

void delay()
{
unsigned int i;
i=5;
while(--i);
}

void LcdWaitReady()
{
unsigned char sta;

LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do{
LCD1602_E = 1;
sta = LCD1602_DB;
LCD1602_E = 0;
}while(sta&0x80);
}

void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
delay();
LCD1602_E = 1;
delay();
LCD1602_E = 0;
}

void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
delay();
LCD1602_E = 1;
delay();
LCD1602_E = 0;
}

void LcdSetCursor(unsigned char x,unsigned char y)
{
unsigned char addr;

if(y == 0)
addr = 0x00+x;
else
addr = 0x40+x;
LcdWriteCmd(addr | 0x80);
}

void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str)
{
LcdSetCursor(x,y);
while(*str!='\0')
{
LcdWriteDat(*str++);
}
}

void InitLcd1602()
{
LcdWriteCmd(0x38);
LcdWriteCmd(0x0C);
LcdWriteCmd(0x06);
LcdWriteCmd(0x01);
}


main.c

#include<reg52.h>

extern void I2CStart();
extern void I2CStop();
extern unsigned char I2CReadNAK();
extern bit I2CWrite(unsigned char dat);
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);
unsigned char E2ReadByte(unsigned char addr);
void E2WriteByte(unsigned char addr,unsigned char dat);

void main()
{
unsigned char dat;
unsigned char str[10];

InitLcd1602();
dat = E2ReadByte(0x02);
str[0] = (dat/100)+'0';
str[1] = (dat/10%10)+'0';
str[2] = (dat%10)+'0';
str[3] = '\0';
LcdShowStr(0,0,str);
dat++;
E2WriteByte(0x02,dat);
while(1);
}

unsigned char E2ReadByte(unsigned char addr)
{
unsigned char dat;
I2CStart();
I2CWrite(0x51<<1);
I2CWrite(addr);
I2CStart();
I2CWrite(0x51<<1|0x01);
dat = I2CReadNAK();
I2CStop();
return dat;
}

void E2WriteByte(unsigned char addr,unsigned char dat)
{
I2CStart();
I2CWrite(0x51<<1);
I2CWrite(addr);
I2CWrite(dat);
I2CStop();
}







好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表