




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、串行 EEPROM 的接口编程(ASM 语言); 宏定义SBIT0:macro LACC AND #(0 SACL.endm macroLACCDMA,MASK DMAFh-MASK)DMA;清除 DMA 单元的 MASK 位SBIT1:DMA,MASKDMA;置位 DMA 单元的 MASK 位OR #MASKSACL.endmDMAB15_MSK B14_MSK B13_MSK B12_MSK B11_MSK B10_MSK B9_MSK B8_MSK B7_MSK B6_MSK B5_MSK B4_MSK B3_MSK B2_MSK B1_MSKB0_MSK.set.set.set.set
2、.set.set.set.set.set.set.set.set.set.set.set.set8000h4000h2000h1000h0800h0400h0200h0100h0080h0040h0020h0010h0008h0004h0002h0001h;常数定义; 端口初始化LDP SBIT0 SBIT0 SBIT0 SBIT1SBIT1#225MCRB,B3_MSK MCRC,B0_MSK MCRC,B7_MSK PCDATDIR,B11_MSKPEDATDIR,B8_MSK;7080h70FFh;设置 IOPC3 为I/O 口;设置 IOPE0 为I/O 口;设置 IOPE7 为I/O
3、 口;设置 IOPC3 为输出口;设置 IOPE0 为输出口2通用读写 24LC16B 子程序EEPROM: LDPLAR SBRK MAREEPROM1:CALLLACL AND SACL CALL CALL BCND LACL BEEPROM2:SBRKCALL CALL BCND LACL BEEPROM3:ADRKBIT BCND SBIT0 SBRK LAREEPROM31:CALLCALL BCND LACL BEEPROM30:ADRKMAR BANZSBIT1#225;7080h70FFh;AR0:读写的字节数, AR1:指向控制字节AR0,*-,AR0#1*,AR1I2CSt
4、art*+ #0FEH* I2CSendByte I2CRecAckEEPROM2,EQ #1 EEPROMRET #2I2CSendByte I2CRecAck EEPROM3,EQ #1 EEPROMRET #1*,15EEPROM4,TC PCDATDIR,B3_MSK #2AR1,*I2CSendByte I2CRecAck EEPROM30,EQ #1 EEPROMRET #1*,AR0 EEPROM31,AR1PCDATDIR,B3_MSK;设置开始状态;AR1:临时单元;清除控制字节的第 0 位;送出控制字节(R/W=0);检查应答;出错;AR1: 24LC16B 的块内地址;送
5、出 24LC16B 的块内地址;检查应答;出错;AR1:控制字节;读/写操作判断;写操作,设置写允许:WP=0;AR1:输出数据缓冲区;写出一个字节数据;检查应答;出错;指向下一个字节待写数据;写操作完成,写保护:WP=1BEEPROM5EEPROM4:CALL CALL CALL BCND LACL BEEPROM40:SBRKLAR EEPROM43:BANZB EEPROM41:CALLCALL MAR BEEPROM42:CALLCALL EEPROM5: CALLLACL EEPROMRET:RET;读操作;设置开始状态;送出控制字节(R/W=1);检查应答I2CStart I2CS
6、endByte I2CRecAck EEPROM40,EQ #1 EEPROMRET #2AR1,*,AR0 EEPROM41,AR1 EEPROM42I2CRecByte I2CAck*,AR0 EEPROM43I2CRecByte I2CNoAck I2CStop#0;出错;AR1:输入数据缓冲区;接收一个字节数据;产生应答信号;接收最后一个字节数据;不产生应答信号;设置结束状态;成功操作标志; 启动 I2C 总线I2CStart:SBIT0 SBIT1 SBIT1 SBIT1 RPT NOP SBIT0 RPT NOP SBIT0 SBIT1RETPEDATDIR,B0_MSK PEDA
7、TDIR,B15_MSK PEDATDIR,B7_MSK PEDATDIR,B0_MSK#14;SCL=0;设置 IOPE7 为输出口;SDA=1;SCL=1;600 ns;SDA=0PEDATDIR,B7_MSK#14PEDATDIR,B0_MSKPEDATDIR,B7_MSK;SCL=0;SDA=1; 停止 I2C 总线I2CStop:SBIT0PEDATDIR,B0_MSK;SCL=0SBIT1 SBIT0 SBIT1 RPT NOP SBIT1 RPT NOP SBIT0RETPEDATDIR,B15_MSK PEDATDIR,B7_MSK PEDATDIR,B0_MSK#14;设置
8、IOPE7 为输出口;SDA=0;SCL=1PEDATDIR,B7_MSK#14;SDA=1PEDATDIR,B0_MSK;SCL=0; 检查应答位I2CRecAck:SBIT0SBIT1 SBIT1 SBIT1 RPT NOP SBIT0 NOP SBIT0 LACL ANDRETPEDATDIR,B0_MSK PEDATDIR,B15_MSK PEDATDIR,B7_MSK PEDATDIR,B0_MSK#14;SCL=0;设置 IOPE7 为输出口;SDA=1;SCL=1PEDATDIR,B15_MSK;设置 IOPE7 为输PEDATDIR,B0_MSK PEDATDIR#80H;SC
9、L=0;返回在 ACC 中; 对I2C 总线产生应答I2CAck:SBIT1 SBIT0 SBIT1 RPT NOP SBIT0 NOP SBIT1RETPEDATDIR,B15_MSK PEDATDIR,B7_MSK PEDATDIR,B0_MSK#14;设置 IOPE7 为输出口;SDA=0;SCL=1PEDATDIR,B0_MSK;SCL=0PEDATDIR,B7_MSK;SDA=1; 不对 I2C 总线产生应答I2CNoAck: SBIT1SBIT1 SBIT1PEDATDIR,B15_MSK PEDATDIR,B7_MSKPEDATDIR,B0_MSK;设置 IOPE7 为输出口;S
10、DA=1;SCL=1RPT NOP SBIT0RET#14PEDATDIR,B0_MSK;SCL=0; 向I2C 总线写入数据I2CSendByte: LARLACL RPT SFL SACLSBIT1AR2,#7* #7;位计数器:8 位;AR1:指向待写的数据* PEDATDIR,B15_MSK PEDATDIR,B0_MSK*,16;设置 IOPE7 为输出口;SCL=0I2CS3:SBIT0 LACC SFL SACH BCND SBIT0 B SBIT1 SBIT1 BANZ SBIT0RET*,AR2 I2CS1,CPEDATDIR,B7_MSK I2CS2 PEDATDIR,B7
11、_MSK PEDATDIR,B0_MSK I2CS3,AR1PEDATDIR,B0_MSK;SDA=0I2CS1:I2CS2:;SDA=1;SCL=1;SCL=0; 从I2C 总线数据;位计数器:8 位;设置 IOPE7 为输;SCL=0I2CRecBy AR SBIT0 SBIT0SPLKAR2,#7 PEDATDIR,B15_MSK PEDATDIR,B0_MSK #0,* PEDATDIR,B0_MSK*I2CR1:SBIT1 LACL SFL SACL LACL RPT SFR AND #1OR;SCL=1* PEDATDIR#6*SACL SBIT0 BANZ ADRKRET*,AR
12、2 PEDATDIR,B0_MSK I2CR1,AR1#1;SCL=0;AR1:指向下一个单元3 通用读写 24LC16B 子程序调用实例MAR LAR SPLK SPLK SPLK SPLKCALL*,AR1 AR1,#STACK #200H,*+ #00,*+ #0A0H,*+ #10,*EEPROM;AR1:堆栈指针;待写数据存放空间的首地址;24LC16B 的块内地址;控制字节(R/W=0);待写数据字节数;调用通用读写 24LC16B 子程序12.4.624LC256 的应用编程1 初始化子程序;宏定义SBIT0: macroDMA,MASK;该宏用于清除 DMA 单元的 MASK
13、位LACC AND SACL.endmDMA#(0FH-MASK)DMASBIT1: macro DMA,MASK;该宏用于置位 DMA 单元的 MASK 位LACC OR SACL.endmDMA #MASKDMA;常数的定义B15_MSK B14_MSK B13_MSK B12_MSK B11_MSK B10_MSK B9_MSKB8_MSK.set.set.set.set.set.set.set.set8000h4000h2000h1000h0800h0400h0200h0100hB7_MSK B6_MSK B5_MSK B4_MSK B3_MSK B2_MSK B1_MSK B0_MS
14、KCOUNT.set.set.set.set.set.set.set.set0080h0040h0020h0010h0008h0004h0002h0001h0325h.set;-系统初始化子程序-SYSINITIAL:SETC CLRC CLRC CLRC LDP SPLK SPLK LDP SPLK SPLK LDP SBIT0 SBIT0 SBIT0 SBIT1 SBIT1RETM SXM OVM CNF#SCSR17 #81FEH,SCSR1 #0E8H,WDCR #IMR7#0h,IMR;关闭总中断;B0 被分配为数据空间;取得 SCSR1 所在的页; CLKIN=6M,CLKOUT=
15、24M; 关闭 WDT;不使能所有中断; 清除所有中断标志#0#0E1hFh,IFRMCRB,B0_MSK MCRB,B3_MSKMCRB,B8_MSK;定义 IOPD0,IOPC3,IOPC0 为通用 I/O 口PCDATDIR,B11_MSK ;定义 IOPC3 口为输出PDDATDIR,B8_MSK ;定义 IOPD0 口为输出2 通用读写 24LC256 子程序.text;-通用读写 24LC256 子程序-EEPROM:LDP LARSBRK#225AR0,*-,AR0 #1;AR0:读写的字节数, AR1:指向控制字节,ARP=AR0;MAR*,AR1EEPROM1:CALLLAC
16、LI2Cstart*+;设置 I2C 总线的开始状态;AR1:临时单元;清除控制字节的第 0 位AND #0FEHSACL CALL CALL BCNDLACL* I2CsendByte I2CRECACKEEPROM2,EQ#1;送出控制字节(R/W=0);检查应答位;出错BEEPROMRETEEPROM2:SBRK#2;AR1:24LC256 的块内地址的低字节;(在此之前 AR1 指向临时单元,比控制字 adress 多 1)CALLI2CsendByte;送出 24LC256 的块内地址的低字节;检查应答位CALLI2CRECACKBCNDLACLHIGHBYTE,EQ#1;出错BEE
17、PROMRETHIGHBYTE:SBRK CALL CALL BCNDLACL#1I2CsendByte I2CRECACK EEPROM3,EQ#1;AR1:24LC256 的块内地址的高字节;送出 24LC256 的块内地址的高字节;检查应答位;出错BEEPROMRETEEPROM3:ADRK BIT BCND SBIT0 SBRKLAR#2*,15EEPROM4,TC PDDATDIR,B0_MSK #3AR1,*;AR1 控制字节;读/写操作判断;设置写允许:WP=0;AR1:输出数据缓冲区EEPROM31:CALL CALL BCND LACLBI2CSendByte I2CRECA
18、CK EEPROM30,EQ #1EEPROMRET;写出一个字节数据;检查应答位;出错EEPROM30:ADRK#1;指向下一个字节待写数据MAR*,AR0BANZBEEPROM31,AR1EEPROM5EEPROM4:;读操作;设置 I2C 总线开始状态;送出控制字节(R/W=1);检查应答位;出错CALL CALL CALL BCND LACLBI2CStart I2CSendByte I2CRECACK EEPROM40,EQ #1EEPROMRETEEPROM40:SBRKLAR#3AR1,*,AR0;AR1:输入数据缓冲区EEPROM43:BANZBEEPROM41,AR1EEPR
19、OM42EEPROM41:CALLCALLI2CRecByteI2CAck;接收一个字节数据;产生应答信号MAR*,AR0BEEPROM43EEPROM42:CALLCALLI2CRecByteI2CNoAck;接收最后一个字节数据;不产生应答信号EEPROM5:CALLLACLI2CStop#0;设置结束状态;成功标志,ACC=0EEPROMRET:RET;返回;启动 I2C 总线子程序I2CStart: SBIT0 SBIT1 SBIT1SBIT1PCDATDIR,B3_MSK PCDATDIR,B8_MSK PCDATDIR,B0_MSKPCDATDIR,B3_MSK;SCL=0;IOP
20、C0(SDA 为输出);SDA=1,SCL=1RPT NOP SBIT0 RPT NOP SBIT0 SBIT1RET#14;延时 600ns;SDA=0PCDATDIR,B0_MSK#14;延时 600ns;SCL=0;SDA=1PCDATDIR,B3_MSKPCDATDIR,B0_MSK;-向I2C 总线写入数据子程序-I2CSendByte:LAR LACL RPT SFL SACL SBIT1 I2CS3: SBIT0 LACC SFL SACH BCNDSBIT0AR2,#7* #7;位计数器为 8;AR1 指向待写的数据*PCDATDIR,B8_MSK;设置 IOPC0 为输出口P
21、CDATDIR,B3_MSK*,16;SCL=0*,AR2 I2CS1,CPCDATDIR,B0_MSK;SDA=0,(该位为 0)BI2CS2I2CS1: SBIT1 I2CS2:SBIT1PCDATDIR,B0_MSK;SDA=1,(该位为 1)PCDATDIR,B3_MSK;SCL=1,在 SCL=1 期间数据线上的;状态必须保持不变BANZ SBIT0RETI2CS3,AR1PCDATDIR,B3_MSK;SCL=0;-检查应答位子程序-I2CRECACK:SBIT0 SBIT1RPTPCDATDIR,B3_MSK PCDATDIR,B3_MSK#14;SCL=0;SCL=1NOP S
22、BIT0 NOP NOP LACLANDPCDATDIR,B8_MSK;IOPC0(SDA 为输入)PCDATDIR#01H;返回在 ACC 中,若 ACC=0 表示操作成功,;若 ACC=1 表示操作失败RET;从I2C 总线I2CRecByte:数据-LAR SBIT0 SBIT0 SPLK I2CR1: SBIT1 LACLSFL SACL LACL AND OR SACL SBIT0 BANZ ADRKRETAR2,#7 PCDATDIR,B8_MSK PCDATDIR,B3_MSK#0,*;位计数器为 8;设置 IOPC0 为输;SCL=0PCDATDIR,B3_MSK*;SCL=1
23、*PCDATDIR;IOPC0 上的数据#1*,AR2 PCDATDIR,B3_MSK;SCL=0 I2CR1,AR1#1;AR1:指向下一个单元;-对I2C 总线产生应答-I2CAck:SBIT1 SBIT0 SBIT1 RPT NOP SBIT0 NOPSBIT1PCDATDIR,B8_MSK PCDATDIR,B0_MSKPCDATDIR,B3_MSK#14;设置 IOPC0 为输出口;SDA=0;SCL=1;延时 600ns;SCL=0PCDATDIR,B3_MSKPCDATDIR,B0_MSK;SDA=1,数据线恢复为 1,但此时;SCL=0,SDA 在后来可以改变RET;-不对 I
24、2C 总线产生应答-oAck:SBIT1 SBIT1 SBIT1 RPT NOP SBIT0 RET;PCDATDIR,B8_MSK PCDATDIR,B0_MSKPCDATDIR,B3_MSK#14;设置 IOPC0 为输出口;SDA=1;SCL=1;延时 600nsPCDATDIR,B3_MSK ;SCL=0停止 I2C 总线I2CStop: SBIT0 SBIT1 SBIT0 SBIT1RPT NOP SBIT1 RPT NOP SBIT0RETPCDATDIR,B3_MSK PCDATDIR,B8_MSK PCDATDIR,B0_MSKPCDATDIR,B3_MSK#14;SCL=0;
25、设置 IOPC0 为输出口;SDA=0;SCL=1PCDATDIR,B0_MSK#14;SDA=1PCDATDIR,B3_MSK;SCL=0;返回3 通用读写 24LC16B 子程序调用实例;-系统初始化子程序-SYSINITIAL:SETC CLRC CLRC CLRC LDP SPLK SPLK LDP SPLKSPLKM SXM OVM CNF#SCSR17 #81FEH,SCSR1 #0E8H,WDCR #IMR7#0h,IMR;关闭总中断;B0 被分配为数据空间;取得 SCSR1 所在的页; CLKIN=6M,CLKOUT=24M; 关闭 WDT;关闭所有中断;清除所有中断标志#0Fh,IFRLDP SBIT0 SBIT0 SBIT0 SBIT1 SBIT1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 货代公司实习报告总结模版
- 工业互联网平台同态加密技术发展趋势与竞争格局分析报告
- 福建省泉州市晋江市重点中学2024届中考冲刺卷数学试题含解析
- 2025年小学第二学期四级语文教研组总结模版
- DB2学习总结模版
- 区块链-数据时代的透明保障
- 助理工程师试用期转正工作个人总结模版
- 区块链与教育创新去中心化教育的探索与实践
- 中学复习课互动与反思提升策略探索
- 职业本科教育改革新举措出台
- GB/T 4706.1-2024家用和类似用途电器的安全第1部分:通用要求
- 中国老年糖尿病诊疗指南(2024版)解读
- 快递驿站承包协议书
- 地坪漆专项施工方案及流程
- 2024年北京海淀区高三二模语文试题和答案
- 锑矿湿法冶金新技术
- 2024年辅警招聘考试试题库含完整答案(各地真题)
- 手术室团队协作
- 航天禁(限)用工艺目录(2021版)-发文稿(公开)
- 湖北省武汉市2024届高中毕业生四月调研考试数学试卷
- MOOC 机械设计基础-西安交通大学 中国大学慕课答案
评论
0/150
提交评论