📄 013.lst
字号:
(0096) /*SLA_W 芯片地址*/
(0097) TWDR = 0xA0;
00CE EA80 LDI R24,0xA0
00CF B983 OUT 0x03,R24
(0098) TWCR = (1 << TWINT) | (1 << TWEN);
00D0 E884 LDI R24,0x84
00D1 BF86 OUT 0x36,R24
(0099) while (!(TWCR & (1 << TWINT)));
00D2 B626 IN R2,0x36
00D3 FE27 SBRS R2,7
00D4 CFFD RJMP 0x00D2
(0100) if ((TWSR & 0xF8) != 0x18) {
00D5 B181 IN R24,0x01
00D6 7F88 ANDI R24,0xF8
00D7 3188 CPI R24,0x18
00D8 F021 BEQ 0x00DD
(0101) error(TWSR);
00D9 B101 IN R16,0x01
00DA DF70 RCALL _error
(0102) return 0;
00DB 2700 CLR R16
00DC C03D RJMP 0x011A
(0103) }
(0104)
(0105) /*addr 操作地址*/
(0106) TWDR = addr;
00DD B963 OUT 0x03,R22
(0107) TWCR = (1 << TWINT) | (1 << TWEN);
00DE E884 LDI R24,0x84
00DF BF86 OUT 0x36,R24
(0108) while (!(TWCR & (1 << TWINT)));
00E0 B626 IN R2,0x36
00E1 FE27 SBRS R2,7
00E2 CFFD RJMP 0x00E0
(0109) if ((TWSR & 0xF8) != 0x28) {
00E3 B181 IN R24,0x01
00E4 7F88 ANDI R24,0xF8
00E5 3288 CPI R24,0x28
00E6 F021 BEQ 0x00EB
(0110) error(TWSR);
00E7 B101 IN R16,0x01
00E8 DF62 RCALL _error
(0111) return 0;
00E9 2700 CLR R16
00EA C02F RJMP 0x011A
(0112) }
(0113)
(0114) /*start 启动*/
(0115) TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
00EB EA84 LDI R24,0xA4
00EC BF86 OUT 0x36,R24
(0116) while (!(TWCR & (1 << TWINT)));
00ED B626 IN R2,0x36
00EE FE27 SBRS R2,7
00EF CFFD RJMP 0x00ED
(0117) if ((TWSR & 0xF8) != 0x10) {
00F0 B181 IN R24,0x01
00F1 7F88 ANDI R24,0xF8
00F2 3180 CPI R24,0x10
00F3 F021 BEQ 0x00F8
(0118) error(TWSR);
00F4 B101 IN R16,0x01
00F5 DF55 RCALL _error
(0119) return 0;
00F6 2700 CLR R16
00F7 C022 RJMP 0x011A
(0120) }
(0121)
(0122) /*SLA_R 芯片地址*/
(0123) TWDR = 0xA1;
00F8 EA81 LDI R24,0xA1
00F9 B983 OUT 0x03,R24
(0124) TWCR = (1 << TWINT) | (1 << TWEN);
00FA E884 LDI R24,0x84
00FB BF86 OUT 0x36,R24
(0125) while (!(TWCR & (1 << TWINT)));
00FC B626 IN R2,0x36
00FD FE27 SBRS R2,7
00FE CFFD RJMP 0x00FC
(0126) if ((TWSR & 0xF8) != 0x40) {
00FF B181 IN R24,0x01
0100 7F88 ANDI R24,0xF8
0101 3480 CPI R24,0x40
0102 F021 BEQ 0x0107
(0127) error(TWSR);
0103 B101 IN R16,0x01
0104 DF46 RCALL _error
(0128) return 0;
0105 2700 CLR R16
0106 C013 RJMP 0x011A
(0129) }
(0130)
(0131) /*读取数据*/
(0132) TWCR = (1 << TWINT) | (1 << TWEN);
0107 E884 LDI R24,0x84
0108 BF86 OUT 0x36,R24
(0133) while (!(TWCR & (1 << TWINT)));
0109 B626 IN R2,0x36
010A FE27 SBRS R2,7
010B CFFD RJMP 0x0109
(0134) if ((TWSR & 0xF8) != 0x58) {
010C B181 IN R24,0x01
010D 7F88 ANDI R24,0xF8
010E 3588 CPI R24,0x58
010F F021 BEQ 0x0114
(0135) error(TWSR);
0110 B101 IN R16,0x01
0111 DF39 RCALL _error
(0136) return 0;
0112 2700 CLR R16
0113 C006 RJMP 0x011A
(0137) }
(0138) *dd = TWDR;
0114 B023 IN R2,0x03
0115 01FA MOVW R30,R20
0116 8220 STD Z+0,R2
(0139)
(0140) /*stop 停止*/
(0141) TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
0117 E984 LDI R24,0x94
0118 BF86 OUT 0x36,R24
(0142) return 1;
0119 E001 LDI R16,1
011A 940E014A CALL pop_gset2
011C 9508 RET
_delay_ms:
a --> R20
b --> R22
i --> R16
011D 940E0153 CALL push_gset2
FILE: E:\ICCAVR\project\AVRMEG~2\icc\013-IIC-LED\main.c
(0001) /*
(0002) 实验十三:
(0003)
(0004) AVR单片机I2C总线实验。
(0005) 1、用24C02记录CPU启动次数,并在PB口上显示出来。
(0006) 2、内部1 M晶振,程序采用单任务方式,软件延时。
(0007) 3、进行此实验请插上JP1的所有8个短路块,JP7(LED_EN)/PC0/PC1短路块。
(0008) 4、通过此实验,可以I2C总线操作有个初步认识。
(0009)
(0010) AVR mega16学习板
(0011) www.iccavr.com
(0012) 14:42 2007-4-9
(0013) */
(0014)
(0015) #include "iom16v.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 = 1; a < i; a++) {
011F E041 LDI R20,1
0120 C006 RJMP 0x0127
(0025) for (b = 1; b; b++) {
0121 E061 LDI R22,1
0122 C001 RJMP 0x0124
0123 9563 INC R22
0124 2366 TST R22
0125 F7E9 BNE 0x0123
0126 9543 INC R20
0127 1740 CP R20,R16
0128 F3C0 BCS 0x0121
0129 940E014A CALL pop_gset2
012B 9508 RET
_main:
temp --> Y+0
012C 9721 SBIW R28,1
(0026) ;
(0027) }
(0028) }
(0029) }
(0030)
(0031) void main(void) {
(0032)
(0033) unsigned char temp;
(0034)
(0035) PORTA = 0xFF; /*打开上拉*/
012D EF8F LDI R24,0xFF
012E BB8B OUT 0x1B,R24
(0036) DDRA = 0x00; /*方向输入*/
012F 2422 CLR R2
0130 BA2A OUT 0x1A,R2
(0037) PORTB = 0xF0; /*电平设置*/
0131 EF80 LDI R24,0xF0
0132 BB88 OUT 0x18,R24
(0038) DDRB = 0xFF; /*方向输出*/
0133 EF8F LDI R24,0xFF
0134 BB87 OUT 0x17,R24
(0039) PORTC = 0xFF;
0135 BB85 OUT 0x15,R24
(0040) DDRC = 0x00;
0136 BA24 OUT 0x14,R2
(0041) PORTD = 0xFF;
0137 BB82 OUT 0x12,R24
(0042) DDRD = 0x00;
0138 BA21 OUT 0x11,R2
(0043)
(0044) twi_read(0x08, &temp);
0139 019E MOVW R18,R28
013A E008 LDI R16,0x8
013B 940E00BB CALL _twi_read
(0045) PORTB = ~temp;
013D 8028 LDD R2,Y+0
013E 9420 COM R2
013F BA28 OUT 0x18,R2
(0046) temp ++;
0140 8188 LDD R24,Y+0
0141 5F8F SUBI R24,0xFF
0142 8388 STD Y+0,R24
(0047) twi_write(0x08, temp);
0143 2F28 MOV R18,R24
0144 E008 LDI R16,0x8
0145 940E0077 CALL _twi_write
(0048)
(0049) while (1) {
FILE: <library>
0147 CFFF RJMP 0x0147
0148 9621 ADIW R28,1
0149 9508 RET
pop_gset2:
014A E0E2 LDI R30,2
014B 940C0159 JMP pop
push_gset5:
014D 92FA ST R15,-Y
014E 92EA ST R14,-Y
push_gset4:
014F 92DA ST R13,-Y
0150 92CA ST R12,-Y
push_gset3:
0151 92BA ST R11,-Y
0152 92AA ST R10,-Y
push_gset2:
0153 937A ST R23,-Y
0154 936A ST R22,-Y
push_gset1:
0155 935A ST R21,-Y
0156 934A ST R20,-Y
0157 9508 RET
pop_gset1:
0158 E0E1 LDI R30,1
pop:
0159 9149 LD R20,Y+
015A 9159 LD R21,Y+
015B FDE0 SBRC R30,0
015C 9508 RET
015D 9169 LD R22,Y+
015E 9179 LD R23,Y+
015F FDE1 SBRC R30,1
0160 9508 RET
0161 90A9 LD R10,Y+
0162 90B9 LD R11,Y+
0163 FDE2 SBRC R30,2
0164 9508 RET
0165 90C9 LD R12,Y+
0166 90D9 LD R13,Y+
0167 FDE3 SBRC R30,3
0168 9508 RET
0169 90E9 LD R14,Y+
016A 90F9 LD R15,Y+
016B 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -