📄 iic.lis
字号:
.module IIC.C
.area text(rom, con, rel)
0000 .dbfile C:\DOCUME~1\niutao\MYDOCU~1\永磁电机\平缝机\新建文件夹\函数库\IIC\IIC.C
0000 .dbfunc e twi_init _twi_init fV
.even
0000 _twi_init::
0000 .dbline -1
0000 .dbline 32
0000 ; /*****************************************************************
0000 ; * 文件名: IIC.c
0000 ; * 版本号:
0000 ; * 创作日期: 2005.7.7
0000 ; * 作者: fengzm
0000 ; * 功能说明: IIC数据传输
0000 ; * 其它说明: 使用AVR单片机Atmega48, 晶振:8Mhz
0000 ; 注意:发送START信号之后软件不要清零TWCR的"TWSTA"位。
0000 ; *****************************************************************/
0000 ;
0000 ;
0000 ; /*****************************************************************
0000 ;
0000 ; * 修改日期: 2005.7.8
0000 ; * 修改人: wangzq
0000 ; * 修改原因: 格式调整
0000 ;
0000 ; 说明:
0000 ; FirstData = 0; IicData = 待发数据;START_IIC();开始发送数据。
0000 ; FirstData == 0xff 表示发送结束。
0000 ; *******************************************************************/
0000 ;
0000 ;
0000 ; //包含文件
0000 ; #include "IIC.h"
0000 ;
0000 ;
0000 ;
0000 ; // TWI initialize
0000 ; // bit rate:32,prescal:1,rate:100Khz;
0000 ; void twi_init(void)
0000 ; {
0000 .dbline 33
0000 ; TWCR = 0x00; //disable twi
0000 2224 clr R2
0002 ECEB ldi R30,188
0004 F0E0 ldi R31,0
0006 2082 std z+0,R2
0008 .dbline 34
0008 ; TWBR = 0x20; //set bit rate equal 32
0008 80E2 ldi R24,32
000A E8EB ldi R30,184
000C 8083 std z+0,R24
000E .dbline 35
000E ; TWSR = 0x00; //set prescale clock/1
000E E9EB ldi R30,185
0010 2082 std z+0,R2
0012 .dbline 36
0012 ; TWAR = 0x00; //set slave address
0012 EAEB ldi R30,186
0014 2082 std z+0,R2
0016 .dbline 37
0016 ; TWCR = 0x85; //enable twi
0016 85E8 ldi R24,133
0018 ECEB ldi R30,188
001A 8083 std z+0,R24
001C .dbline -2
001C L1:
001C .dbline 0 ; func end
001C 0895 ret
001E .dbend
.area vector(rom, abs)
.org 48
0030 0FC0 rjmp _twi_isr
.area text(rom, con, rel)
001E .dbfile C:\DOCUME~1\niutao\MYDOCU~1\永磁电机\平缝机\新建文件夹\函数库\IIC\IIC.C
001E .dbfunc e twi_isr _twi_isr fV
001E ; IicTwsr -> R16
.even
001E _twi_isr::
001E 2A92 st -y,R2
0020 0A93 st -y,R16
0022 1A93 st -y,R17
0024 8A93 st -y,R24
0026 9A93 st -y,R25
0028 EA93 st -y,R30
002A FA93 st -y,R31
002C 2FB6 in R2,0x3f
002E 2A92 st -y,R2
0030 .dbline -1
0030 .dbline 42
0030 ; }
0030 ;
0030 ; #pragma interrupt_handler twi_isr:25
0030 ; void twi_isr(void)
0030 ; {
0030 .dbline 45
0030 ; byte IicTwsr;
0030 ;
0030 ; IicTwsr = TWSR & 0xF8;
0030 E9EB ldi R30,185
0032 F0E0 ldi R31,0
0034 0081 ldd R16,z+0
0036 087F andi R16,248
0038 .dbline 46
0038 ; switch (IicTwsr)
0038 1127 clr R17
003A 0032 cpi R16,32
003C E0E0 ldi R30,0
003E 1E07 cpc R17,R30
0040 61F1 breq L7
0042 80E2 ldi R24,32
0044 90E0 ldi R25,0
0046 8017 cp R24,R16
0048 9107 cpc R25,R17
004A 74F0 brlt L16
004C L15:
004C 0830 cpi R16,8
004E E0E0 ldi R30,0
0050 1E07 cpc R17,R30
0052 C1F0 breq L6
0054 0830 cpi R16,8
0056 E0E0 ldi R30,0
0058 1E07 cpc R17,R30
005A 0CF4 brge X1
005C 4AC0 rjmp L3
005E X1:
005E L17:
005E 0831 cpi R16,24
0060 E0E0 ldi R30,0
0062 1E07 cpc R17,R30
0064 D1F0 breq L7
0066 45C0 rjmp L3
0068 L16:
0068 0832 cpi R16,40
006A E0E0 ldi R30,0
006C 1E07 cpc R17,R30
006E 29F1 breq L10
0070 0832 cpi R16,40
0072 E0E0 ldi R30,0
0074 1E07 cpc R17,R30
0076 0CF4 brge X2
0078 3CC0 rjmp L3
007A X2:
007A L18:
007A 0033 cpi R16,48
007C E0E0 ldi R30,0
007E 1E07 cpc R17,R30
0080 E1F0 breq L10
0082 37C0 rjmp L3
0084 X0:
0084 .dbline 47
0084 ; {
0084 L6:
0084 .dbline 49
0084 ; case 0x08:
0084 ; TWDR = 0x58; //发送命令;
0084 88E5 ldi R24,88
0086 EBEB ldi R30,187
0088 F0E0 ldi R31,0
008A 8083 std z+0,R24
008C .dbline 50
008C ; START_IIC(); //开始发送
008C 85E8 ldi R24,133
008E ECEB ldi R30,188
0090 8083 std z+0,R24
0092 .dbline 51
0092 ; g_FirstData = 0;
0092 2224 clr R2
0094 20920000 sts _g_FirstData,R2
0098 .dbline 52
0098 ; break;
0098 34C0 rjmp L4
009A L7:
009A .dbline 56
009A ;
009A ; case 0x18:
009A ; case 0x20:
009A ; if (g_FirstData == 0)
009A 20900000 lds R2,_g_FirstData
009E 2220 tst R2
00A0 09F0 breq X3
00A2 2FC0 rjmp L4
00A4 X3:
00A4 .dbline 57
00A4 ; {
00A4 .dbline 58
00A4 ; TWDR=0x00; //发送命令;
00A4 2224 clr R2
00A6 EBEB ldi R30,187
00A8 F0E0 ldi R31,0
00AA 2082 std z+0,R2
00AC .dbline 59
00AC ; START_IIC(); //开始发送
00AC 85E8 ldi R24,133
00AE ECEB ldi R30,188
00B0 8083 std z+0,R24
00B2 .dbline 60
00B2 ; g_FirstData = 1;
00B2 81E0 ldi R24,1
00B4 80930000 sts _g_FirstData,R24
00B8 .dbline 61
00B8 ; }
00B8 .dbline 62
00B8 ; break;
00B8 24C0 rjmp L4
00BA L10:
00BA .dbline 66
00BA ;
00BA ; case 0x28:
00BA ; case 0x30:
00BA ; if (g_FirstData == 2)
00BA 80910000 lds R24,_g_FirstData
00BE 8230 cpi R24,2
00C0 41F4 brne L11
00C2 .dbline 67
00C2 ; {
00C2 .dbline 68
00C2 ; TWCR |= 0x10; //发出停止位,停止发送;
00C2 8091BC00 lds R24,188
00C6 8061 ori R24,16
00C8 8093BC00 sts 188,R24
00CC .dbline 69
00CC ; g_FirstData = 0xff; //发送完成;
00CC 8FEF ldi R24,255
00CE 80930000 sts _g_FirstData,R24
00D2 .dbline 70
00D2 ; }
00D2 L11:
00D2 .dbline 71
00D2 ; if (g_FirstData == 1)
00D2 80910000 lds R24,_g_FirstData
00D6 8130 cpi R24,1
00D8 A1F4 brne L4
00DA .dbline 72
00DA ; {
00DA .dbline 73
00DA ; TWDR = g_IicData; //发送数据;
00DA 20900000 lds R2,_g_IicData
00DE EBEB ldi R30,187
00E0 F0E0 ldi R31,0
00E2 2082 std z+0,R2
00E4 .dbline 74
00E4 ; START_IIC(); //开始发送
00E4 85E8 ldi R24,133
00E6 ECEB ldi R30,188
00E8 8083 std z+0,R24
00EA .dbline 75
00EA ; g_FirstData = 2;
00EA 82E0 ldi R24,2
00EC 80930000 sts _g_FirstData,R24
00F0 .dbline 76
00F0 ; }
00F0 .dbline 77
00F0 ; break;
00F0 08C0 rjmp L4
00F2 L3:
00F2 .dbline 80
00F2 8091BC00 lds R24,188
00F6 8061 ori R24,16
00F8 8093BC00 sts 188,R24
00FC .dbline 81
00FC 8FEF ldi R24,255
00FE 80930000 sts _g_FirstData,R24
0102 .dbline 82
0102 L4:
0102 .dbline -2
0102 L2:
0102 2990 ld R2,y+
0104 2FBE out 0x3f,R2
0106 F991 ld R31,y+
0108 E991 ld R30,y+
010A 9991 ld R25,y+
010C 8991 ld R24,y+
010E 1991 ld R17,y+
0110 0991 ld R16,y+
0112 2990 ld R2,y+
0114 .dbline 0 ; func end
0114 1895 reti
0116 .dbsym r IicTwsr 16 c
0116 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -