📄 m8iap.lst
字号:
(0004) #ifdef _ATMEGA32
(0005) UBRRL = 11; // 19200bps @ 3.69 MHz
(0006) UCSRB = (1<<RXEN) | (1<<TXEN); // Enable recieve and transmit UART1
(0007) #endif
(0008)
(0009) #ifdef _ATMEGA161
(0010) UCSR0B = 0x00; //disable while setting baud rate
(0011) UCSR0A = 0x00; //disable while setting baud rate
(0012) UBRR0 = 0x0B; //set baud rate
(0013) UBRRHI = 0x00;
(0014) UCSR0A = 0x00; //enable
(0015) UCSR0B = 0x18; //enable#endif
(0016) #endif
(0017) #ifdef _ATMEGA163
(0018) UBRRL = 11; // 19200bps @ 3.69 MHz
(0019) UCSRB = (1<<RXEN) | (1<<TXEN); // Enable recieve and transmit
(0020) #endif
(0021) #ifdef _ATMEGA8
(0022) UCSRB = 0x00; //disable while setting baud rate
_SerialInit:
0F23 2422 CLR R2
0F24 B82A OUT 0x0A,R2
(0023) UCSRA = 0x00;
0F25 B82B OUT 0x0B,R2
(0024) UCSRC = 0x86;
0F26 E886 LDI R24,0x86
0F27 BD80 OUT 0x20,R24
(0025) UBRRL = 0x0B; //set baud rate lo
0F28 E08B LDI R24,0xB
0F29 B989 OUT 0x09,R24
(0026) UBRRH = 0x00; //set baud rate hi
0F2A BC20 OUT 0x20,R2
(0027) UCSRB = 0xF8;
0F2B EF88 LDI R24,0xF8
0F2C B98A OUT 0x0A,R24
(0028) #endif
(0029)
(0030) }
0F2D 9508 RET
(0031) void sendchar(char c)
(0032) {
(0033) #ifdef _ATMEGA32
(0034) UDR=c;
(0035) while (!(UCSRA & (1<<TXC))); //wait until byte sendt
(0036) UCSRA |= (1<<TXC); //delete TXCflag
(0037) #endif
(0038) #ifdef _ATMEGA161
(0039) UDR0=c;
(0040) while (!(UCSR0A & (1<<TXC0))); //wait until byte sendt
(0041) UCSR0A |= (1<<TXC0); //delete TXCflag
(0042) #endif
(0043) #ifdef _ATMEGA163
(0044) UDR=c;
(0045) while (!(UCSRA & (1<<TXC))); //wait until byte sendt
(0046) UCSRA |= (1<<TXC); //delete TXCflag
(0047)
(0048) #endif
(0049) #ifdef _ATMEGA8
(0050) UDR=c;
_sendchar:
c --> R16
0F2E B90C OUT 0x0C,R16
(0051) while (!(UCSRA & (1<<TXC))); //wait until byte sendt
0F2F 9B5E SBIS 0x0B,6
0F30 CFFE RJMP 0x0F2F
(0052) UCSRA |= (1<<TXC); //delete TXCflag
0F31 9A5E SBI 0x0B,6
(0053)
(0054) #endif
(0055)
(0056) }
0F32 9508 RET
_sendstr:
s --> R20
0F33 D053 RCALL push_gset1
0F34 01A8 MOVW R20,R16
(0057) void sendstr(char *s)
(0058) {while(*s)
0F35 C005 RJMP 0x0F3B
(0059) {
(0060) sendchar(*s);
0F36 01FA MOVW R30,R20
0F37 8100 LDD R16,Z+0
0F38 DFF5 RCALL _sendchar
(0061) s++;
0F39 5F4F SUBI R20,0xFF
0F3A 4F5F SBCI R21,0xFF
0F3B 01FA MOVW R30,R20
0F3C 8020 LDD R2,Z+0
0F3D 2022 TST R2
0F3E F7B9 BNE 0x0F36
(0062) }
(0063) sendchar(0x0a);
0F3F E00A LDI R16,0xA
0F40 DFED RCALL _sendchar
(0064) //sendchar(0x0d);
(0065) }
0F41 D048 RCALL pop_gset1
0F42 9508 RET
(0066)
(0067) char recchar(void)
(0068)
(0069) {
(0070) unsigned char temp;
(0071) #ifdef _ATMEGA32
(0072) while(!(UCSRA & (1<<RXC))); // Wait for data to come
(0073) return UDR;
(0074) #endif
(0075) #ifdef _ATMEGA161
(0076) while(!(UCSR0A & (1<<RXC0))); // Wait for data to come
(0077) temp=UDR0;
(0078) return temp;
(0079) #endif
(0080) #ifdef _ATMEGA163
(0081) while(!(UCSRA & (1<<RXC))); // Wait for data to come
(0082) return UDR;
(0083) #endif
(0084)
(0085) #ifdef _ATMEGA8
(0086) while(!(UCSRA & (1<<RXC))) ;
_recchar:
temp --> R16
0F43 9B5F SBIS 0x0B,7
0F44 CFFE RJMP _recchar
(0087) temp=UDR;
0F45 B10C IN R16,0x0C
(0088) return temp;
0F46 9508 RET
(0089) #endif
(0090) }
(0091) char reccharcommand(void)
(0092) {unsigned int i;
(0093) unsigned char temp;
(0094) i=0;
_reccharcommand:
temp --> R16
i --> R18
0F47 2722 CLR R18
0F48 2733 CLR R19
0F49 C009 RJMP 0x0F53
(0095) #ifdef _ATMEGA32
(0096) while(!(UCSRA & (1<<RXC))); // Wait for data to come
(0097) return UDR;
(0098) #endif
(0099) #ifdef _ATMEGA161
(0100) while(!(UCSR0A & (1<<RXC0))); // Wait for data to come
(0101) temp=UDR0;
(0102) return temp;
(0103) #endif
(0104) #ifdef _ATMEGA163
(0105) while(!(UCSRA & (1<<RXC))); // Wait for data to come
(0106) return UDR;
(0107) #endif
(0108)
(0109) #ifdef _ATMEGA8
(0110) while(!(UCSRA & (1<<RXC)))
(0111) {i++;
0F4A 5F2F SUBI R18,0xFF
0F4B 4F3F SBCI R19,0xFF
(0112) if(i>6000)
0F4C E780 LDI R24,0x70
0F4D E197 LDI R25,0x17
0F4E 1782 CP R24,R18
0F4F 0793 CPC R25,R19
0F50 F410 BCC 0x0F53
(0113) return 0x00;}; // Wait for data to come
0F51 2700 CLR R16
0F52 C003 RJMP 0x0F56
0F53 9B5F SBIS 0x0B,7
0F54 CFF5 RJMP 0x0F4A
(0114) temp=UDR;
0F55 B10C IN R16,0x0C
(0115) return temp;
0F56 9508 RET
(0116) #endif
(0117) }
(0118)
(0119) char reccharcommand2(void)
(0120) {unsigned int i;
(0121) unsigned char temp;
(0122) i=0;
_reccharcommand2:
temp --> R16
i --> R18
0F57 2722 CLR R18
0F58 2733 CLR R19
0F59 C009 RJMP 0x0F63
(0123) #ifdef _ATMEGA32
(0124) while(!(UCSRA & (1<<RXC))); // Wait for data to come
(0125) return UDR;
(0126) #endif
(0127) #ifdef _ATMEGA161
(0128) while(!(UCSR0A & (1<<RXC0))); // Wait for data to come
(0129) temp=UDR0;
(0130) return temp;
(0131) #endif
(0132) #ifdef _ATMEGA163
(0133) while(!(UCSRA & (1<<RXC))); // Wait for data to come
(0134) return UDR;
(0135) #endif
(0136)
(0137) #ifdef _ATMEGA8
(0138) while(!(UCSRA & (1<<RXC)))
(0139) {i++;
0F5A 5F2F SUBI R18,0xFF
0F5B 4F3F SBCI R19,0xFF
(0140) if(i>50000)
0F5C E580 LDI R24,0x50
0F5D EC93 LDI R25,0xC3
0F5E 1782 CP R24,R18
0F5F 0793 CPC R25,R19
0F60 F410 BCC 0x0F63
(0141) return 0x00;}; // Wait for data to come
0F61 2700 CLR R16
0F62 C003 RJMP 0x0F66
0F63 9B5F SBIS 0x0B,7
0F64 CFF5 RJMP 0x0F5A
(0142) temp=UDR;
0F65 B10C IN R16,0x0C
(0143) return temp;
0F66 9508 RET
FILE: D:\AVR_Demo\M8IAP\Source\assembly.s
(0001) .text
(0002)
(0003) SPMCR = 0x37
(0004)
(0005) ; void write_page (unsigned int adr, unsigned char function);
(0006) _write_page::
(0007)
(0008) MOV R31,R17
_write_page:
0F67 2FF1 MOV R31,R17
(0009) MOV R30,R16 ;move adress to z pointer (R31=ZH R30=ZL)
0F68 2FE0 MOV R30,R16
(0010) OUT SPMCR,R18 ;argument 2 decides function
0F69 BF27 OUT 0x37,R18
(0011) SPM ;perform pagewrite
0F6A 95E8 SPM
0F6B FFFF SBRS R31,7
(0012) .dw $ffff
(0013) NOP
0F6C 0000 NOP
(0014) RET
0F6D 9508 RET
(0015)
(0016) ; void fill_temp_buffer (unsigned int data, unsigned int adr);
(0017) _fill_temp_buffer::
(0018)
(0019)
(0020) MOV R31,R19
_fill_temp_buffer:
0F6E 2FF3 MOV R31,R19
(0021) MOV R30,R18 ;move adress to z pointer (R31=ZH R30=ZL)
0F6F 2FE2 MOV R30,R18
(0022) MOV R1,R17
0F70 2E11 MOV R1,R17
(0023) MOV R0,R16 ;move data to reg 0 and 1
0F71 2E00 MOV R0,R16
(0024) LDI R18,0x01
0F72 E021 LDI R18,1
(0025) OUT SPMCR,R18
0F73 BF27 OUT 0x37,R18
(0026) SPM ;Store program memory
0F74 95E8 SPM
(0027) RET
0F75 9508 RET
(0028)
(0029) ;unsigned int read_program_memory (unsigned int adr ,unsigned char cmd);
(0030) _read_program_memory::
(0031)
(0032) MOV R31,R17 ;R31=ZH R30=ZL
_read_program_memory:
0F76 2FF1 MOV R31,R17
(0033) MOV R30,R16 ;move adress to z pointer
0F77 2FE0 MOV R30,R16
(0034) SBRC R18,0 ;read lockbits? (second argument=0x09)
0F78 FD20 SBRC R18,0
(0035) OUT SPMCR,R18 ;if so, place second argument in SPMEN register
0F79 BF27 OUT 0x37,R18
(0036) LPM ;read LSB
0F7A 95C8 LPM
(0037) MOV R16,R0
0F7B 2D00 MOV R16,R0
(0038) INC R30
0F7C 95E3 INC R30
(0039) LPM
0F7D 95C8 LPM
(0040) MOV R17,R0 ;read MSB (ignored when reading lockbits)
0F7E 2D10 MOV R17,R0
(0041) RET
0F7F 9508 RET
(0042)
(0043) ;void write_lock_bits (unsigned char val);
(0044) _write_lock_bits::
(0045)
(0046) MOV R0,R16
_write_lock_bits:
0F80 2E00 MOV R0,R16
(0047) LDI R17,0x09
0F81 E019 LDI R17,0x9
(0048) OUT SPMCR,R17
0F82 BF17 OUT 0x37,R17
(0049) SPM ;write lockbits
0F83 95E8 SPM
0F84 FFFF SBRS R31,7
(0050) .dw $ffff
(0051) NOP
0F85 0000 NOP
(0052) RET
FILE: <library>
0F86 9508 RET
push_gset1:
0F87 935A ST R21,-Y
0F88 934A ST R20,-Y
0F89 9508 RET
pop_gset1:
0F8A E0E1 LDI R30,1
pop:
0F8B 9149 LD R20,Y+
0F8C 9159 LD R21,Y+
0F8D FDE0 SBRC R30,0
0F8E 9508 RET
0F8F 9169 LD R22,Y+
0F90 9179 LD R23,Y+
0F91 FDE1 SBRC R30,1
0F92 9508 RET
0F93 90A9 LD R10,Y+
0F94 90B9 LD R11,Y+
0F95 FDE2 SBRC R30,2
0F96 9508 RET
0F97 90C9 LD R12,Y+
0F98 90D9 LD R13,Y+
0F99 FDE3 SBRC R30,3
0F9A 9508 RET
0F9B 90E9 LD R14,Y+
0F9C 90F9 LD R15,Y+
0F9D 9508 RET
push_lset:
0F9E 93FA ST R31,-Y
0F9F 93EA ST R30,-Y
0FA0 93BA ST R27,-Y
0FA1 93AA ST R26,-Y
0FA2 939A ST R25,-Y
0FA3 938A ST R24,-Y
0FA4 933A ST R19,-Y
0FA5 932A ST R18,-Y
0FA6 931A ST R17,-Y
0FA7 930A ST R16,-Y
0FA8 929A ST R9,-Y
0FA9 928A ST R8,-Y
0FAA 927A ST R7,-Y
0FAB 926A ST R6,-Y
0FAC 925A ST R5,-Y
0FAD 924A ST R4,-Y
0FAE 923A ST R3,-Y
0FAF 922A ST R2,-Y
0FB0 921A ST R1,-Y
0FB1 920A ST R0,-Y
0FB2 B60F IN R0,0x3F
0FB3 920A ST R0,-Y
0FB4 9508 RET
pop_lset:
0FB5 9009 LD R0,Y+
0FB6 BE0F OUT 0x3F,R0
0FB7 9009 LD R0,Y+
0FB8 9019 LD R1,Y+
0FB9 9029 LD R2,Y+
0FBA 9039 LD R3,Y+
0FBB 9049 LD R4,Y+
0FBC 9059 LD R5,Y+
0FBD 9069 LD R6,Y+
0FBE 9079 LD R7,Y+
0FBF 9089 LD R8,Y+
0FC0 9099 LD R9,Y+
0FC1 9109 LD R16,Y+
0FC2 9119 LD R17,Y+
0FC3 9129 LD R18,Y+
0FC4 9139 LD R19,Y+
0FC5 9189 LD R24,Y+
0FC6 9199 LD R25,Y+
0FC7 91A9 LD R26,Y+
0FC8 91B9 LD R27,Y+
0FC9 91E9 LD R30,Y+
0FCA 91F9 LD R31,Y+
0FCB 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -