s3c9228汇编写的I2C及一字节除法

发布者:cwk2003最新更新时间:2015-02-02 来源: laogu关键字:s3c9228  汇编写  I2C  一字节除法 手机看文章 扫描二维码
随时随地手机看文章

; /*EEPROM的读写*/
;本文件提供四个函数,对MEM(24C02)进行读写
;ReadMemByte
;ReadMemBlock
;WriteMemByte
;WriteMemBlock
;---------------------------------------------------------

;从EEPROM中读一个字节,函数返回值R15
;unsigned char ReadMemByte(unsigned char Addr)
;入口:R15
;出口:R15
;资源: R14,R15
;引用:供外部用作从MEM读1BYTE的函数

ReadMemByte: 
PUSH      R15   ;保存Addr堆栈
;StartI2C(0x51)
LD        R15,#0a0h
CALL      StartI2C
;写入地址并读出数所
POP       R15
CALL      WriteI2C             ;写地址
CALL      StopI2C
LD        R15,#0a1h
CALL      StartI2C               
LD        R12,#01h
CALL      ReadI2C  ;返回值R15
CALL      StopI2C
RET      
;---------------------------------------------------------
        
;从EEPROM中读Len个字节到Dst
;void ReadMemBlock(unsigned char Addr,unsigned char *Dst,unsigned char Len)
;入口:R15--Addr,R13--&Dst,R12--Len
;出口:
;资源: R14
;方法:
;               LD      R15,#E_Addr
;               LD      R13,#Var_Addr
;               LD      R12,#Len
;               CALL    ReadMemBlock            ;从NVRAM读
;引用:供外部用作从MEM读LEN个BYTE的函数

ReadMemBlock:
PUSH   R15   ;保存地址
LD        R15,#0a0h
CALL      StartI2C
POP   R15   ;恢复地址
CALL      WriteI2C
CALL      StopI2C
LD        R15,#0a1h
CALL      StartI2C                        
;读R12个数据
ReadMB_Loop: 
CALL      ReadI2C
LD   @R13,R15
INC   R13
DEC   R12
JR        NZ,ReadMB_Loop
CALL      StopI2C
OR      BTCON,#BIT1     ;WatchDog
RET      
;---------------------------------------------------------
;
;向EEPROM中写一个字节Sdata到Addr,函数返回值C为ACK是否正确
;bit WriteMemByte(unsigned char Addr,unsigned char SData)
;入口:R15--Addr,R13--Sdata
;出口:
;资源: R13,(R14,)R15
;引用:供外部用作向MEM写1BYTE的函数

WriteMemByte: 
PUSH   R15   ;暂存地址
OR        BTCON,#BIT1     ;WatchDog
LD        R15,#0a0h
CALL      StartI2C
POP   R15
CALL      WriteI2C  ;写入地址
LD        R15,R13
CALL      WriteI2C  ;写入数据
CALL      StopI2C
LD        R15,#10
CALL      Delay                               
RET
;---------------------------------------------------------
;
;向EEPROM中写Len个字节Sdata到Addr,函数返回值C为ACK是否正确
;bit WriteMemBlock(unsigned char Addr,unsigned char *Sdata,unsigned char Len)
;入口:R15--Addr,R13--&Sdata,R12--Len
;出口:
;资源: R12,R13,(R14,)R15
;               LD      R15,#E_Addr
;               LD      R13,#Var_Addr
;               LD      R12,#Len
;               CALL    WriteMemBlock   ;
;引用:供外部用作向MEM写LEN长度(BYTE)的函数

WriteMemBlock:
PUSH    R0
PUSH    R1
LD      R0,R15
LD      R1,R13
;写R12个数据
WriteMB_Loop:
LD        R15,R0
LD        R13,@R1
CALL      WriteMemByte        ;WriteI2C
INC       R0
INC       R1
DEC   R12
JR        NZ,WriteMB_Loop
POP       R1
POP       R0
RET      
;---------------------------------------------------------
;
;开始向设备0读或写作好准备
;void StartI2C(unsigned char Device)
;入口:R15
;出口:
;资源: R14,R5
;引用:本文件内的读、写函数

StartI2C:
AND P1CON,#03fh  ;SCL作为输入
OR P1PUR,#008h  ;SCL上拉使能
OR P1,#SCL   ;SCL = 1
OR P2CON,#040h  ;设SDA输出
OR P2PUR,#008h  ;SDA上拉使能,以便输入,但此时为输出
OR P2,#SDA   ;SDA = 1
;等设备释放总线
LD      R5,#0ffh
StartI2C_1:
DEC     R5
JR      Z,StartI2C_2
TM P1,#SCL
JR      Z,StartI2C_1
;开始对设备进行操作
StartI2C_2:     
OR      P1CON,#040h  ;SCL作为输出
AND     P1PUR,#0f7h  ;SCL禁止上拉
NOP
AND     P2,#~SDA  ;SDA = 0
NOP
AND     P1,#~SCL  ;SCL = 0
CALL WriteI2C
JR NC,StartI2C
RET

;---------------------------------------------------------

;从设备处得到ACK响应
;bit GetAckI2C(void)
;入口:
;出口:C
;资源:
;引用:本文件内的读、写函数

GetAckI2C: 
AND   P2CON,#03fh  ;SDA为输入
OR        P1,#SCL  ;SCL = 1
NOP
TM   P2,#SDA
JR        Z,GetAckI2C_1
AND   P1,#~SCL  ;SCL = 0
RCF
RET      
GetAckI2C_1:   
AND   P1,#~SCL  ;SCL = 0
SCF
RET      
;---------------------------------------------------------;

;使设备停止
;void StopI2CA(void)
;入口:
;出口:R15
;资源: R14
;引用:本文件内的读、写函数

StopI2C:       
OR        P2CON,#040h   ;SDA输出 
AND       P2,#~SDA ;SDA = 0
NOP
OR        P1,#SCL ;SCL = 1
NOP
OR        P2,#SDA ;SDA = 1
NOP
AND       P1,#~SCL
AND       P2,#~SDA ;SDA = 0
RET      
;---------------------------------------------------------

;向设备写一个字节的命令或数据或地址,返回值C=1为成功
;bit WriteI2C(const unsigned char SendData)
;入口:R15
;出口:C
;资源: R14
;引用:本文件内的读、写函数

WriteI2C: 
LD        R14,#008h
AND       P2CON,#07fh
OR        P2CON,#040h           ;SDA输出 
;用R14作变量,进行一个字节的传送
WriteI2C_Loop: 
TM   R15,#080h
JR        Z,WriteI2C_1
OR        P2,#SDA  ;SDA = 1
JR        WriteI2C_2
WriteI2C_1: 
AND       P2,#~SDA  ;SDA = 0
NOP
WriteI2C_2: 
OR        P1,#SCL  ;SCL = 1
NOP
AND       P1,#~SCL  ;SCL = 0
RL        R15
DEC       R14
JR        NZ,WriteI2C_Loop
CALL      GetAckI2C
JR        NC,WriteI2C_Error
RET      
WriteI2C_Error: 
CALL      StopI2C
RET      
;---------------------------------------------------------
;
;从设备中读出一个字节,返回值R15;中间用到资源R14
;unsigned char ReadI2C(void)
;入口:
;出口:R15
;资源: R14
;引用:本文件内的读函数
ReadI2C:       
AND   P2CON,#03fh  ;SDA为输入
CLR       R15
LD        R14,#080h
ReadI2C_Loop: 
OR        P1,#SCL  ;SCL = 1
NOP
TM   P2,#SDA
JR        Z,ReadI2C_1
OR        R15,R14
ReadI2C_1: 
AND       P1,#~SCL  ;SCL = 0
RCF      
RRC       R14
JR        NZ,ReadI2C_Loop
CP        R12,#01h
JR        EQ,ReadI2C_2
OR        P2CON,#040h           ;SDA为输出状态
AND       P2,#~SDA
ReadI2C_2:     
OR        P1,#SCL
NOP
AND       P1,#~SCL
RET      
;---------------------------------------------------------
;一字节除以10
;入口:R15
;出口:R15,R13;  R15= R15/10,R13 = R15 %10
;次源: R13,R14,R15
ByteDiv10: 
LD        R14,#10
LD        R13,R15
CLR       R15
Div10_Loop: 
CP        R13,R14
JR        ULT,Div10_Exit
SUB       R13,R14
INC       R15
JR        T,Div10_Loop
Div10_Exit: 
RET   

关键字:s3c9228  汇编写  I2C  一字节除法 引用地址:s3c9228汇编写的I2C及一字节除法

上一篇:GCC精彩之旅(2)
下一篇:基于ADμC812的温度检测系统的设计

推荐阅读最新更新时间:2024-03-16 13:52

