📄 14iic.lst
字号:
__text_start:
__start:
0046 EFCF LDI R28,0xFF
0047 E1D0 LDI R29,0x10
0048 BFCD OUT 0x3D,R28
0049 BFDE OUT 0x3E,R29
004A 51C0 SUBI R28,0x10
004B 40D0 SBCI R29,0
004C EA0A LDI R16,0xAA
004D 8308 STD Y+0,R16
004E 2400 CLR R0
004F E0E0 LDI R30,0
0050 E0F1 LDI R31,1
0051 E011 LDI R17,1
0052 30E0 CPI R30,0
0053 07F1 CPC R31,R17
0054 F011 BEQ 0x0057
0055 9201 ST R0,Z+
0056 CFFB RJMP 0x0052
0057 8300 STD Z+0,R16
0058 E8EC LDI R30,0x8C
0059 E0F0 LDI R31,0
005A E0A0 LDI R26,0
005B E0B1 LDI R27,1
005C E010 LDI R17,0
005D 38EC CPI R30,0x8C
005E 07F1 CPC R31,R17
005F F021 BEQ 0x0064
0060 95C8 LPM
0061 9631 ADIW R30,1
0062 920D ST R0,X+
0063 CFF9 RJMP 0x005D
0064 940E008B CALL _main
_exit:
0066 CFFF RJMP _exit
_delay_ms:
a --> R20
b --> R22
i --> R16
0067 940E01B1 CALL push_gset2
FILE: E:\ICCAVR\project\AVRMEG~3\icc\014-24C02-LED\main.c
(0001) /*
(0002) 实验十四:
(0003)
(0004) AVR单片机I2C总线实验。
(0005) 1、用24C02记录CPU启动次数,并在PB口上显示出来。
(0006) 2、内部1 M晶振,程序采用单任务方式,软件延时。
(0007) 3、进行此实验请插上LED短路块。
(0008) 4、通过此实验,可以I2C总线操作有个初步认识。
(0009)
(0010) AVR mega128学习板
(0011) www.iccavr.com 阿发
(0012) 14:42 2007-10-19
(0013) */
(0014)
(0015) #include "iom128v.h"
(0016)
(0017) extern unsigned char twi_write(unsigned char addr, unsigned char dd);
(0018) extern unsigned char twi_read(unsigned char addr, unsigned char *dd);
(0019)
(0020) /*延时函数*/
(0021) void delay_ms(unsigned char i) {
(0022)
(0023) unsigned char a, b;
(0024) for (a = 0; a < i; a++) {
0069 2744 CLR R20
006A C006 RJMP 0x0071
(0025) for (b = 1; b; b++);
006B E061 LDI R22,1
006C C001 RJMP 0x006E
006D 9563 INC R22
006E 2366 TST R22
006F F7E9 BNE 0x006D
0070 9543 INC R20
0071 1740 CP R20,R16
0072 F3C0 BCS 0x006B
0073 940E01A8 CALL pop_gset2
0075 9508 RET
(0026) }
(0027) }
(0028)
(0029) /*IO口初始化函数*/
(0030) void io_init(void) {
(0031)
(0032) DDRA = 0x00; /*方向输入*/
_io_init:
0076 2422 CLR R2
0077 BA2A OUT 0x1A,R2
(0033) PORTA = 0xFF; /*打开上拉*/
0078 EF8F LDI R24,0xFF
0079 BB8B OUT 0x1B,R24
(0034) DDRB = 0xFF; /*方向输出*/
007A BB87 OUT 0x17,R24
(0035) PORTB = 0xFF; /*输出高电平*/
007B BB88 OUT 0x18,R24
(0036) DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
007C BA24 OUT 0x14,R2
(0037) PORTC = 0xFF;
007D BB85 OUT 0x15,R24
(0038) DDRD = 0x00;
007E BA21 OUT 0x11,R2
(0039) PORTD = 0xFF;
007F BB82 OUT 0x12,R24
(0040) DDRE = 0x00;
0080 B822 OUT 0x02,R2
(0041) PORTE = 0xFF;
0081 B983 OUT 0x03,R24
(0042) DDRF = 0x00;
0082 92200061 STS 0x61,R2
(0043) PORTF = 0xFF;
0084 93800062 STS 0x62,R24
(0044) DDRG = 0x00;
0086 92200064 STS 0x64,R2
(0045) PORTG = 0xFF;
0088 93800065 STS 0x65,R24
008A 9508 RET
_main:
temp --> Y+0
008B 9721 SBIW R28,1
(0046) }
(0047)
(0048) void main(void) {
(0049)
(0050) unsigned char temp;
(0051)
(0052) io_init();
008C DFE9 RCALL _io_init
(0053) delay_ms(250); /*启动延时*/
008D EF0A LDI R16,0xFA
008E DFD8 RCALL _delay_ms
(0054) twi_read(0x08, &temp); /*读出记录*/
008F 019E MOVW R18,R28
0090 E008 LDI R16,0x8
0091 940E0128 CALL _twi_read
(0055) PORTB = ~temp; /*显示记录*/
0093 8028 LDD R2,Y+0
0094 9420 COM R2
0095 BA28 OUT 0x18,R2
(0056) temp ++; /*刷新记录*/
0096 8188 LDD R24,Y+0
0097 5F8F SUBI R24,0xFF
0098 8388 STD Y+0,R24
(0057) twi_write(0x08, temp); /*写入记录*/
0099 2F28 MOV R18,R24
009A E008 LDI R16,0x8
009B 940E00CF CALL _twi_write
(0058)
(0059) while (1) {
009D CFFF RJMP 0x009D
009E 9621 ADIW R28,1
009F 9508 RET
_error:
type --> R16
00A0 940E01B3 CALL push_gset1
FILE: E:\ICCAVR\project\AVRMEG~3\icc\014-24C02-LED\twi.c
(0001) /*
(0002) I2C总线/TWI操作模块
(0003) 1、读取和写入函数
(0004) 2、地址有效范围255
(0005) 3、数据长度为单字节
(0006) 4、函数采用查询方式
(0007) 5、可直接嵌入到项目中使用
(0008) 6、晶振频率:1M
(0009) 7、总线速度:50K
(0010)
(0011) AVR_AFA
(0012) www.iccavr.com
(0013) */
(0014)
(0015) #include "iom128v.h"
(0016)
(0017) /*I2C总线主机模式错误处理*/
(0018) void error(unsigned char type) {
(0019)
(0020) switch (type & 0xF8) {
00A2 2F40 MOV R20,R16
00A3 2755 CLR R21
00A4 7F48 ANDI R20,0xF8
00A5 7050 ANDI R21,0
00A6 3340 CPI R20,0x30
00A7 E0E0 LDI R30,0
00A8 075E CPC R21,R30
00A9 F0D9 BEQ 0x00C5
00AA E380 LDI R24,0x30
00AB E090 LDI R25,0
00AC 1784 CP R24,R20
00AD 0795 CPC R25,R21
00AE F02C BLT 0x00B4
00AF 3240 CPI R20,0x20
00B0 E0E0 LDI R30,0
00B1 075E CPC R21,R30
00B2 F071 BEQ 0x00C1
00B3 C018 RJMP 0x00CC
00B4 3348 CPI R20,0x38
00B5 E0E0 LDI R30,0
00B6 075E CPC R21,R30
00B7 F0A1 BEQ 0x00CC
00B8 3348 CPI R20,0x38
00B9 E0E0 LDI R30,0
00BA 075E CPC R21,R30
00BB F084 BLT 0x00CC
00BC 3448 CPI R20,0x48
00BD E0E0 LDI R30,0
00BE 075E CPC R21,R30
00BF F049 BEQ 0x00C9
00C0 C00B RJMP 0x00CC
(0021) case 0x20: /*址址写失败*/
(0022) /*stop 停止*/
(0023) TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
00C1 E984 LDI R24,0x94
00C2 93800074 STS 0x74,R24
(0024) break;
00C4 C007 RJMP 0x00CC
(0025) case 0x30: /*数据写失败*/
(0026) /*stop 停止*/
(0027) TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
00C5 E984 LDI R24,0x94
00C6 93800074 STS 0x74,R24
(0028) break;
00C8 C003 RJMP 0x00CC
(0029) case 0x38: /*仲裁失败*/
(0030) break;
(0031) case 0x48: /*址址读失败*/
(0032) /*stop 停止*/
(0033) TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
00C9 E984 LDI R24,0x94
00CA 93800074 STS 0x74,R24
(0034) break;
00CC 940E01B6 CALL pop_gset1
00CE 9508 RET
_twi_write:
dd --> R20
addr --> R22
00CF 940E01B1 CALL push_gset2
00D1 2F42 MOV R20,R18
00D2 2F60 MOV R22,R16
(0035) }
(0036) }
(0037)
(0038) /*I2C总线单字节写入*/
(0039) unsigned char twi_write(unsigned char addr, unsigned char dd) {
(0040)
(0041) TWBR = 2;
00D3 E082 LDI R24,2
00D4 93800070 STS 0x70,R24
(0042)
(0043) /*start 启动*/
(0044) TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
00D6 EA84 LDI R24,0xA4
00D7 93800074 STS 0x74,R24
(0045) while (!(TWCR & (1 << TWINT)));
00D9 90200074 LDS R2,0x74
00DB FE27 SBRS R2,7
00DC CFFC RJMP 0x00D9
(0046) if ((TWSR & 0xF8) != 0x08) {
00DD 91800071 LDS R24,0x71
00DF 7F88 ANDI R24,0xF8
00E0 3088 CPI R24,0x8
00E1 F029 BEQ 0x00E7
(0047) error(TWSR);
00E2 91000071 LDS R16,0x71
00E4 DFBB RCALL _error
(0048) return 0;
00E5 2700 CLR R16
00E6 C03E RJMP 0x0125
(0049) }
(0050)
(0051) /*SLA_W 芯片地址*/
(0052) TWDR = 0xA0;
00E7 EA80 LDI R24,0xA0
00E8 93800073 STS 0x73,R24
(0053) TWCR = (1 << TWINT) | (1 << TWEN);
00EA E884 LDI R24,0x84
00EB 93800074 STS 0x74,R24
(0054) while (!(TWCR & (1 << TWINT)));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -