24c02存储花样灯
来源:互联网 发布:删除表的sql语句 编辑:程序博客网 时间:2024/04/30 03:15
main.c
#include <reg52.h> #include "i2c.h"unsigned char dat[]={0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe, 0xff,0xff,0x00,0x00, 0x55,0x55,0xaa,0xaa };//ram允许情况可以无限添加main(){ //bit flag; unsigned char i; ISendStr(0xae,80,dat,16); //写入24c02 DelayMs(1); //写入后必须延时等待24c02内部 //烧录数据处理完毕方可继续其他操作 for(i=0;i<16;i++) //清除数据 dat[i]=0; IRcvStr(0xae,80,dat,16); //从24c02读出数据 while(1) { for(i=0;i<16;i++) //查表 { DelayMs(200); P1=dat[i]; } }}
i2c.c
#include "i2c.h"#define _Nop() _nop_() //定义空指令 bit ack; //应答标志位sbit SDA=P2^1;sbit SCL=P2^0;void DelayUs2x(unsigned char t){ while(--t);}void DelayMs(unsigned char t){ while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); }}void Start_I2c(){ SDA=1; //发送起始条件的数据信号 _Nop(); SCL=1; _Nop(); //起始条件建立时间大于4.7us,延时 _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; //发送起始信号 _Nop(); //起始条件锁定时间大于4μ _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; //钳住I2C总线,准备发送或接收数据 _Nop(); _Nop();}void Stop_I2c(){ SDA=0; //发送结束条件的数据信号 _Nop(); //发送结束条件的时钟信号 SCL=1; //结束条件建立时间大于4μ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; //发送I2C总线结束信号 _Nop(); _Nop(); _Nop(); _Nop();}void SendByte(unsigned char c){ unsigned char BitCnt; for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位 { if((c<<BitCnt)&0x80)SDA=1; //判断发送位 else SDA=0; _Nop(); SCL=1; //置时钟线为高,通知被控器开始接收数据位 _Nop(); _Nop(); //保证时钟高电平周期大于4μ _Nop(); _Nop(); _Nop(); SCL=0; } _Nop(); _Nop(); SDA=1; //8位发送完后释放数据线,准备接收应答位 _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA==1)ack=0; else ack=1; //判断是否接收到应答信号 SCL=0; _Nop(); _Nop();}unsigned char RcvByte(){ unsigned char retc; unsigned char BitCnt; retc=0; SDA=1; //置数据线为输入方式 for(BitCnt=0;BitCnt<8;BitCnt++) { _Nop(); SCL=0; //置时钟线为低,准备接收数据位 _Nop(); _Nop(); //时钟低电平周期大于4.7us _Nop(); _Nop(); _Nop(); SCL=1; //置时钟线为高使数据线上数据有效 _Nop(); _Nop(); retc=retc<<1; if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中 _Nop(); _Nop(); } SCL=0; _Nop(); _Nop(); return(retc);}void Ack_I2c(void){ SDA=0; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); //时钟低电平周期大于4μ _Nop(); _Nop(); _Nop(); SCL=0; //清时钟线,钳住I2C总线以便继续接收 _Nop(); _Nop(); }void NoAck_I2c(void){ SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); //时钟低电平周期大于4μ _Nop(); _Nop(); _Nop(); SCL=0; //清时钟线,钳住I2C总线以便继续接收 _Nop(); _Nop(); }/*bit ISendByte(unsigned char sla,unsigned char c){ Start_I2c(); //启动总线 SendByte(sla); //发送器件地址 if(ack==0)return(0); SendByte(c); //发送数据 if(ack==0)return(0); Stop_I2c(); //结束总线 return(1);}*/bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no){ unsigned char i; for(i=0;i<no;i++) { Start_I2c(); //启动总线 SendByte(sla); //发送器件地址 if(ack==0)return(0); SendByte(suba); //发送器件子地址 if(ack==0)return(0); SendByte(*s); //发送数据 if(ack==0)return(0); Stop_I2c(); //结束总线 DelayMs(2); //必须延时等待芯片内部自动处理数据完毕 s++; suba++; } return(1);}/*bit IRcvByte(unsigned char sla,unsigned char *c){ Start_I2c(); //启动总线 SendByte(sla+1); //发送器件地址 if(ack==0)return(0); *c=RcvByte(); //读取数据 NoAck_I2c(); //发送非就答位 Stop_I2c(); //结束总线 return(1);}*/bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no){ unsigned char i; Start_I2c(); //启动总线 SendByte(sla); //发送器件地址 if(ack==0)return(0); SendByte(suba); //发送器件子地址 if(ack==0)return(0); Start_I2c(); SendByte(sla+1); if(ack==0)return(0); for(i=0;i<no-1;i++) { *s=RcvByte(); //发送数据 Ack_I2c(); //发送就答位 s++; } *s=RcvByte(); NoAck_I2c(); //发送非应位 Stop_I2c(); //结束总线 return(1);}
0 0
- 24c02存储花样灯
- 24c02存储多个数据
- 24C02
- 非char类型在24c02中的存储
- 花样灯
- 花样灯
- 花样灯
- 花样灯
- 花样灯
- 掉电保护24c02
- 24c02单片机密码锁
- IIC 24c02
- 24C02重要补充
- I2C之24c02
- c02
- 4.花样流水灯
- 花样流水灯
- LED花样灯
- 用js写一个简单的进度条
- springmvc乱码问题
- Python isinstance
- Python(Pycharm)连接Oracle数据库之cx_Oracle的使用(cx_Oracle在pyCharm中报错)
- 黑马程序员 十、IO 文件操作(2)
- 24c02存储花样灯
- Practice_Codeforces Round #409 (Div. 2)
- linux合并文件
- 机器学习之K近邻简介
- linux 文件每行行尾追加字符
- 56-套接字选项(TCP_CORK)
- 1354 选数字 (背包)
- UVa 900題記錄
- ℃江让您从精通到入门:Android如何知晓自己身在哪个Activity