STM32单片机学习(13) I2C读写AT24Cxx存储器实验
本程序主要利用I2C串行总线,实现AT24Cxx系列EEPROM存储器(此处是AT24C02)的读写,将数据写入,再读出发送至串口 可利用EEPROM存储器数据断电不消失性质存储一些配置数据等。 主程序 /* * * 软件功能: I2C读写AT24Cxx系列EEPROM存储器 * */ #include stm32f10x.h #include stdio.h #include delay.h #include I2C.h #include AT24Cxx.h void RCC_Configuration(void); void GPIO_Configuration(void); void USART1_Config
[单片机]
STM32F103 I2C 宕机的问题
项目中遇到,用I2C进行读写IC数据,有时候I2C线没接好,特别是GND没共的时候,I2C会卡死在: 类似:I2C_WaitOnTXEFlagUntilTimeout 这种函数中,原因: if((Timeout == 0) || ((HAL_GetTick()-tickstart) Timeout)) HAL_GetTick的值永远不递增了,因为SysTick_Handler中断不来了。系统时钟中断不行了。 考虑过几种解决办法 1.调整系统时间的优先级,已经最高了,研究了好久,不行。 2.其他现在暂时想不起来了 最后解决办法搞了个WWDG,不行就自己Reset吧,否则不能靠手动Reset吧。
[单片机]
基于I2C接口的LED驱动器设计与实现
   LED 无疑是当前最热的一个应用,无论是手持设备、游戏机、 霓虹灯 、广告牌等等,眩目的色彩及高质的光亮,总能第一时间吸引人的眼球。在当前众多的LED控制器面前,如何选择一款功能丰富且性价比又高的产品来迎合自己的设计,无疑是摆在每个设计师面前的问题。   最简单的 LED驱动 ,我们可以用普通的I/O来实现。但I/O控制只能实现LED的 ON 与OFF,无法用来进行混光、闪烁等功能,而且每个LED都需要占用一个单独的I/O资源,无疑性价比很低。我们也可以用专用的大电流LED控制器来设计,但昂贵的成本首先会成为问题,而且设计复杂,程度也会跟着各种干扰的出现相应地提高。基于这些,恩智浦( NXP )推出一系列使用I2C 接口 的L
[家用电子]
基于<font color='red'>I2C</font>接口的LED驱动器设计与实现
STM32 I2C HAL库读取HTU21D
以下代码为使用I2C库函数读取HTU21D温度数据的例程。 ret=HAL_I2C_Mem_Read(&hi2c1,0x80,0xf3,I2C_MEMADD_SIZE_8BIT,rx_buf,2,2000); if(ret == HAL_OK) { rx_buf &= 0xfc; temp = rx_buf ; temp *= 256; //wendu =8; temp += rx_buf ; temp *= 17572; temp /= 65536; temp -= 4685; //保留两位小数 temp /=10; result = (int16_t)temp; pri
[单片机]
I2C总线数字电位器原理及与单片机的接口设计
1 引言 ; ; ; 随着I2C总线应用的日益广泛,兼容I2C总线的接口芯片及存储器的品种也越来越多,其中数字电位器以其调节方便、使用寿命长、受物理环境的影响小、性能稳定等特点,已被广大电子工程技术人员所认识;尤其是在音频产品、控制领域等的应用越来越受到人们的重视。I2C总线数字电位器是美国Xicor公司推出的X9 系列数字电位器中较有代表性的一种。它是把几个E2POT非易失性数字电位器集成在一起的单片CMOS微电路,具有二线串行I2C总线接口,易于软件控制,可直接读出、写入滑动端位置,可级联使用等先进特性。本文以X9241为例说明。 2 结构原理 ; ; ; X9241内部包括一个I2C接口和四个数字电位器。每
[单片机]
<font color='red'>I2C</font>总线数字电位器原理及与单片机的接口设计
I2C总线的仲裁机制
在多主的通信系统中。总线上有多个节点,它们都有自己的寻址地址,可以作为从节点被别的节点访问,同时它们都可以作为主节点向其他的节点发送控制字节和传送数据。但是如果有两个或两个以上的节点都向总线上发送启动信号并开始传送数据,这样就形成了冲突。要解决这种冲突,就要进行仲裁的判决,这就是I 2C总线上的仲裁。 I2C总线上的仲裁分两部分:SCL线的同步和SDA线的仲裁。 1   SCL线的同步(时钟同步) SCL同步是由于总线具有线“与”的逻辑功能,即只要有一个节点发送低电平时,总线上就表现为低电平。当所有的节点都发送高电平时,总线才能表现为高电平。正是由于线“与”逻辑功能的原理,当多个节点同时发送时钟信号时,在总线上表现的是统一的时钟信号
[嵌入式]
51单片机I/O模拟I2C 程序
/ 此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据 及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的 与用户程序连接并扩展..... 经过本人验,绝对好用! / bit ack; /*应答标志位*/ /* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. / void Start_I2c() { SDA=1; /*发送起始条件的数据信号*/ _Nop(); SCL=1; _Nop(); /*起始条件建立时间大于4.7u
[单片机]
I2C接口的数字温度传感器TMP101及其应用
1 TMP101的引脚功能和主要特性 TMP101是TI公司生产的12位低功耗、高精度的数字温度传感器它采用与I2C和SMBus相兼容的2线数字接口,可应用于许多高分辨率和宽量程温度测量场合,如温度控制系统、个 计算机保护、电子测试仪器、办公设备以及生物医学仪器等方面。TMP101采用6脚SOT23封装,其引脚排列如图1所示,引脚功能如下: 1脚SCL:串行总线时钟,CMOS电平; 2脚GND:接地脚; 3脚ALERT:总线报警输出,开路; 4脚 V+:电源; 5脚 ADD0:用户设置的地址输入; 6脚 SDA:串行数据线,CMOS电平,双向,开路; TMP101的供电电压范围为2.7
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved