📄 avrstudy.lst
字号:
(0060) #define SIZE 0x7fff
(0061) #elif e2prom==512
(0062) #define PAGE_SIZE 128
(0063) #define SIZE 0xffff
(0064) #endif//========读取一个字节============
(0065) uchar Readbyte(void)
(0066) {
(0067) TWCR=BIT(TWINT)|BIT(TWEA)|BIT(TWEN);
_Readbyte:
0483 EC84 LDI R24,0xC4
0484 BF86 OUT 0x36,R24
(0068) while(!(TWCR&(1<<TWINT)));
0485 B626 IN R2,0x36
0486 FE27 SBRS R2,7
0487 CFFD RJMP 0x0485
(0069) return(TWDR);
0488 B103 IN R16,0x03
0489 9508 RET
(0070) }
(0071) //==========TWI初始化==========
(0072) void twi_init()
(0073) {
(0074) TWBR=0X20; //设置波特率
_twi_init:
048A E280 LDI R24,0x20
048B B980 OUT 0x00,R24
(0075) TWSR=0; //设置波特率预分频
048C 2422 CLR R2
048D B821 OUT 0x01,R2
(0076) TWCR=0X44; //初始化TWI控制寄存器
048E E484 LDI R24,0x44
048F BF86 OUT 0x36,R24
0490 9508 RET
_twi_writeBtye:
rdata --> R20
dataddr --> R22
0491 D67D RCALL push_gset2
0492 2F42 MOV R20,R18
0493 01B8 MOVW R22,R16
(0077) }
(0078) //=========写一个字节数据=============
(0079) uchar twi_writeBtye(uint dataddr,uchar rdata)//存储地址,数据
(0080) {
(0081) Start(); //启动IIC
0494 EA84 LDI R24,0xA4
0495 BF86 OUT 0x36,R24
(0082) Wait(); //等待操作完成
0496 B626 IN R2,0x36
0497 FE27 SBRS R2,7
0498 CFFD RJMP 0x0496
(0083) if(TestACK()!=START){return 0;}
0499 B181 IN R24,0x01
049A 7F88 ANDI R24,0xF8
049B 3088 CPI R24,0x8
049C F011 BEQ 0x049F
049D 2700 CLR R16
049E C03B RJMP 0x04DA
(0084) Writebyte(W_ADD_COM); //写器件地址
049F EA80 LDI R24,0xA0
04A0 B983 OUT 0x03,R24
04A1 E884 LDI R24,0x84
04A2 BF86 OUT 0x36,R24
(0085) Wait(); //等待操作完成
04A3 B626 IN R2,0x36
04A4 FE27 SBRS R2,7
04A5 CFFD RJMP 0x04A3
(0086) if(TestACK()!=MT_SLA_ACK){return 0;}
04A6 B181 IN R24,0x01
04A7 7F88 ANDI R24,0xF8
04A8 3188 CPI R24,0x18
04A9 F011 BEQ 0x04AC
04AA 2700 CLR R16
04AB C02E RJMP 0x04DA
(0087) Writebyte(((dataddr&0xff00)>>8)); //写数据存储地址高八位
04AC 01CB MOVW R24,R22
04AD 7080 ANDI R24,0
04AE 2F89 MOV R24,R25
04AF 2799 CLR R25
04B0 B983 OUT 0x03,R24
04B1 E884 LDI R24,0x84
04B2 BF86 OUT 0x36,R24
(0088) Wait(); //等待操作完成
04B3 B626 IN R2,0x36
04B4 FE27 SBRS R2,7
04B5 CFFD RJMP 0x04B3
(0089) if(TestACK()!=MT_DATA_ACK){return 0;}
04B6 B181 IN R24,0x01
04B7 7F88 ANDI R24,0xF8
04B8 3288 CPI R24,0x28
04B9 F011 BEQ 0x04BC
04BA 2700 CLR R16
04BB C01E RJMP 0x04DA
(0090) Writebyte(dataddr); //写数据存储地址低八位
04BC B963 OUT 0x03,R22
04BD E884 LDI R24,0x84
04BE BF86 OUT 0x36,R24
(0091) Wait(); //等待操作完成
04BF B626 IN R2,0x36
04C0 FE27 SBRS R2,7
04C1 CFFD RJMP 0x04BF
(0092) if(TestACK()!=MT_DATA_ACK){return 0;}
04C2 B181 IN R24,0x01
04C3 7F88 ANDI R24,0xF8
04C4 3288 CPI R24,0x28
04C5 F011 BEQ 0x04C8
04C6 2700 CLR R16
04C7 C012 RJMP 0x04DA
(0093) Writebyte(rdata); //写一字节数据
04C8 B943 OUT 0x03,R20
04C9 E884 LDI R24,0x84
04CA BF86 OUT 0x36,R24
(0094) Wait(); //等待操作完成
04CB B626 IN R2,0x36
04CC FE27 SBRS R2,7
04CD CFFD RJMP 0x04CB
(0095) if(TestACK()!=MT_DATA_ACK){return 0;}
04CE B181 IN R24,0x01
04CF 7F88 ANDI R24,0xF8
04D0 3288 CPI R24,0x28
04D1 F011 BEQ 0x04D4
04D2 2700 CLR R16
04D3 C006 RJMP 0x04DA
(0096) Stop(); //停止
04D4 E984 LDI R24,0x94
04D5 BF86 OUT 0x36,R24
(0097) delay(10);
04D6 E00A LDI R16,0xA
04D7 E010 LDI R17,0
04D8 D3B7 RCALL _delay
(0098) return 1;
04D9 E001 LDI R16,1
04DA D626 RCALL pop_gset2
04DB 9508 RET
_twi_writeNBtye:
i --> R20
j --> R14
n --> R10
rdata --> R12
dataddr --> R22
04DC D62C RCALL push_gset5
04DD 0169 MOVW R12,R18
04DE 01B8 MOVW R22,R16
04DF 84AA LDD R10,Y+10
04E0 84BB LDD R11,Y+11
(0099) }
(0100) //=========写N个字节数据=============
(0101) uchar twi_writeNBtye(uint dataddr,uchar rdata[],uint n)//存储地址,数据,数据个数
(0102) {
(0103) uchar i,j;
(0104) for(i=0;i<(n/PAGE_SIZE+1);i++) //page_spase
04E1 2744 CLR R20
04E2 C083 RJMP 0x0566
(0105) {
(0106) Start(); //启动IIC
04E3 EA84 LDI R24,0xA4
04E4 BF86 OUT 0x36,R24
(0107) Wait(); //等待操作完成
04E5 B626 IN R2,0x36
04E6 FE27 SBRS R2,7
04E7 CFFD RJMP 0x04E5
(0108) if(TestACK()!=START){return 0;}
04E8 B181 IN R24,0x01
04E9 7F88 ANDI R24,0xF8
04EA 3088 CPI R24,0x8
04EB F011 BEQ 0x04EE
04EC 2700 CLR R16
04ED C085 RJMP 0x0573
(0109) Writebyte(W_ADD_COM); //写器件地址
04EE EA80 LDI R24,0xA0
04EF B983 OUT 0x03,R24
04F0 E884 LDI R24,0x84
04F1 BF86 OUT 0x36,R24
(0110) Wait(); //等待操作完成
04F2 B626 IN R2,0x36
04F3 FE27 SBRS R2,7
04F4 CFFD RJMP 0x04F2
(0111) if(TestACK()!=MT_SLA_ACK){return 0;}
04F5 B181 IN R24,0x01
04F6 7F88 ANDI R24,0xF8
04F7 3188 CPI R24,0x18
04F8 F011 BEQ 0x04FB
04F9 2700 CLR R16
04FA C078 RJMP 0x0573
(0112) #if e2prom>=32
(0113) Writebyte(((dataddr&0xff00)>>8));//写数据存储地址高八位
04FB 01CB MOVW R24,R22
04FC 7080 ANDI R24,0
04FD 2F89 MOV R24,R25
04FE 2799 CLR R25
04FF B983 OUT 0x03,R24
0500 E884 LDI R24,0x84
0501 BF86 OUT 0x36,R24
(0114) Wait(); //等待操作完成
0502 B626 IN R2,0x36
0503 FE27 SBRS R2,7
0504 CFFD RJMP 0x0502
(0115) if(TestACK()!=MT_DATA_ACK){return 0;}
0505 B181 IN R24,0x01
0506 7F88 ANDI R24,0xF8
0507 3288 CPI R24,0x28
0508 F011 BEQ 0x050B
0509 2700 CLR R16
050A C068 RJMP 0x0573
(0116) #endif
(0117) Writebyte(dataddr); //写数据存储地址低八位
050B B963 OUT 0x03,R22
050C E884 LDI R24,0x84
050D BF86 OUT 0x36,R24
(0118) Wait(); //等待操作完成
050E B626 IN R2,0x36
050F FE27 SBRS R2,7
0510 CFFD RJMP 0x050E
(0119) if(TestACK()!=MT_DATA_ACK){return 0;}
0511 B181 IN R24,0x01
0512 7F88 ANDI R24,0xF8
0513 3288 CPI R24,0x28
0514 F011 BEQ 0x0517
0515 2700 CLR R16
0516 C05C RJMP 0x0573
(0120) if((n-PAGE_SIZE*i)>PAGE_SIZE)
0517 E480 LDI R24,0x40
0518 9F84 MUL R24,R20
0519 0115 MOVW R2,R10
051A 1820 SUB R2,R0
051B 0831 SBC R3,R1
051C 2799 CLR R25
051D 1582 CP R24,R2
051E 0593 CPC R25,R3
051F F4E8 BCC 0x053D
(0121) {
(0122) for(j=0;j<PAGE_SIZE;j++)
0520 24EE CLR R14
0521 C017 RJMP 0x0539
(0123) {
(0124) Writebyte(rdata[(i*PAGE_SIZE)+j]);//写一字节数据
0522 E480 LDI R24,0x40
0523 9F84 MUL R24,R20
0524 01F0 MOVW R30,R0
0525 2C2E MOV R2,R14
0526 2433 CLR R3
0527 0DE2 ADD R30,R2
0528 1DF3 ADC R31,R3
0529 0DEC ADD R30,R12
052A 1DFD ADC R31,R13
052B 8020 LDD R2,Z+0
052C B823 OUT 0x03,R2
052D E884 LDI R24,0x84
052E BF86 OUT 0x36,R24
(0125) Wait(); //等待操作完成
052F B626 IN R2,0x36
0530 FE27 SBRS R2,7
0531 CFFD RJMP 0x052F
(0126) if(TestACK()!=MT_DATA_ACK){return 0;}
0532 B181 IN R24,0x01
0533 7F88 ANDI R24,0xF8
0534 3288 CPI R24,0x28
0535 F011 BEQ 0x0538
0536 2700 CLR R16
0537 C03B RJMP 0x0573
0538 94E3 INC R14
0539 2D8E MOV R24,R14
053A 3480 CPI R24,0x40
053B F330 BCS 0x0522
(0127) }
(0128) }
053C C021 RJMP 0x055E
(0129) else
(0130) {
(0131) for(j=0;j<(n%PAGE_SIZE);j++)
053D 24EE CLR R14
053E C017 RJMP 0x0556
(0132) {
(0133) Writebyte(rdata[(i*PAGE_SIZE)+j]);//写一字节数据
053F E480 LDI R24,0x40
0540 9F84 MUL R24,R20
0541 01F0 MOVW R30,R0
0542 2C2E MOV R2,R14
0543 2433 CLR R3
0544 0DE2 ADD R30,R2
0545 1DF3 ADC R31,R3
0546 0DEC ADD R30,R12
0547 1DFD ADC R31,R13
0548 8020 LDD R2,Z+0
0549 B823 OUT 0x03,R2
054A E884 LDI R24,0x84
054B BF86 OUT 0x36,R24
(0134) Wait(); //等待操作完成
054C B626 IN R2,0x36
054D FE27 SBRS R2,7
054E CFFD RJMP 0x054C
(0135) if(TestACK()!=MT_DATA_ACK){return 0;}
054F B181 IN R24,0x01
0550 7F88 ANDI R24,0xF8
0551 3288 CPI R24,0x28
0552 F011 BEQ 0x0555
0553 2700 CLR R16
0554 C01E RJMP 0x0573
0555 94E3 INC R14
0556 01C5 MOVW R24,R10
0557 738F ANDI R24,0x3F
0558 7090 ANDI R25,0
0559 2C2E MOV R2,R14
055A 2433 CLR R3
055B 1628 CP R2,R24
055C 0639 CPC R3,R25
055D F308 BCS 0x053F
(0136) }
(0137) }
(0138) dataddr=dataddr+PAGE_SIZE;
055E 5C60 SUBI R22,0xC0
055F 4F7F SBCI R23,0xFF
(0139) Stop(); //停止
0560 E984 LDI R24,0x94
0561 BF86 OUT 0x36,R24
(0140) delay(10);
0562 E00A LDI R16,0xA
0563 E010 LDI R17,0
0564 D32B RCALL _delay
0565 9543 INC R20
0566 E026 LDI R18,6
0567 E030 LDI R19,0
0568 0185 MOVW R16,R10
0569 D609 RCALL lsr16
056A 01C8 MOVW R24,R16
056B 9601 ADIW R24,1
056C 2E24 MOV R2,R20
056D 2433 CLR R3
056E 1628 CP R2,R24
056F 0639 CPC R3,R25
0570 F408 BCC 0x0572
0571 CF71 RJMP 0x04E3
(0141) }
(0142) return 1;
0572 E001 LDI R16,1
0573 D593 RCALL pop_gset5
0574 9508 RET
_twi_readBtye:
temp --> R20
dataddr --> R20
0575 D59B RCALL push_gset1
0576 01A8 MOVW R20,R16
(0143) }
(0144) //==========读一个字节数据=============
(0145) uchar twi_readBtye(uint dataddr) //存储地址
(0146) {
(0147) uint temp;
(0148) Start();
0577 EA84 LDI R24,0xA4
0578 BF86 OUT 0x36,R24
(0149) Wait(); //等待操作完成
0579 B626 IN R2,0x36
057A FE27 SBRS R2,7
057B CFFD RJMP 0x0579
(0150) if(TestACK()!=START){return 0;}
057C B181 IN R24,0x01
057D 7F88 ANDI R24,0xF8
057E 3088 CPI R24,0x8
057F F011 BEQ 0x0582
0580 2700 CLR R16
0581 C057 RJMP 0x05D9
(0151) Writebyte(W_ADD_COM); //写器件地址
0582 EA80 LDI R24,0xA0
0583 B983 OUT 0x03,R24
0584 E884 LDI R24,0x84
0585 BF86 OUT 0x36,R24
(0152) Wait(); //等待操作完成
0586 B626 IN R2,0x36
0587 FE27 SBRS R2,7
0588 CFFD RJMP 0x0586
(0153) if
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -