24c02读写一页加显示

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^0;
sbit SDA=P2^1;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit P36=P3^6;
sbit dq=P1^4;
uchar code tableduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 ,0xff};    //共阳
uchar code tablewei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  //共阳
uchar xianshishu[]={1,2,3,4,0,0,0,0};
uchar BUF[16];                  //数据缓存区
uchar code TESTDATA[] =
{
0x00,0x09,0x08,0x03,0x04,0x05,0x06,0x07,
0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF
};
void Delay5us();
void Delay5ms();
void AT24C04_Start();
void AT24C04_Stop();
void AT24C04_SendACK(bit ack);
bit AT24C04_RecvACK();
void AT24C04_SendByte(uchar dat);
uchar AT24C04_RecvByte();
void AT24C04_ReadPage();
void AT24C04_WritePage();
/**************************************
延时5微秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
void Delay5us()
{
uchar i = 4;
while (i--)
{
_nop_();
_nop_();
}
}
/
**************************************
延时5毫秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
void Delay5ms()
{
int n = 2500;
while (n--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void delay1ms(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
微孔抛光镜面加工
}
void xuanY5()
{
P36=1;
P25=1;
P26=0;
P27=1;
P36=0;
}
void duanxuan()
{
P36=1;
P25=1;
P26=1;
P27=1;
P36=0;
}
void weixuan()
{
P36=1;
P25=0;
P26=1;
P27=1;
P36=0;
}
/**************************************
起始信号
**************************************/
void AT24C04_Start()
{
SDA = 1;                    //拉高数据线
SCL = 1;                    //拉高时钟线
Delay5us();                //延时
SDA = 0;                    //产生下降沿
铝合金精密铸造Delay5us();                //延时
SCL = 0;                    //拉低时钟线
}
/**************************************
停止信号
**************************************/
void AT24C04_Stop()
{
SDA = 0;                    //拉低数据线
SCL = 1;                    //拉高时钟线
数据销毁Delay5us();                //延时
SDA = 1;                    //产生上升沿
Delay5us();                //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void AT24C04_SendACK(bit ack)
{
SDA = ack;                  //写应答信号
SCL = 1;                    //拉高时钟线
Delay5
us();                //延时
SCL = 0;                    //拉低时钟线
Delay5us();                //延时
}
/**************************************
接收应答信号
**************************************/
bit AT24C04_RecvACK()
{
SCL = 1;                    //拉高时钟线
Delay5us();                //延时
CY = SDA;                  //读应答信号
SCL = 0;                    //拉低时钟线
Delay5us();                //延时
return CY;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void AT24C04_SendByte(uchar date)
{
uchar i;
for (i=0; i<8; i++)        //8位计数器
{
date <<= 1;              //移出数据的最高位
SDA = CY;              //送数据口
SCL = 1;                //拉高时钟线
Delay5us();            //延时
SCL = 0;                //拉低时钟线
Delay5us();            //延时
}
AT24C04_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
uchar AT24C04_RecvByte()
{
uchar i;
uchar date = 0;
SDA = 1;                    //使能内部上拉,准备读取数据
for (i=0; i<8; i++)        //8位计数器
{
date <<= 1;
SCL = 1;                //拉高时钟线
Delay5us();            //延时
date |= SDA;            //读数据
SCL = 0;                //拉低时钟线
Delay5us();            //延时
}
return date;
}
/**************************************
向AT24C04写1页(16字节)数据土压力盒
将TESTDATA开始的16个测试数据写如设备的00~0F地址
**************************************/
void AT24C04_WritePage()
{
uchar i;
AT24C04_Start();            //起始信号
AT24C04_SendByte(0xa0);    //发送设备地址+写信号
AT24C04_SendByte(0x00);    //发送存储单元地址
for (i=0; i<16; i++)
{
AT24C04_SendByte(TESTDATA[i]);
}
AT24C04_Stop();            //停止信号
}
/**************************************
从AT24C04读取1页(16字节)数据
将设备的00~0F地址中的数据读出存放在DATA区的BUF中
**************************************/
void AT24C04_ReadPage()
{
uchar i;
AT24C04_Start();            //起始信号
AT24C04_SendByte(0xa0);    //发送设备地址+写信号
AT24C04_SendByte(0x00);    //发送存储单元地址
AT24C04_Start();            //起始信号
AT24C04_SendByte(0xa1);    //发送设备地址+读信号
for (i=0; i<16; i++)
{
BUF[i] = AT24C04_RecvByte();
if (i == 15)
{
AT24C04_SendACK(1); //最后一个数据需要会NAK
}
else
{
AT24C04_SendACK(0); //回应ACK
}
}
AT24C04_Stop();            //停止信号
}
void c02shujuchuli()
{
uchar i; 
for(i=0;i<8;i++)
{
xianshishu[i]= BUF[i];
}
}
/**************************************
显示子程序
**************************************/
定鼎建筑
void display()
{
uchar i;
for(i=0;i<8;i++)
{
duanxuan();    //138选通Y7
P0=0xff;
_nop_();
_nop_();
P0=tableduan[xianshishu[i]];
P36=1;    //duan=0;
weixuan();  //138选通Y6
P0=0xff;
_nop_();
_nop_();  //wela=1;
P0=tablewei[i];
P36=1;      //wela=0;
cdth
delay1ms(30);
}
duanxuan();
P36=0;    //duan=1;
P0=0xff;
P36=1;    //duan=0;
}
void main()
{   
AT24C04_WritePage();
Delay5ms();
AT24C04_ReadPage();
c02shujuchuli();
while(1)
{
display();
xuanY5();
P0=0x00;
_nop_();
_nop_();
P36=1;
}
}

本文发布于:2024-09-22 14:24:59,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/99173.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:ASCII码表
标签:数据   发送   地址   信号   设备   产生   需要   字节
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议