51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机源码 > 详细内容
24C02的字节读写程序(带显示)
作者:佚名  发布时间:2009/10/16  阅读次数:1457  字体大小: 【】 【】【
--  24C02的字节读写程序(带显示)

;***********************************************************************
;**                          硕恒电子                                             **
;**                      www.shdz.com                                        **
;**                                                                                    **
;******************51实验板例程序---24c02读写程序****************

ORG  0000H 
a_bit  equ  20h   ;数码管个位数存放内存位置
b_bit  equ  21h   ;数码管十位数存放内存位置
SCL     BIT  P3.4  ;定义24C02的串行时钟线 
SDA  BIT  P3.5  ;定义24C02的串行数据线
WRADR   EQU 10100000B  ;写指令代码
READR   EQU 10100001B ;读指令代码
BYTE_ADDR EQU 30H  ;数据地址(24C02)
BYTE_DAT  EQU       31H  ;待写数据
DATAOUT   EQU 32H  ;读出的数据
LJMP START
                   ORG 0100H
START:
MOV   BYTE_ADDR,#00H ;存放地址为00
MOV BYTE_DAT,#31 ;入例数据31
LCALL BYTE_WR
LCALL SELECT_RD
DISE: LCALL DISPLAY
AJMP        DISE

BYTE_WR: 
ACALL   START_BIT      ;送起始位
MOV     A,#WRADR                     ;写指令代码
ACALL  SHIFT8
ACALL   SLAVE_ACK  ;送从应答
MOV     A,BYTE_ADDR  ;字节地址
ACALL  SHIFT8
ACALL   SLAVE_ACK
RE1: MOV  A,BYTE_DAT  ;字节数据 
                 ACALL  SHIFT8
ACALL   SLAVE_ACK
JC    RE1
ACALL   STOP_BIT  ;停止位
ACALL   ACK_POL  ;调应答检测等写周期结束
RET 



;**************************************
;应答检测
;**************************************

ACK_POL: 
MOV     R3,#40H  ;限制最大时间
ACK_LOOP: 
DJNZ  R3,DONE_YET
SJMP  DN_ACKPOL
DONE_YET: 
ACALL  START_BIT
MOV  A,#WRADR
ACALL  SHIFT8
ACALL   SLAVE_ACK
JC      ACK_LOOP  ;无应答循环
DN_ACKPOL: 
ACALL  STOP_BIT
RET
;*****************************************
;起始位
;*****************************************
START_BIT: 
SETB SDA
NOP
SETB SCL
NOP
CLR SDA
NOP
CLR SCL
RET
;******************************************
;停止位
;******************************************
STOP_BIT: CLR SDA
NOP
SETB SCL
NOP
SETB SDA
CLR SCL
RET
;读、写数据
SHIFT8:    MOV  R7,#8  
SH01:        RLC  A
                  MOV  SDA,C
                  SETB SCL
                  CLR  SCL
                  DJNZ R7,SH01
                  RET

SLAVE_ACK:
NOP
NOP
CLR SCL
NOP
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
MOV C,SDA   ;保存应答位接收成功C为0
CLR SCL
RET
;*********************************************
;无需应答
;********************************************
NO_ACK: SETB SDA
NOP
SETB SCL
NOP
CLR SCL
RET
;*********************************************
;读任意地址
;*********************************************
SELECT_RD:
ACALL   START_BIT       ;送起始位
MOV     A,#WRADR  ;位从地址
ACALL  SHIFT8
ACALL   SLAVE_ACK  ;送从应答
MOV     A,BYTE_ADDR  ;字节地址
ACALL  SHIFT8
ACALL   SLAVE_ACK
ACALL  START_BIT  ;新起始位
MOV  A,#READR
ACALL  SHIFT8 
ACALL  SLAVE_ACK
MOV  R7,#8
CLOCK8: SETB  SCL
NOP
MOV  C,SDA
CLR  SCL
MOV  A,DATAOUT
RLC  A
MOV  DATAOUT,A
DJNZ  R7,CLOCK8  ;读八位数据存DATAOUT 中
ACALL  NO_ACK
ACALL  STOP_BIT
RET

