📄 iic_master.lis
字号:
.module iic_master.c
.area text(rom, con, rel)
0000 .dbfile D:\mega16\drive\iic_master.c
0000 .dbfunc e IICRead _IICRead fc
0000 ; i -> R22
0000 ; NByte -> y+4
0000 ; Addr -> R22
0000 ; Ret -> R20,R21
.even
0000 _IICRead::
0000 0E940000 xcall push_gset2
0004 622F mov R22,R18
0006 A801 movw R20,R16
0008 .dbline -1
0008 .dbline 52
0008 ; /*********************************************************************************************************
0008 ; ** Small RTOS(51)
0008 ; ** The Real-Time Kernel(For Keil c51)
0008 ; **
0008 ; ** (c) Copyright 2002-2003, chenmingji
0008 ; ** All Rights Reserved
0008 ; **
0008 ; ** V1.12.1
0008 ; **
0008 ; **
0008 ; **--------------文件信息--------------------------------------------------------------------------------
0008 ; **文 件 名: IIC_Master.c
0008 ; **创 建 人: 陈明计
0008 ; **最后修改日期: 2002年12月3日
0008 ; **描 述: Small RTOS IIC总线主器件驱动程序源文件,也可以在不使用
0008 ; ** Small RTOS的情况下使用(标准51CPU12MHz时100KHz IIc总线
0008 ; ** 仿真)
0008 ; **--------------历史版本信息----------------------------------------------------------------------------
0008 ; ** 创建人: 陈明计
0008 ; ** 版 本: V1.00
0008 ; ** 日 期: 2003年2月28日
0008 ; ** 描 述: 原始版本
0008 ; **
0008 ; **------------------------------------------------------------------------------------------------------
0008 ; ** 修改人:
0008 ; ** 版 本:
0008 ; ** 日 期:
0008 ; ** 描 述:
0008 ; **
0008 ; **--------------当前版本修订------------------------------------------------------------------------------
0008 ; ** 修改人:
0008 ; ** 日 期:
0008 ; ** 描 述:
0008 ; **
0008 ; **------------------------------------------------------------------------------------------------------
0008 ; ********************************************************************************************************/
0008 ; #include "config.h"
0008 ;
0008 ; #define IIC_delay() delay_1us();delay_1us();
0008 ; /*********************************************************************************************************
0008 ; ** 函数名称: IICRead
0008 ; ** 功能描述: 从IIC总线读取数据
0008 ; ** 输 入: Ret:存储读取的数据
0008 ; ** Addr:IIC从器件地址
0008 ; ** Nbyte:读取的字节数目
0008 ; ** 输 出: TRUE:成功
0008 ; ** FALSE:失败
0008 ; ** 全局变量: 无
0008 ; ** 调用模块: 无
0008 ; ********************************************************************************************************/
0008 ; uchar IICRead(uchar *Ret,uchar Addr,uchar NByte)
0008 ; {
0008 .dbline 55
0008 ; uchar i;
0008 ;
0008 ; Addr = Addr | 0x01;
0008 6160 ori R22,1
000A .dbline 56
000A ; if (IICStart() == FALSE)
000A 48D0 xcall _IICStart
000C 0230 cpi R16,2
000E 11F4 brne L2
0010 .dbline 57
0010 ; {
0010 .dbline 58
0010 ; return FALSE;
0010 02E0 ldi R16,2
0012 19C0 xjmp L1
0014 L2:
0014 .dbline 61
0014 ; }
0014 ;
0014 ; if(IICSend(Addr) == FALSE)
0014 062F mov R16,R22
0016 7FD1 xcall _IICSend
0018 0230 cpi R16,2
001A 11F4 brne L4
001C .dbline 62
001C ; {
001C .dbline 63
001C ; return FALSE;
001C 02E0 ldi R16,2
001E 13C0 xjmp L1
0020 L4:
0020 .dbline 65
0020 ; }
0020 ; i = NByte - 1;
0020 6C81 ldd R22,y+4
0022 6150 subi R22,1
0024 .dbline 66
0024 ; if (i != 0)
0024 51F0 breq L6
0026 .dbline 67
0026 ; {
0026 L8:
0026 .dbline 69
0026 ; do
0026 ; {
0026 .dbline 70
0026 ; *Ret++ = IICReceive();
0026 F5D1 xcall _IICReceive
0028 FA01 movw R30,R20
002A 0193 st Z+,R16
002C AF01 movw R20,R30
002E .dbline 71
002E ; IIC_ACK();
002E A9D0 xcall _IIC_ACK
0030 .dbline 72
0030 L9:
0030 .dbline 72
0030 ; } while (--i != 0);
0030 862F mov R24,R22
0032 8150 subi R24,1
0034 682F mov R22,R24
0036 8823 tst R24
0038 B1F7 brne L8
003A .dbline 73
003A ; }
003A L6:
003A .dbline 74
003A ; *Ret = IICReceive();
003A EBD1 xcall _IICReceive
003C FA01 movw R30,R20
003E 0083 std z+0,R16
0040 .dbline 75
0040 ; IIC_NO_ACK();
0040 05D1 xcall _IIC_NO_ACK
0042 .dbline 76
0042 ; IICStop();
0042 49D0 xcall _IICStop
0044 .dbline 77
0044 ; return TRUE;
0044 01E0 ldi R16,1
0046 .dbline -2
0046 L1:
0046 0E940000 xcall pop_gset2
004A .dbline 0 ; func end
004A 0895 ret
004C .dbsym r i 22 c
004C .dbsym l NByte 4 c
004C .dbsym r Addr 22 c
004C .dbsym r Ret 20 pc
004C .dbend
004C .dbfunc e IICWrite _IICWrite fc
004C ; i -> R20
004C ; NByte -> y+4
004C ; Data -> R22,R23
004C ; Addr -> R20
.even
004C _IICWrite::
004C 0E940000 xcall push_gset2
0050 B901 movw R22,R18
0052 402F mov R20,R16
0054 .dbline -1
0054 .dbline 92
0054 ; }
0054 ;
0054 ; /*********************************************************************************************************
0054 ; ** 函数名称: IICWrite
0054 ; ** 功能描述: 往IIC总线写数据
0054 ; ** 输 入: Addr:IIC从器件地址
0054 ; ** Data:存储将要写的数据
0054 ; ** Nbyte:写的字节数目
0054 ; ** 输 出: TRUE:成功
0054 ; ** FALSE:失败
0054 ; ** 全局变量: 无
0054 ; ** 调用模块: 无
0054 ; ********************************************************************************************************/
0054 ; uchar IICWrite(uchar Addr,uchar *Data,uchar NByte)
0054 ; {
0054 .dbline 95
0054 ; uchar i;
0054 ;
0054 ; Addr = Addr & 0xfe;
0054 4E7F andi R20,254
0056 .dbline 96
0056 ; if (IICStart() == FALSE)
0056 22D0 xcall _IICStart
0058 0230 cpi R16,2
005A 11F4 brne L12
005C .dbline 97
005C ; {
005C .dbline 98
005C ; return FALSE;
005C 02E0 ldi R16,2
005E 16C0 xjmp L11
0060 L12:
0060 .dbline 100
0060 ; }
0060 ; if (IICSend(Addr) == FALSE)
0060 042F mov R16,R20
0062 59D1 xcall _IICSend
0064 0230 cpi R16,2
0066 11F4 brne L14
0068 .dbline 101
0068 ; {
0068 .dbline 102
0068 ; return FALSE;
0068 02E0 ldi R16,2
006A 10C0 xjmp L11
006C L14:
006C .dbline 104
006C ; }
006C ; i = NByte;
006C 4C81 ldd R20,y+4
006E L16:
006E .dbline 106
006E ; do
006E ; {
006E .dbline 107
006E ; if (IICSend(*Data++) == FALSE)
006E FB01 movw R30,R22
0070 0191 ld R16,Z+
0072 BF01 movw R22,R30
0074 50D1 xcall _IICSend
0076 0230 cpi R16,2
0078 11F4 brne L19
007A .dbline 108
007A ; {
007A .dbline 109
007A ; return FALSE;
007A 02E0 ldi R16,2
007C 07C0 xjmp L11
007E L19:
007E .dbline 111
007E L17:
007E .dbline 111
007E ; }
007E ; } while (--i !=0 );
007E 842F mov R24,R20
0080 8150 subi R24,1
0082 482F mov R20,R24
0084 8823 tst R24
0086 99F7 brne L16
0088 .dbline 112
0088 ; IICStop();
0088 26D0 xcall _IICStop
008A .dbline 113
008A ; return TRUE;
008A 01E0 ldi R16,1
008C .dbline -2
008C L11:
008C 0E940000 xcall pop_gset2
0090 .dbline 0 ; func end
0090 0895 ret
0092 .dbsym r i 20 c
0092 .dbsym l NByte 4 c
0092 .dbsym r Data 22 pc
0092 .dbsym r Addr 20 c
0092 .dbend
0092 .dbfunc e IICInit _IICInit fV
.even
0092 _IICInit::
0092 .dbline -1
0092 .dbline 125
0092 ; }
0092 ;
0092 ; /*********************************************************************************************************
0092 ; ** 函数名称: IICInit
0092 ; ** 功能描述: IIC总线初始化
0092 ; ** 输 入: 无
0092 ; ** 输 出: 无
0092 ; ** 全局变量: 无
0092 ; ** 调用模块: 无
0092 ; ********************************************************************************************************/
0092 ; void IICInit(void)
0092 ; {
0092 .dbline 126
0092 ; IIC_SDA_O;
0092 A19A sbi 0x14,1
0094 .dbline 127
0094 ; IIC_SCL_O;
0094 A09A sbi 0x14,0
0096 .dbline 128
0096 ; IIC_SCL_L;
0096 A898 cbi 0x15,0
0098 .dbline 129
0098 ; IICStop();
0098 1ED0 xcall _IICStop
009A .dbline -2
009A L21:
009A .dbline 0 ; func end
009A 0895 ret
009C .dbend
009C .dbfunc e IICStart _IICStart fc
.even
009C _IICStart::
009C .dbline -1
009C .dbline 142
009C ; }
009C ;
009C ; /*********************************************************************************************************
009C ; ** 函数名称: IICStart
009C ; ** 功能描述: 发送IIC启动信号
009C ; ** 输 入: 无
009C ; ** 输 出: TRUE:成功
009C ; ** FALSE:失败
009C ; ** 全局变量: 无
009C ; ** 调用模块: 无
009C ; ********************************************************************************************************/
009C ; uchar IICStart(void)
009C ; {
009C .dbline 143
009C ; IIC_SDA_I;
009C A198 cbi 0x14,1
009E .dbline 144
009E ; IIC_SDA_H;
009E A99A sbi 0x15,1
00A0 .dbline 145
00A0 ; IIC_SCL_H;
00A0 A89A sbi 0x15,0
00A2 .dbline 146
00A2 ; if (IIC_DATA)
00A2 999B sbis 0x13,1
00A4 16C0 rjmp L23
00A6 .dbline 147
00A6 ; {
00A6 .dbline 148
00A6 ; IIC_SDA_O;
00A6 A19A sbi 0x14,1
00A8 .dbline 149
00A8 ; IIC_SDA_L;
00A8 A998 cbi 0x15,1
00AA .dbline 150
00AA ; IIC_delay();
00AA 0000 nop
00AC .dbline 150
00AC 0000 nop
00AE .dbline 150
00AE 0000 nop
00B0 .dbline 150
00B0 0000 nop
00B2 .dbline 150
00B2 0000 nop
00B4 .dbline 150
00B4 0000 nop
00B6 .dbline 150
00B6 0000 nop
00B8 .dbline 150
00B8 0000 nop
00BA .dbline 150
00BA 0000 nop
00BC .dbline 150
00BC 0000 nop
00BE .dbline 150
00BE 0000 nop
00C0 .dbline 150
00C0 0000 nop
00C2 .dbline 150
00C2 0000 nop
00C4 .dbline 150
00C4 0000 nop
00C6 .dbline 150
00C6 0000 nop
00C8 .dbline 150
00C8 0000 nop
00CA .dbline 150
00CA .dbline 151
00CA ; IIC_SCL_L;
00CA A898 cbi 0x15,0
00CC .dbline 152
00CC ; IIC_SDA_H;
00CC A99A sbi 0x15,1
00CE .dbline 153
00CE ; return TRUE;
00CE 01E0 ldi R16,1
00D0 01C0 xjmp L22
00D2 L23:
00D2 .dbline 156
00D2 ; }
00D2 ; else
00D2 ; {
00D2 .dbline 157
00D2 ; return FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -