//“e_lock.h”头文件
#ifndef __e_lock_H_ #define __e_lock_H_
sbit LSA=P2^5; sbit LSB=P2^6; sbit LSC=P2^7; sbit OP=P2^4;
#define seg P0 //数码管段码接口 #define key P1 //按键接口
void c_led(); //开机自检led子函数 void check(); //开机自检函数 void sys_start(); //初始化函数 void sm_key(); //按键检测 void cz(); //拆字函数
void disp(); //显示数码管函数 void open_lock(); //核对密码函数 void Delay1ms(int c); //1ms延时函数 void control(); void k0(); void k1(); void k2(); void k3(); void k4(); void k5(); void k6(); void k7(); void k8(); void k9(); void k10(); //void k11(); void k12(); void k13(); void k14(); void k15();
void At24c02Write(unsigned char addr,unsigned char dat); //24c02写数据函数 unsigned char At24c02Read(unsigned char addr); //24c02读数据函数
36
#endif
//I2C.c文件
#include
void I2C_Delay10us() { uchar a, b; for(b=1; b>0; b--) { for(a=2; a>0; a--); } }
void I2C_Start() { I2C_SDA = 1; I2C_Delay10us(); I2C_SCL = 1;
I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7us I2C_SDA = 0; I2C_Delay10us();//保持时间是>4us I2C_SCL = 0; I2C_Delay10us(); }
void I2C_Stop() { I2C_SDA = 0; I2C_Delay10us(); I2C_SCL = 1;
I2C_Delay10us();//建立时间大于4.7us I2C_SDA = 1; I2C_Delay10us(); }
uchar I2C_SendByte(uchar dat, uchar ack) { uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。
37
for(a=0; a<8; a++)//要发送8位,从最高位开始 { I2C_SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号 dat = dat << 1; I2C_Delay10us(); I2C_SCL = 1; }
I2C_Delay10us();//建立时间>4.7us I2C_SCL = 0;
I2C_Delay10us();//时间大于4us
I2C_SDA = 1; I2C_Delay10us(); I2C_SCL = 1;
while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低 { b++; if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束 { I2C_SCL = 0; I2C_Delay10us(); return 0; } } I2C_SCL = 0; I2C_Delay10us(); return 1; }
uchar I2C_ReadByte() { uchar a = 0,dat = 0; I2C_SDA = 1; //起始和发送一个字节之后I2C_SCL都是0 I2C_Delay10us(); for(a=0; a<8; a++)//接收8个字节 { I2C_SCL = 1; I2C_Delay10us(); dat <<= 1; dat |= I2C_SDA; I2C_Delay10us(); I2C_SCL = 0;
38
I2C_Delay10us(); } return dat; }
//”I2C.h”头文件
#ifndef __I2C_H_ #define __I2C_H_
#ifndef uchar
#define uchar unsigned char #endif
#ifndef uint
#define uint unsigned int #endif
sbit I2C_SCL = P2^1; sbit I2C_SDA = P2^0;
void I2C_Delay10us(); void I2C_Start(); void I2C_Stop();
uchar I2C_SendByte(uchar dat, uchar ack); uchar I2C_ReadByte();
#endif
39
系统原理图:
40