DISPLAY: 
AB1: MOV  R3,#50        
TIME1:      MOV  A,DATAOUT  ;将DATAOUT中的十六进制数转换成10进制 
MOV  B,#100  ;10进制/10=10进制
DIV  AB
CJNE A,#1,NE1
MOV  P1,#0FEH
AJMP WW
NE1: CJNE  A,#2,EQ0
MOV  P1,#0FCH
AJMP  WW
EQ0: MOV  P1,#0FFH
WW: MOV     A,B
MOV     B,#10
DIV AB
MOV     B_BIT,A  ;十位在a
MOV     A_BIT,B  ;个位在b
MOV  DPTR,#NUMTAB  ;指定查表启始地址
MOV  R0,#4 
DPl1:  MOV     R1,#250                     ;
DPLOP:  MOV A,A_BIT                    ;取个位数
MOVC  A,@A+DPTR  ;查个位数的7段代码
MOV   P0,A   ;送出个位的7段代码
CLR     P2.7   ;开个位显示
ACALL   DELY1  ;显示1毫秒
SETB    P2.7  ;关闭个位显示,防止鬼影
MOV     A,B_BIT                   ;取十位数
MOVC    A,@A+DPTR  ;查十位数的7段代码
MOV     P0,A   ;送出十位的7段代码
CLR     P2.6   ;开十位显示
ACALL  DELY1  ;显示1毫秒
SETB P2.6  ;关闭十位显示,防止鬼影
M33: DJNZ    R3,TIME1                   ;2毫秒循环执行250次,时间约0.5秒
RET   
DELY1: MOV  R4,#2  ;1毫秒延时子程序
D11: MOV  R5,#248
DJNZ  R5,$
DJNZ  R4,D11
RET   
DELAY10:MOV  R4,#20  ;10毫秒延时子程序
D12: MOV  R5,#248
DJNZ  R5,$
DJNZ  R4,D12
RET
    ;实验板上的7段数码管0~9数字的共阴显示代码
NUMTAB:DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH      
          END

///////////////////////////////////////////////////
/*===========================/      

24C01存储器I2C总线实验   C语言例子 (转载) 

/  ============================


#include 
#include 
sbit  SDA=0x90;
sbit  SCL=0x91;

//函数声明
unsigned char i2c_read(unsigned char);
void i2c_write(unsigned char,unsigned char);

void i2c_send8bit(unsigned char);
unsigned char i2c_receive8bit(void);
void i2c_start(void);
void i2c_stop(void);
bit i2c_ack(void);
//=======================================================
void main(void)
{
       unsigned char dd;

       i2c_write(0x00,0x55);
       _nop_();

       dd=i2c_read(0x00);
    for(;;)
       {}
}

/*=======================================================
i2c_write(地址,数据),写一个字节
=======================================================*/
void i2c_write(unsigned char Address,unsigned char Data)
{
       do{
       i2c_start();
       i2c_send8bit(0xA0);
       }while(i2c_ack());
       i2c_send8bit(Address);
       i2c_ack();
       i2c_send8bit(Data);
       i2c_ack();
       i2c_stop();
       return;
}
/*=======================================================
i2c_read(地址,数据),写一个字节
=======================================================*/
unsigned char i2c_read(unsigned char Address)
{
       unsigned char c;
       do{
       i2c_start();
       i2c_send8bit(0xA0);
       }while(i2c_ack());                //=1,表示无确认,再次发送
       i2c_send8bit(Address);
       i2c_ack();

       do{
       i2c_start();
       i2c_send8bit(0xA1);
       }while(i2c_ack());
       c=i2c_receive8bit();
       i2c_ack();
       i2c_stop();
       return(c);
}
//=======================================================
//发送开始信号
void i2c_start(void)
{
       SDA = 1;
       SCL = 1;
       SDA = 0;
       SCL = 0;
       return;
}
//发送结束信号
void i2c_stop(void)
{
       SDA = 0;
       SCL = 1; 
       SDA = 1;
       return;
}     
//发送接收确认信号
bit    i2c_ack(void)
{
       bit    ack;
       SDA = 1;
       SCL = 1;
       if     (SDA==1)
       ack = 1;
       else
       ack = 0;
       SCL = 0;
       return      (ack);
}

//送八位数据
void i2c_send8bit(unsigned char b)
{
       unsigned  char a;
       for(a=0;a<8;a++)
              {
              if     ((b< 
              SDA = 1;
              else 
              SDA = 0;
              SCL = 1;
              SCL = 0;
              }
       return;
}
//接收八位数据
unsigned char i2c_receive8bit(void)
{
       unsigned  char a;
       unsigned char b=0;
       for(a=0;a<8;a++)
              {
              SCL = 1;
              b=b<<1;
              if (SDA==1)
              b=b|0x01;       //按位或
              SCL = 0;
              }
       return      (b);
}    


我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号