📄 lesson1.lst
字号:
__start:
__text_start:
0013 EDCF LDI R28,0xDF
0014 E0D0 LDI R29,0
0015 BFCD OUT 0x3D,R28
0016 BFDE OUT 0x3E,R29
0017 51C0 SUBI R28,0x10
0018 40D0 SBCI R29,0
0019 EA0A LDI R16,0xAA
001A 8308 STD Y+0,R16
001B 2400 CLR R0
001C E6E0 LDI R30,0x60
001D E0F0 LDI R31,0
001E E010 LDI R17,0
001F 36E0 CPI R30,0x60
0020 07F1 CPC R31,R17
0021 F011 BEQ 0x0024
0022 9201 ST R0,Z+
0023 CFFB RJMP 0x001F
0024 8300 STD Z+0,R16
0025 E2E6 LDI R30,0x26
0026 E0F0 LDI R31,0
0027 E6A0 LDI R26,0x60
0028 E0B0 LDI R27,0
0029 E010 LDI R17,0
002A 32E6 CPI R30,0x26
002B 07F1 CPC R31,R17
002C F021 BEQ 0x0031
002D 95C8 LPM
002E 9631 ADIW R30,1
002F 920D ST R0,X+
0030 CFF9 RJMP 0x002A
0031 D0BB RCALL _main
_exit:
0032 CFFF RJMP _exit
FILE: F:\lesson\leson2.c
(0001) #include <io2313v.h>
(0002) #include <macros.h>
(0003) #define uint unsigned int
(0004) #define uchar unsigned char
(0005) //#define LED_SET PORTD |= (1 << PD5) //位置高
(0006) //#define LED_CLR PORTD &= ~(1 << PD5) //位置低
(0007) //#define LED_COM PORTD ^= (1 << PD5) //位取反
(0008) //#define LED_R PIND & (1 << PD5) //位读取
(0009)
(0010)
(0011) void WDT_off(void)
(0012) {
(0013) //__disable_interrupt();
(0014) //__watchdog_reset();
(0015) //#asm("cli");
(0016) SREG &= ~(1 << (SREG&0x80));
_WDT_off:
0033 B71F IN R17,0x3F
0034 7810 ANDI R17,0x80
0035 E001 LDI R16,1
0036 D104 RCALL lsl8
0037 2E20 MOV R2,R16
0038 9420 COM R2
0039 B63F IN R3,0x3F
003A 2032 AND R3,R2
003B BE3F OUT 0x3F,R3
(0017) // Clear WDRF in MCUSR
(0018) MCUSR &= ~(1<<(MCUSR&0x08));
003C B714 IN R17,0x34
003D 7018 ANDI R17,0x8
003E E001 LDI R16,1
003F D0FB RCALL lsl8
0040 2E20 MOV R2,R16
0041 9420 COM R2
0042 B634 IN R3,0x34
0043 2032 AND R3,R2
0044 BE34 OUT 0x34,R3
(0019) // Write logical one to WDCE and WDE
(0020) // Keep old prescaler setting to prevent unintentional time-out
(0021) WDTCSR |= (1<<(WDTCSR&0x10)) | (1<<(WDTCSR&0x08));
0045 B511 IN R17,0x21
0046 7018 ANDI R17,0x8
0047 E001 LDI R16,1
0048 D0F2 RCALL lsl8
0049 2E20 MOV R2,R16
004A B511 IN R17,0x21
004B 7110 ANDI R17,0x10
004C E001 LDI R16,1
004D D0ED RCALL lsl8
004E 2E30 MOV R3,R16
004F 2832 OR R3,R2
0050 B421 IN R2,0x21
0051 2823 OR R2,R3
0052 BC21 OUT 0x21,R2
(0022) // Turn off WDT
(0023) WDTCSR = 0x00;
0053 2422 CLR R2
0054 BC21 OUT 0x21,R2
(0024) SREG |= (1 << (SREG&0x80));
0055 B71F IN R17,0x3F
0056 7810 ANDI R17,0x80
0057 E001 LDI R16,1
0058 D0E2 RCALL lsl8
0059 B62F IN R2,0x3F
005A 2A20 OR R2,R16
005B BE2F OUT 0x3F,R2
005C 9508 RET
_USART_Init:
baud --> R20
005D D0C6 RCALL push_gset1
005E 2F40 MOV R20,R16
005F 2F51 MOV R21,R17
(0025) //#asm("sei");
(0026) //__enable_interrupt();
(0027) }
(0028)
(0029) void USART_Init(unsigned int baud)
(0030) {
(0031) /* Set baud rate */
(0032) UBRRH = (unsigned char)(baud>>8);
0060 2E24 MOV R2,R20
0061 2E35 MOV R3,R21
0062 2C23 MOV R2,R3
0063 2433 CLR R3
0064 B822 OUT 0x02,R2
(0033) UBRRL = (unsigned char)baud;
0065 B949 OUT 0x09,R20
(0034) /* Enable receiver and transmitter */
(0035) UCSRB = (1<<(UCSRB&0x10))|(1<<(UCSRB&0x08));
0066 B11A IN R17,0x0A
0067 7018 ANDI R17,0x8
0068 E001 LDI R16,1
0069 D0D1 RCALL lsl8
006A 2E20 MOV R2,R16
006B B11A IN R17,0x0A
006C 7110 ANDI R17,0x10
006D E001 LDI R16,1
006E D0CC RCALL lsl8
006F 2E30 MOV R3,R16
0070 2832 OR R3,R2
0071 B83A OUT 0x0A,R3
(0036) /* Set frame format: 8data, 2stop bit */
(0037) UCSRC = (1<<(UCSRC&0x08))|(3<<(UCSRC&0x02));
0072 B113 IN R17,0x03
0073 7012 ANDI R17,2
0074 E003 LDI R16,3
0075 D0C5 RCALL lsl8
0076 2E20 MOV R2,R16
0077 B113 IN R17,0x03
0078 7018 ANDI R17,0x8
0079 E001 LDI R16,1
007A D0C0 RCALL lsl8
007B 2E30 MOV R3,R16
007C 2832 OR R3,R2
007D B833 OUT 0x03,R3
007E D0A8 RCALL pop_gset1
007F 9508 RET
_USART_Transmit:
data --> R20
0080 D0A3 RCALL push_gset1
0081 2F40 MOV R20,R16
(0038) //U2X=0;
(0039) }
(0040)
(0041)
(0042) void USART_Transmit( unsigned char data )
(0043) {
(0044) /* Wait for empty transmit buffer */
(0045) while ( !( UCSRA & (1<<(UCSRA&0x20))) );
0082 B11B IN R17,0x0B
0083 7210 ANDI R17,0x20
0084 E001 LDI R16,1
0085 D0B5 RCALL lsl8
0086 B02B IN R2,0x0B
0087 2220 AND R2,R16
0088 F3C9 BEQ 0x0082
(0046) /* Put data into buffer, sends the data */
(0047) UDR = data; //Transmit 8 data bits
0089 B94C OUT 0x0C,R20
008A D09C RCALL pop_gset1
008B 9508 RET
(0048) }
(0049)
(0050) /*
(0051) void USART_Transmit( unsigned int data )
(0052) {
(0053) //Wait for empty transmit buffer
(0054) while (!( UCSRA & (1<<UDRE)));
(0055) // Copy 9th bit to TXB8
(0056) UCSRB &= ~(1<<TXB8);
(0057) if ( data & 0x0100 )
(0058) UCSRB |= (1<<TXB8);
(0059) // Put data into buffer, sends the data
(0060) UDR = data; //Transmit 9 data bits
(0061) }
(0062) */
(0063)
(0064)
(0065) unsigned char USART_Receive( void )
(0066) {
(0067) // Wait for data to be received
(0068) while ( !(UCSRA & (1<<(UCSRA&0x80))) );
_USART_Receive:
008C B11B IN R17,0x0B
008D 7810 ANDI R17,0x80
008E E001 LDI R16,1
008F D0AB RCALL lsl8
0090 B02B IN R2,0x0B
0091 2220 AND R2,R16
0092 F3C9 BEQ 0x008C
(0069) //Get and return received data from buffer
(0070) return UDR; //Receive 8 data bits
0093 B10C IN R16,0x0C
0094 9508 RET
_delay:
i --> R20
j --> R22
ms --> R16
0095 D08C RCALL push_gset2
(0071) }
(0072)
(0073) /*
(0074) unsigned int USART_Receive( void )
(0075) {
(0076) unsigned char status, resh, resl;
(0077) // Wait for data to be received
(0078) while ( !(UCSRA & (1<<RXC)) );
(0079) // Get status and 9th bit, then data
(0080) // from buffer
(0081) status = UCSRA;
(0082) resh = UCSRB;
(0083) resl = UDR;
(0084) // If error, return -1
(0085) if ( status & (1<<FE)|(1<<DOR)|(1<<UPE) )
(0086) return -1;
(0087) // Filter the 9th bit, then return
(0088) resh = (resh >> 1) & 0x01;
(0089) return ((resh << 8) | resl); //Receive 9 data bits
(0090) }
(0091) */
(0092)
(0093) void delay(uint ms)
(0094) {
(0095) uint i,j;
(0096) for(i=0;i<ms;i++)
0096 2744 CLR R20
0097 2755 CLR R21
0098 C00B RJMP 0x00A4
(0097) {
(0098) for(j=0;j<1141;j++);
0099 2766 CLR R22
009A 2777 CLR R23
009B C002 RJMP 0x009E
009C 5F6F SUBI R22,0xFF
009D 4F7F SBCI R23,0xFF
009E 3765 CPI R22,0x75
009F E0E4 LDI R30,4
00A0 077E CPC R23,R30
00A1 F3D0 BCS 0x009C
00A2 5F4F SUBI R20,0xFF
00A3 4F5F SBCI R21,0xFF
00A4 1740 CP R20,R16
00A5 0751 CPC R21,R17
00A6 F390 BCS 0x0099
00A7 D072 RCALL pop_gset2
00A8 9508 RET
_senddata:
i --> R20
data --> R22
00A9 D078 RCALL push_gset2
00AA 2F60 MOV R22,R16
00AB 2F71 MOV R23,R17
(0099) }
(0100) }
(0101)
(0102) void senddata(uint data)
(0103) {
(0104) uchar i;
(0105) for(i=0;i<15;i++)
00AC 2744 CLR R20
00AD C028 RJMP 0x00D6
(0106) {
(0107) PORTD&=~(1<<(PORTD&0x10));
00AE B312 IN R17,0x12
00AF 7110 ANDI R17,0x10
00B0 E001 LDI R16,1
00B1 D089 RCALL lsl8
00B2 2E20 MOV R2,R16
00B3 9420 COM R2
00B4 B232 IN R3,0x12
00B5 2032 AND R3,R2
00B6 BA32 OUT 0x12,R3
(0108) NOP();
00B7 0000 NOP
(0109) if(data&0x8000)
00B8 FF77 SBRS R23,7
00B9 C008 RJMP 0x00C2
(0110) PORTD|=(1<<(PORTD&0x20)); //置位操作
00BA B312 IN R17,0x12
00BB 7210 ANDI R17,0x20
00BC E001 LDI R16,1
00BD D07D RCALL lsl8
00BE B222 IN R2,0x12
00BF 2A20 OR R2,R16
00C0 BA22 OUT 0x12,R2
00C1 C009 RJMP 0x00CB
(0111) else
(0112) PORTD&=~(1<<(PORTD&0x20)); //清零操作
00C2 B312 IN R17,0x12
00C3 7210 ANDI R17,0x20
00C4 E001 LDI R16,1
00C5 D075 RCALL lsl8
00C6 2E20 MOV R2,R16
00C7 9420 COM R2
00C8 B232 IN R3,0x12
00C9 2032 AND R3,R2
00CA BA32 OUT 0x12,R3
(0113)
(0114) PORTD|=(1<<(PORTD&0x10));
00CB B312 IN R17,0x12
00CC 7110 ANDI R17,0x10
00CD E001 LDI R16,1
00CE D06C RCALL lsl8
00CF B222 IN R2,0x12
00D0 2A20 OR R2,R16
00D1 BA22 OUT 0x12,R2
(0115) NOP();
00D2 0000 NOP
(0116) data=data<<1;
00D3 0F66 LSL R22
00D4 1F77 ROL R23
00D5 9543 INC R20
00D6 304F CPI R20,0xF
00D7 F2B0 BCS 0x00AE
(0117) }
(0118) PORTD|=(1<<(PORTD&0x08));
00D8 B312 IN R17,0x12
00D9 7018 ANDI R17,0x8
00DA E001 LDI R16,1
00DB D05F RCALL lsl8
00DC B222 IN R2,0x12
00DD 2A20 OR R2,R16
00DE BA22 OUT 0x12,R2
(0119) NOP();
00DF 0000 NOP
(0120) NOP();
00E0 0000 NOP
(0121) NOP();
00E1 0000 NOP
(0122) PORTD&=~(1<<(PORTD&0x08));
00E2 B312 IN R17,0x12
00E3 7018 ANDI R17,0x8
00E4 E001 LDI R16,1
00E5 D055 RCALL lsl8
00E6 2E20 MOV R2,R16
00E7 9420 COM R2
00E8 B232 IN R3,0x12
00E9 2032 AND R3,R2
00EA BA32 OUT 0x12,R3
00EB D02E RCALL pop_gset2
00EC 9508 RET
(0123)
(0124)
(0125) //PORTD|=(1<<PORTD5); //置位操作
(0126) //PORTD&=~(1<<PORTD5); //清零操作
(0127) }
(0128)
(0129) void main()
(0130) {
(0131) uchar i;
(0132) uint j=0x0001;
_main:
k --> R20
i --> R10
j --> R22
00ED E061 LDI R22,1
00EE E070 LDI R23,0
(0133) uint k=0x7fff;
00EF EF4F LDI R20,0xFF
00F0 E75F LDI R21,0x7F
(0134)
(0135) DDRD=0x38;
00F1 E388 LDI R24,0x38
00F2 BB81 OUT 0x11,R24
(0136)
(0137) WDT_off();
00F3 DF3F RCALL _WDT_off
(0138) USART_Init(9600);
00F4 E800 LDI R16,0x80
00F5 E215 LDI R17,0x25
00F6 DF66 RCALL _USART_Init
00F7 C020 RJMP 0x0118
(0139)
(0140) while(1)
(0141) {
(0142)
(0143) USART_Transmit(0x55);
00F8 E505 LDI R16,0x55
00F9 DF86 RCALL _USART_Transmit
(0144)
(0145) for(i=0;i<15;i++)
00FA 24AA CLR R10
00FB C00B RJMP 0x0107
(0146) {
(0147) senddata(j);
00FC 2F06 MOV R16,R22
00FD 2F17 MOV R17,R23
00FE DFAA RCALL _senddata
(0148) delay(200);
00FF EC08 LDI R16,0xC8
0100 E010 LDI R17,0
0101 DF93 RCALL _delay
(0149) j=j<<1;
0102 0F66 LSL R22
0103 1F77 ROL R23
(0150) j=j+1;
0104 5F6F SUBI R22,0xFF
0105 4F7F SBCI R23,0xFF
0106 94A3 INC R10
0107 2D8A MOV R24,R10
0108 308F CPI R24,0xF
0109 F390 BCS 0x00FC
(0151) }
(0152)
(0153) for(i=0;i<15;i++)
010A 24AA CLR R10
010B C009 RJMP 0x0115
(0154) {
(0155) senddata(k);
010C 2F04 MOV R16,R20
010D 2F15 MOV R17,R21
010E DF9A RCALL _senddata
(0156) delay(200);
010F EC08 LDI R16,0xC8
0110 E010 LDI R17,0
0111 DF83 RCALL _delay
(0157) k=k>>1;
FILE: <library>
0112 9556 LSR R21
0113 9547 ROR R20
0114 94A3 INC R10
0115 2D8A MOV R24,R10
0116 308F CPI R24,0xF
0117 F3A0 BCS 0x010C
0118 CFDF RJMP 0x00F8
0119 9508 RET
pop_gset2:
011A E0E2 LDI R30,2
011B C00C RJMP pop
push_gset5:
011C 92FA ST R15,-Y
011D 92EA ST R14,-Y
push_gset4:
011E 92DA ST R13,-Y
011F 92CA ST R12,-Y
push_gset3:
0120 92BA ST R11,-Y
0121 92AA ST R10,-Y
push_gset2:
0122 937A ST R23,-Y
0123 936A ST R22,-Y
push_gset1:
0124 935A ST R21,-Y
0125 934A ST R20,-Y
0126 9508 RET
pop_gset1:
0127 E0E1 LDI R30,1
pop:
0128 9149 LD R20,Y+
0129 9159 LD R21,Y+
012A FDE0 SBRC R30,0
012B 9508 RET
012C 9169 LD R22,Y+
012D 9179 LD R23,Y+
012E FDE1 SBRC R30,1
012F 9508 RET
0130 90A9 LD R10,Y+
0131 90B9 LD R11,Y+
0132 FDE2 SBRC R30,2
0133 9508 RET
0134 90C9 LD R12,Y+
0135 90D9 LD R13,Y+
0136 FDE3 SBRC R30,3
0137 9508 RET
0138 90E9 LD R14,Y+
0139 90F9 LD R15,Y+
013A 9508 RET
lsl8:
013B 2311 TST R17
013C F019 BEQ 0x0140
013D 0F00 LSL R16
013E 951A DEC R17
013F CFFB RJMP lsl8
0140 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -