📄 rw24cc.c
字号:
/****************************************************************
AT24c02的读写和6位数码管动态显示的KEIL C语言演示程序
程序首先写入24C02中6位数据,然后从24C02中读出这6位数据并在数码管上显示
作者:郑州远博科技 王兴民
0371-6949037 0371-7256036 13949105551
需要参照24C02的时序图
****************************************************************/
#include <at89x51.h>
#include <Delay.h>
//变量类型标识的宏定义
#define uchar unsigned char
#define uint unsigned int
//24C02定义
#define SCL24 P3_4 //24C02 SCL端
#define SDA24 P3_5 //24C02 SDA端
#define WriteDeviceAddress 0xa0 // 24c02写命令字
#define ReadDviceAddress 0xa1 // 24c02读命令字
//74LS164定义
#define SDA P2_7 //74LS164 SAD
#define SCK P2_6 //74LS164 SCK
#define BIT5 P2_5 //数码管位1
#define BIT4 P2_4 //数码管位2
#define BIT3 P2_3 //数码管位3
#define BIT2 P2_2 //数码管位4
#define BIT1 P2_1 //数码管位5
#define BIT0 P2_0 //数码管位6
code uchar szdm[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff}; /*共阳数码管0-9和全灭的16进制代码*/
data uchar displaybuff[6]; /*定义显示缓冲区*/
void Read24c02(uchar *RamAddress,uchar RomAddress,uchar bytes); //24c02读程序
void Write24c02(uchar *Wdata,uchar RomAddress,uchar number); //24c02写程序
void display();
void main() {
uchar i;
uchar data1[6]={0x06,0x05,0x04,0x03,0x02,0x01}; //写入缓冲区
uchar data2[6]; //读出缓冲区
uchar *Pdata1=data1,Romadd=0x00,counter=6,*Pdata2=data2;
Delay_ms(2000); //延时足够时间,使24C02复位
Write24c02(Pdata1,Romadd,counter); //缓冲区data1[]中的数据写入24C02中
Read24c02(Pdata2,Romadd,counter); //24C02中的数据读出到缓冲区data2[]中
for(i=0;i<6;i++) { //data2[]中的数据写入显示缓冲区中
displaybuff[i]=data2[i];
}
while(1) {
display(); //在数码管上显示从24C02中读出的数据
}
}
/************************************************************
24c02演示程序,读这段程序需要参考24C02的读写时序图,配套光盘有
/*************************************************************/
void Start() {
SDA24=1;
SCL24=1;
SDA24=0;
SCL24=0;
}
/***************************************************************************/
void Stop() {
SCL24=0;
SDA24=0;
SCL24=1;
SDA24=1;
}
/***************************************************************************/
void Ack() {
SDA24=0;
SCL24=1;
SCL24=0;
SDA24=1;
}
/***************************************************************************/
void NoAck() {
SDA24=1;
SCL24=1;
SCL24=0;
}
/***************************************************************************/
bit TestAck() {
bit ErrorBit;
SDA24=1;
SCL24=1;
ErrorBit=SDA24;
SCL24=0;
return(ErrorBit);
}
/***************************************************************************/
void Write8Bit(uchar input) {
uchar temp;
for(temp=8;temp!=0;temp--) {
SDA24=(bit)(input&0x80);
SCL24=1;
SCL24=0;
input=input<<1;
}
}
/***************************************************************************/
void Write24c02(uchar *Wdata,uchar RomAddress,uchar number) {
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(RomAddress);
TestAck();
for(;number!=0;number--) {
Write8Bit(*Wdata);
TestAck();
Wdata++;
}
Stop();
DelayMs(10);
}
/***************************************************************************/
uchar Read8Bit() {
uchar temp,rbyte=0;
for(temp=8;temp!=0;temp--) {
SCL24=1;
rbyte=rbyte<<1;
rbyte=rbyte|((uchar)(SDA24));
SCL24=0;
}
return(rbyte);
}
/***************************************************************************/
void Read24c02(uchar *RamAddress,uchar RomAddress,uchar bytes) {
//unsigned char temp, rbyte;
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(RomAddress);
TestAck();
Start();
Write8Bit(ReadDviceAddress);
TestAck();
while(bytes!=1) {
*RamAddress=Read8Bit();
Ack();
RamAddress++;
bytes--; }
*RamAddress=Read8Bit();
NoAck();
Stop();
}
/*************************************************************************************************
8位数据从74HC164的串行输入端输入,从输出端并行输出
*************************************************************************************************/
void senddata(uchar dd) {
uchar j;
for (j=0;j<8;j++) {
SDA=(bit)(dd&0x01);
SCK=1; SCK=0;
dd=dd>>1;
}
}
/****************************************************************************************************/
/*动态扫描显示程序*/
/****************************************************************************************************/
void display() {
senddata(szdm[displaybuff[0]]);
BIT0=0;
Delay_ms(10);
BIT0=1;
senddata(szdm[displaybuff[1]]);
BIT1=0;
Delay_ms(10);
BIT1=1;
senddata(szdm[displaybuff[2]]);
BIT2=0;
Delay_ms(10);
BIT2=1;
senddata(szdm[displaybuff[3]]);
BIT3=0;
Delay_ms(10);
BIT3=1;
senddata(szdm[displaybuff[4]]);
BIT4=0;
Delay_ms(10);
BIT4=1;
senddata(szdm[displaybuff[5]]);
BIT5=0;
Delay_ms(10);
BIT5=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -