搜索
bottom↓
回复: 7

分享一段自己写的24C02外部存储器的读写汇编子程序-已通...

[复制链接]

出0入0汤圆

发表于 2012-9-19 12:15:24 | 显示全部楼层 |阅读模式
这几天研究IIC总线,重新按自己的思路写了这个24C02的读写程序,用于在自己的主程序中调用。24C02可用于对数据采集的掉电保存或者系统的设置的读取或保存,对于没有数据保存能力的MCU是有很大作用的。使用两个I/O口模拟IIC总线与24C02做数据通信,很多人总觉得汇编很复杂,其实优化过的汇编是很简洁的,直指硬件的时序操作,也很直观,汇编达人请指正一些不够完善的地方,也欢迎大家讨论~~  
分享一下汇编程序如下:

;数据写或读用A作为位载体,R2作为24c02位置字节地址,R3是写入或读出的内容
SDA EQU P2.0;定义24C02的串行数据线
SCL EQU P2.1;定义24C02的串行时钟线
ORG 0000H
AJMP START
ORG 0030H
START:MOV SP,#60H
MAIN:  ;放入需要的主程序
AJMP $


XIE:  ;写数据子程序,R2是要写入的24c02的字节位置地址,R3是要写入的内容
LCALL STAR;起始条件
MOV A,#10100000B;寻址24C02的总线硬件地址并使用写入命令
LCALL SDATA;传输数据A给24C02
MOV A,R2   ;确定要写入的字节位置地址
LCALL SDATA;传输数据A给24C02
MOV A,R3   ;把数据R3写入刚指定的字节地址
LCALL SDATA;传输数据A给24C02
;此处可在一页中(24C02一页为8字节,共32页)继续连续写入,注意一次不超过8个字节,字节地址自动+1,也可以不连续写
LCALL STOP;写入结束
LCALL CHULI ;提供2ms给24C02内部处理刚写入的数据,注意只有写完数据需要给24C02一定的处理时间
RET

DU:   ;读数据子程序,R2是要读的24c02的字节位置地址,读完后A传给R3
LCALL STAR;起始条件
MOV A,#10100000B;寻址24C02的总线硬件地址并使用写入命令(注意这里是写入命令)
LCALL SDATA;传输数据A给24C02
MOV A,R2   ;注意,这里是使24C02的字节地址指针变成R2的值,也就是确定要读取的字节位置地址
LCALL SDATA;传输数据A给24C02
LCALL STAR ;重复起始条件
MOV A,#10100001B;寻址24C02的总线硬件地址并使用读出命令(这里正式发起读命令)
LCALL SDATA;传输数据A给24C02
LCALL RDATA;从之前指定的字节地址中读出字节内容到A
LCALL STOP ;读取完毕(这里并没有连续读取,只能读一个字节,要多个字节连续读取,请自己在R2上做变址读取循环)
MOV R3,A  ;读出的字节传给R3
RET

STAR:SETB SDA ;起始条件子程序
SETB SCL
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
RET

SDATA:MOV R0,#08H ;向24C02传输数据子程序
LOOP0:CLR SCL
RLC A
MOV SDA,C
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
DJNZ R0,LOOP0
CLR SCL
NOP
SETB SDA
NOP
NOP
SETB SCL
REP:MOV C,SDA
JC REP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET

RDATA:MOV R0,#08H  ;从24C02读取数据子程序(读取一个字节以后不做应答)
LOOP1:SETB SCL
NOP
NOP
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
NOP
NOP
NOP
NOP
DJNZ R0,LOOP1
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
RET

STOP:CLR SDA   ;结束条件
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
RET

CHULI: ;1999uS  ;这里是用于写完数据以后留给24C02的内部数据处理时间,2ms是一个非常保险的时间,最短需要1ms
    MOV R6,#04H
WR0:
    MOV R5,#0F8H
    DJNZ R5,$
    DJNZ R6,WR0
    RET
END

出0入0汤圆

发表于 2012-9-19 12:40:24 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2012-9-19 12:44:47 | 显示全部楼层
本帖最后由 xiaoya1945 于 2012-9-19 12:48 编辑

响应一下Lz,我也贴段汇编 IIC EEPROM 的 程式,不过... 只能我自己使用了

  1. ;;====================================================;;
  2. ;; Random Read
  3. Random_Read_Init:
  4.         Disable_All_Interrupt                ;;在读写24C02操作中,关闭中断,以防出错
  5.         LD        A,#0FH
  6.         LD        (Time_Out),A               
  7.         LDPCH        WRITE_WAIT
  8.         CALL        WRITE_WAIT
  9.         LDPCH        WRITE_WAIT
  10.         CALL        WRITE_WAIT
  11. Random_Read_Start:
  12.        
  13.         LD        A,#05H
  14.         LD        (WATCH),A                ;;Reset WDT
  15.         DEC        (Time_Out)
  16.         LDPCH        Random_Read_TimeOut
  17.         JZ        Random_Read_TimeOut
  18.        
  19.         LDPCH        IIC_START
  20.         CALL        IIC_START
  21. Send_Add_R_Command:
  22.         LD        A,#Device_Add.N0        ;;发送器件地址和写命令
  23.         AND        A,#Write_Command
  24.         LD        (DATAL),A
  25.         LD        A,#Device_Add.N1
  26.         LD        (DATAH),A
  27.         LDPCH        WRITE_BYTE                ;;写一个Byte到IIC BUS
  28.         CALL        WRITE_BYTE
  29.         LDPCH        Receive_ACK
  30.         CALL        Receive_ACK
  31.         AND        A,#0001B
  32.         LDPCH        Random_Read_Start
  33.         JNZ        Random_Read_Start
  34.         LD        A,#Read_Word_Add.N0        ;;指定从器件从word Add读起
  35.         LD        (DATAL),A
  36.         LD        A,#Read_Word_Add.N1
  37.         LD        (DATAH),A
  38.        
  39.         LDPCH        WRITE_BYTE
  40.         CALL        WRITE_BYTE
  41.         LDPCH        Receive_ACK
  42.         CALL        Receive_ACK
  43.         AND        A,#0001B
  44.         LDPCH        Random_Read_Start
  45.         JNZ        Random_Read_Start
  46.        
  47.         LDPCH        IIC_START
  48.         CALL        IIC_START
  49.        
  50.         LD        A,#Device_Add.N0        ;;再次发送 从器件地址,并发送读命令
  51.         OR        A,#Read_Command
  52.         LD        (DATAL),A
  53.         LD        A,#Device_Add.N1
  54.         LD        (DATAH),A
  55.         LDPCH        WRITE_BYTE
  56.         CALL        WRITE_BYTE
  57.         LDPCH        Receive_ACK
  58.         CALL        Receive_ACK
  59.         AND        A,#0001B
  60.         LDPCH        Random_Read_Start
  61.         JNZ        Random_Read_Start
  62.        
  63.         LDPCH        READ_BYTE
  64.         CALL        READ_BYTE
  65.        
  66.         LDPCH        M_to_S_NoACK
  67.         CALL        M_to_S_NoACK
  68.        
  69.         LDPCH        IIC_STOP
  70.         CALL        IIC_STOP                ;;Random_Read 结束,读到的数据存放于DATAL和DATAH中
  71. Random_Read_End:
  72.         LD        A,(DATAL)                ;;读取到的数据给PB和PD,指示结果
  73.         LD        (DATA_PB),A
  74.         LD        A,(DATAH)
  75.         LD        (DATA_PD),A
  76.        
  77.         LDPCH        Main_Loop
  78.         JMP        Main_Loop

  79. Random_Read_TimeOut:
  80.         Enable_All_Interrupt
  81.         LDPCH        Main_Loop
  82.         JMP        Main_Loop
  83.        
  84.        
复制代码

出0入0汤圆

 楼主| 发表于 2012-9-19 12:54:01 | 显示全部楼层
xiaoya1945 发表于 2012-9-19 12:44
响应一下Lz,我也贴段汇编 IIC EEPROM 的 程式,不过... 只能我自己使用了 ...

啊。。。。这思路似乎和我的不打相同。。。没细看,,,能当作子程序嵌入到别的程序里面不?

出0入0汤圆

发表于 2012-9-19 13:04:36 | 显示全部楼层
chaily 发表于 2012-9-19 12:54
啊。。。。这思路似乎和我的不打相同。。。没细看,,,能当作子程序嵌入到别的程序里面不? ...

这段程序是一个4Bit MCU的,24C02随机读的一段代码,所以说这个只能我自己使用了...

出0入0汤圆

 楼主| 发表于 2012-9-19 13:13:51 | 显示全部楼层
xiaoya1945 发表于 2012-9-19 13:04
这段程序是一个4Bit MCU的,24C02随机读的一段代码,所以说这个只能我自己使用了...  ...

还有4bit的MCU??便宜不?介绍个型号吧~~

出0入0汤圆

发表于 2012-9-19 17:32:53 | 显示全部楼层
汇编的。。。真心没毅力看下去。。

出0入0汤圆

发表于 2016-9-17 18:40:50 | 显示全部楼层
做个记号
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 22:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表