⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m8iap.lst

📁 AVR系列被广泛应用的单片机MEGA8开发(原理图)及例程
💻 LST
📖 第 1 页 / 共 2 页
字号:
(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 + -