📄 eeprom读写演示程序.lst
字号:
n --> R22
ad --> R10
p --> R20
05D3 940E06A1 CALL push_gset4
05D5 0159 MOVW R10,R18
05D6 01A8 MOVW R20,R16
05D7 8568 LDD R22,Y+8
(0167)
(0168) }
(0169) //向24Cxx写入数据wt24c_h()所要调用的函数
(0170) //返回写入n个字节后的主机内存指针
(0171)
(0172) uchar * wt24c_fc(uchar *p, uint ad, uchar n)
(0173) {
(0174) uchar t=0;
05D8 24CC CLR R12
(0175) #if e2prom<32
(0176) t=ad>>8;
(0177) t<<=1;
(0178) #endif
(0179) i2cstart(); //发送起始信号
05D9 D020 RCALL _i2cstart
(0180) if(i2cwt(W_ADD_COM+t)==SLAW)//发送SLA_W, 写字节命令及器件地址
05DA 2D0C MOV R16,R12
05DB 5600 SUBI R16,0x60
05DC D023 RCALL _i2cwt
05DD 3108 CPI R16,0x18
05DE F489 BNE 0x05F0
(0181) {
(0182) #if e2prom>=32
(0183) i2cwt(ad>>8); //ad_dst的高位到器件
05DF 0185 MOVW R16,R10
05E0 2F01 MOV R16,R17
05E1 2711 CLR R17
05E2 D01D RCALL _i2cwt
(0184) #endif
(0185) i2cwt(ad); //ad_dst的低位到器件
05E3 2D0A MOV R16,R10
05E4 D01B RCALL _i2cwt
(0186)
(0187) for(;n>0;n--) //发送要写入的数据
05E5 C006 RJMP 0x05EC
(0188) { i2cwt(*p);
05E6 01FA MOVW R30,R20
05E7 8100 LDD R16,Z+0
05E8 D017 RCALL _i2cwt
(0189) p++;
05E9 5F4F SUBI R20,0xFF
05EA 4F5F SBCI R21,0xFF
05EB 956A DEC R22
05EC 2422 CLR R2
05ED 1626 CP R2,R22
05EE F3B8 BCS 0x05E6
(0190) }
(0191) }
05EF C003 RJMP 0x05F3
(0192) else syserr=ERR_SLAW; //写字节命令及器件地址错
05F0 E08A LDI R24,0xA
05F1 938000AE STS syserr,R24
(0193)
(0194) i2cstop();
05F3 D01D RCALL _i2cstop
(0195) delay_EEPROM(10); //延时6ms
05F4 E00A LDI R16,0xA
05F5 DF14 RCALL _delay_EEPROM
(0196)
(0197) return(p);
05F6 018A MOVW R16,R20
05F7 940E0699 CALL pop_gset4
05F9 9508 RET
(0198) }
(0199)
(0200)
(0201)
(0202) //-------------------------------以下为其它I2总线器件可调用的函数--------------------------
(0203)
(0204) //总线上起动开始条件
(0205) void i2cstart(void)
(0206) {
(0207) TWCR= BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
_i2cstart:
05FA EA84 LDI R24,0xA4
05FB BF86 OUT 0x36,R24
(0208) while (!(TWCR & BIT(TWINT)));
05FC B626 IN R2,0x36
05FD FE27 SBRS R2,7
05FE CFFD RJMP 0x05FC
05FF 9508 RET
(0209) }
(0210)
(0211) //把一个字节数据输入器件, 返回TWI状态
(0212) uchar i2cwt(uchar a)
(0213) {
(0214) TWDR = a;
_i2cwt:
a --> R16
0600 B903 OUT 0x03,R16
(0215) TWCR = BIT(TWINT) | BIT(TWEN);
0601 E884 LDI R24,0x84
0602 BF86 OUT 0x36,R24
(0216) while (!(TWCR & BIT(TWINT)));
0603 B626 IN R2,0x36
0604 FE27 SBRS R2,7
0605 CFFD RJMP 0x0603
(0217) _NOP();
0606 0000 NOP
(0218) return(TWSR&0b11111000);
0607 B101 IN R16,0x01
0608 7F08 ANDI R16,0xF8
0609 9508 RET
(0219) }
(0220)
(0221) //i2c读要调用的函数
(0222) //从器件读出一个字节
(0223) uchar i2crd(void)
(0224) {
(0225) TWCR= BIT(TWINT) | BIT(TWEA) | BIT(TWEN);
_i2crd:
060A EC84 LDI R24,0xC4
060B BF86 OUT 0x36,R24
(0226) while (!(TWCR & BIT(TWINT)));
060C B626 IN R2,0x36
060D FE27 SBRS R2,7
060E CFFD RJMP 0x060C
(0227) return(TWDR);
060F B103 IN R16,0x03
0610 9508 RET
(0228)
(0229) }
(0230)
(0231)
(0232) //总线上起动停止条件
(0233) void i2cstop(void)
(0234) {
(0235) TWCR = BIT(TWINT) | BIT(TWSTO) | BIT(TWEN);
FILE: <library>
_i2cstop:
0611 E984 LDI R24,0x94
0612 BF86 OUT 0x36,R24
0613 9508 RET
push_arg4:
0614 933A ST R19,-Y
0615 932A ST R18,-Y
push_arg2:
0616 931A ST R17,-Y
0617 930A ST R16,-Y
0618 9508 RET
mod16s:
0619 9468 BSET 6
061A 92DA ST R13,-Y
061B 2ED1 MOV R13,R17
061C C004 RJMP 0x0621
div16s:
061D 94E8 BCLR 6
061E 92DA ST R13,-Y
061F 2ED1 MOV R13,R17
0620 26D3 EOR R13,R19
0621 FF17 SBRS R17,7
0622 C004 RJMP 0x0627
0623 9510 COM R17
0624 9500 COM R16
0625 5F0F SUBI R16,0xFF
0626 4F1F SBCI R17,0xFF
0627 FF37 SBRS R19,7
0628 C004 RJMP 0x062D
0629 9530 COM R19
062A 9520 COM R18
062B 5F2F SUBI R18,0xFF
062C 4F3F SBCI R19,0xFF
062D 940E063A CALL xdiv16u
062F FED7 SBRS R13,7
0630 C004 RJMP 0x0635
0631 9510 COM R17
0632 9500 COM R16
0633 5F0F SUBI R16,0xFF
0634 4F1F SBCI R17,0xFF
0635 90D9 LD R13,Y+
0636 9508 RET
mod16u:
0637 9468 BSET 6
0638 C001 RJMP xdiv16u
div16u:
0639 94E8 BCLR 6
xdiv16u:
063A 92EA ST R14,-Y
063B 92FA ST R15,-Y
063C 938A ST R24,-Y
063D 24EE CLR R14
063E 24FF CLR R15
063F E180 LDI R24,0x10
0640 0F00 LSL R16
0641 1F11 ROL R17
0642 1CEE ROL R14
0643 1CFF ROL R15
0644 16E2 CP R14,R18
0645 06F3 CPC R15,R19
0646 F018 BCS 0x064A
0647 1AE2 SUB R14,R18
0648 0AF3 SBC R15,R19
0649 9503 INC R16
064A 958A DEC R24
064B F7A1 BNE 0x0640
064C F416 BRTC 0x064F
064D 2D0E MOV R16,R14
064E 2D1F MOV R17,R15
064F 9189 LD R24,Y+
0650 90F9 LD R15,Y+
0651 90E9 LD R14,Y+
0652 9508 RET
empy16s:
0653 920A ST R0,-Y
0654 921A ST R1,-Y
0655 938A ST R24,-Y
0656 939A ST R25,-Y
0657 9F02 MUL R16,R18
0658 01C0 MOVW R24,R0
0659 9F12 MUL R17,R18
065A 0D90 ADD R25,R0
065B 9F03 MUL R16,R19
065C 0D90 ADD R25,R0
065D 018C MOVW R16,R24
065E 9199 LD R25,Y+
065F 9189 LD R24,Y+
0660 9019 LD R1,Y+
0661 9009 LD R0,Y+
0662 9508 RET
empy32s:
empy32u:
0663 940E06BE CALL long_prolog
0665 927F PUSH R7
0666 940E06D7 CALL tstzero1
0668 F139 BEQ 0x0690
0669 2477 CLR R7
066A 940E06DD CALL tstzero2
066C F419 BNE 0x0670
066D 018C MOVW R16,R24
066E 019D MOVW R18,R26
066F C020 RJMP 0x0690
0670 9F08 MUL R16,R24
0671 2CB0 MOV R11,R0
0672 2CA1 MOV R10,R1
0673 9F28 MUL R18,R24
0674 2C90 MOV R9,R0
0675 2C81 MOV R8,R1
0676 9F18 MUL R17,R24
0677 0CA0 ADD R10,R0
0678 1C91 ADC R9,R1
0679 1C87 ADC R8,R7
067A 9F09 MUL R16,R25
067B 0CA0 ADD R10,R0
067C 1C91 ADC R9,R1
067D 1C87 ADC R8,R7
067E 9F19 MUL R17,R25
067F 0C90 ADD R9,R0
0680 1C81 ADC R8,R1
0681 9F0A MUL R16,R26
0682 0C90 ADD R9,R0
0683 1C81 ADC R8,R1
0684 9F38 MUL R19,R24
0685 0C80 ADD R8,R0
0686 9F29 MUL R18,R25
0687 0C80 ADD R8,R0
0688 9F1A MUL R17,R26
0689 0C80 ADD R8,R0
068A 9F0B MUL R16,R27
068B 0C80 ADD R8,R0
068C 2D0B MOV R16,R11
068D 2D1A MOV R17,R10
068E 2D29 MOV R18,R9
068F 2D38 MOV R19,R8
0690 907F POP R7
0691 940C06CC JMP long_epilog
pop_gset2:
0693 E0E2 LDI R30,2
0694 940C06AB JMP pop
pop_gset3:
0696 E0E4 LDI R30,4
0697 940C06AB JMP pop
pop_gset4:
0699 E0E8 LDI R30,0x8
069A 940C06AB JMP pop
pop_gset5:
069C 27EE CLR R30
069D 940C06AB JMP pop
push_gset5:
069F 92FA ST R15,-Y
06A0 92EA ST R14,-Y
push_gset4:
06A1 92DA ST R13,-Y
06A2 92CA ST R12,-Y
push_gset3:
06A3 92BA ST R11,-Y
06A4 92AA ST R10,-Y
push_gset2:
06A5 937A ST R23,-Y
06A6 936A ST R22,-Y
push_gset1:
06A7 935A ST R21,-Y
06A8 934A ST R20,-Y
06A9 9508 RET
pop_gset1:
06AA E0E1 LDI R30,1
pop:
06AB 9149 LD R20,Y+
06AC 9159 LD R21,Y+
06AD FDE0 SBRC R30,0
06AE 9508 RET
06AF 9169 LD R22,Y+
06B0 9179 LD R23,Y+
06B1 FDE1 SBRC R30,1
06B2 9508 RET
06B3 90A9 LD R10,Y+
06B4 90B9 LD R11,Y+
06B5 FDE2 SBRC R30,2
06B6 9508 RET
06B7 90C9 LD R12,Y+
06B8 90D9 LD R13,Y+
06B9 FDE3 SBRC R30,3
06BA 9508 RET
06BB 90E9 LD R14,Y+
06BC 90F9 LD R15,Y+
06BD 9508 RET
long_prolog:
06BE 928A ST R8,-Y
06BF 929A ST R9,-Y
06C0 92AA ST R10,-Y
06C1 92BA ST R11,-Y
06C2 93EA ST R30,-Y
06C3 938A ST R24,-Y
06C4 939A ST R25,-Y
06C5 93AA ST R26,-Y
06C6 93BA ST R27,-Y
06C7 8589 LDD R24,Y+9
06C8 859A LDD R25,Y+10
06C9 85AB LDD R26,Y+11
06CA 85BC LDD R27,Y+12
06CB 9508 RET
long_epilog:
06CC 91B9 LD R27,Y+
06CD 91A9 LD R26,Y+
06CE 9199 LD R25,Y+
06CF 9189 LD R24,Y+
06D0 91E9 LD R30,Y+
06D1 90B9 LD R11,Y+
06D2 90A9 LD R10,Y+
06D3 9099 LD R9,Y+
06D4 9089 LD R8,Y+
06D5 9624 ADIW R28,4
06D6 9508 RET
tstzero1:
06D7 27EE CLR R30
06D8 2BE0 OR R30,R16
06D9 2BE1 OR R30,R17
06DA 2BE2 OR R30,R18
06DB 2BE3 OR R30,R19
06DC 9508 RET
tstzero2:
06DD 27EE CLR R30
06DE 2BE8 OR R30,R24
06DF 2BE9 OR R30,R25
06E0 2BEA OR R30,R26
06E1 2BEB OR R30,R27
06E2 9508 RET
lsr16:
06E3 2322 TST R18
06E4 F021 BEQ 0x06E9
06E5 9516 LSR R17
06E6 9507 ROR R16
06E7 952A DEC R18
06E8 CFFA RJMP lsr16
06E9 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -