⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rw24cc.c

📁 郑州远博公司生产的单片机A型实验板原理图及配套试验源程序
💻 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 + -