📄 twi_slaver.lst
字号:
(0113)
(0114) //TWI接口初始化,从器件模式
(0115) TWAR=TWI_ADDRESS | (1<<TWGCE);
0110 E383 LDI R24,0x33
0111 B982 OUT 0x02,R24
(0116) TWCR=(1<<TWEA) | (1<<TWEN)|(1<<TWIE);
0112 E485 LDI R24,0x45
0113 BF86 OUT 0x36,R24
(0117) asm("SEI");
0114 9478 BSET 7
(0118) }
0115 9508 RET
(0119) void main()
(0120) {
(0121) uchar temp1,temp2;
(0122) Init_Io();
_main:
temp2 --> R20
temp1 --> R22
0116 DFF3 RCALL _Init_Io
(0123) uart_init();
0117 940E01B2 CALL _uart_init
0119 C00D RJMP 0x0127
(0124) // puts("串口正常工作");
(0125) while(1)
(0126) {
(0127) TWCR=(1<<TWINT)|(1<<TWEA) | (1<<TWEN); //启动一次接收
011A EC84 LDI R24,0xC4
011B BF86 OUT 0x36,R24
(0128) while((TWCR&(1<<TWINT))==0); //等待有数据被接收
011C B626 IN R2,0x36
011D FE27 SBRS R2,7
011E CFFD RJMP 0x011C
(0129) //Delay_nms(100);
(0130) temp1=STATUS;
011F B161 IN R22,0x01
0120 7F68 ANDI R22,0xF8
(0131)
(0132) temp2=TWDR;
0121 B143 IN R20,0x03
(0133) //UDR = temp2;
(0134) //putchar(temp1);
(0135) if(temp1==0x90)
0122 3960 CPI R22,0x90
0123 F419 BNE 0x0127
(0136) {
(0137) // puts("接受到:");
(0138) putchar(temp2);
0124 2F04 MOV R16,R20
0125 940E0186 CALL _putchar
0127 CFF2 RJMP 0x011A
(0139) }
(0140)
(0141)
(0142) }
(0143)
(0144) }
0128 9508 RET
_TWI_ISR:
temp2 --> R16
temp1 --> R16
0129 930A ST R16,-Y
012A 938A ST R24,-Y
012B B70F IN R16,0x3F
012C 930A ST R16,-Y
(0145) #pragma interrupt_handler TWI_ISR:18
(0146) void TWI_ISR(void)
(0147) {
(0148) uchar temp1,temp2;
(0149) temp1=STATUS;
012D B101 IN R16,0x01
012E 7F08 ANDI R16,0xF8
(0150) temp2=TWDR;
012F B103 IN R16,0x03
(0151) /* if(temp1==0x90)
(0152) {
(0153) puts("接受到:");
(0154) putchar(temp2);
(0155) }*/
(0156) TWCR=(1<<TWINT)|(1<<TWEA) | (1<<TWEN)|(1<<TWIE); //启动一次接收
0130 EC85 LDI R24,0xC5
0131 BF86 OUT 0x36,R24
(0157)
(0158) }
0132 9109 LD R16,Y+
0133 BF0F OUT 0x3F,R16
0134 9189 LD R24,Y+
0135 9109 LD R16,Y+
0136 9518 RETI
_put:
d --> Y+0
i --> R20
0137 940E01DA CALL push_gset1
0139 01A8 MOVW R20,R16
013A 9728 SBIW R28,0x8
FILE: E:\atmega16子函数\TWI_slaver0\uart.c
(0001) #include <iom16v.h>
(0002) #include<macros.h>
(0003)
(0004) void put(unsigned int i)
(0005) {
(0006) char d[8]={0};
013B E584 LDI R24,0x54
013C E090 LDI R25,0
013D 01FE MOVW R30,R28
013E E008 LDI R16,0x8
013F E010 LDI R17,0
0140 93FA ST R31,-Y
0141 93EA ST R30,-Y
0142 939A ST R25,-Y
0143 938A ST R24,-Y
0144 940E01F5 CALL asgncblk
(0007) Int_to_Char(i,d);
0146 019E MOVW R18,R28
0147 018A MOVW R16,R20
0148 D006 RCALL _Int_to_Char
(0008) puts(d);
0149 018E MOVW R16,R28
014A D043 RCALL _puts
(0009) }
014B 9628 ADIW R28,0x8
014C 940E01DD CALL pop_gset1
014E 9508 RET
_Int_to_Char:
p --> R20
i --> R22
014F 940E01F1 CALL push_gset2
0151 01A9 MOVW R20,R18
0152 01B8 MOVW R22,R16
(0010) void Int_to_Char(unsigned int i,char *p)
(0011) {p[0]=i/1000+48;
0153 EE28 LDI R18,0xE8
0154 E033 LDI R19,3
0155 018B MOVW R16,R22
0156 940E01BD CALL div16u
0158 01C8 MOVW R24,R16
0159 96C0 ADIW R24,0x30
015A 01FA MOVW R30,R20
015B 8380 STD Z+0,R24
(0012) p[1]=(i/100)%10+48;
015C E624 LDI R18,0x64
015D E030 LDI R19,0
015E 018B MOVW R16,R22
015F 940E01BD CALL div16u
0161 E02A LDI R18,0xA
0162 E030 LDI R19,0
0163 940E01BB CALL mod16u
0165 01C8 MOVW R24,R16
0166 96C0 ADIW R24,0x30
0167 01FA MOVW R30,R20
0168 8381 STD Z+1,R24
(0013) p[2]=(i%100)/10+48;
0169 E624 LDI R18,0x64
016A E030 LDI R19,0
016B 018B MOVW R16,R22
016C 940E01BB CALL mod16u
016E E02A LDI R18,0xA
016F E030 LDI R19,0
0170 940E01BD CALL div16u
0172 01C8 MOVW R24,R16
0173 96C0 ADIW R24,0x30
0174 01FA MOVW R30,R20
0175 8382 STD Z+2,R24
(0014) p[3]=(i%100)%10+48;
0176 E624 LDI R18,0x64
0177 E030 LDI R19,0
0178 018B MOVW R16,R22
0179 940E01BB CALL mod16u
017B E02A LDI R18,0xA
017C E030 LDI R19,0
017D 940E01BB CALL mod16u
017F 01C8 MOVW R24,R16
0180 96C0 ADIW R24,0x30
0181 01FA MOVW R30,R20
0182 8383 STD Z+3,R24
(0015) }
0183 940E01D7 CALL pop_gset2
0185 9508 RET
(0016) /* 字符输出函数 */
(0017) void putchar(char c)
(0018) {
(0019) while (!(UCSRA&(1<<UDRE)));
_putchar:
c --> R16
0186 9B5D SBIS 0x0B,5
0187 CFFE RJMP _putchar
(0020) UDR=c;
0188 B90C OUT 0x0C,R16
(0021) }
0189 9508 RET
(0022) /* 字符输入函数 */
(0023) unsigned char getchar(void)
(0024) {
(0025) while(!(UCSRA& (1<<RXC)));
_getchar:
018A 9B5F SBIS 0x0B,7
018B CFFE RJMP _getchar
(0026)
(0027) return UDR;
018C B10C IN R16,0x0C
018D 9508 RET
_puts:
s --> R20
018E 940E01DA CALL push_gset1
0190 01A8 MOVW R20,R16
(0028) }
(0029) /* 字符串输出函数 */
(0030) void puts(char * s)
(0031) {
0191 C005 RJMP 0x0197
(0032) while (*s)
(0033) {
(0034) putchar(*s);
0192 01FA MOVW R30,R20
0193 8100 LDD R16,Z+0
0194 DFF1 RCALL _putchar
(0035) s++;
0195 5F4F SUBI R20,0xFF
0196 4F5F SBCI R21,0xFF
0197 01FA MOVW R30,R20
0198 8020 LDD R2,Z+0
0199 2022 TST R2
019A F7B9 BNE 0x0192
(0036) }
(0037) putchar(0x0a);//回车换行
019B E00A LDI R16,0xA
019C DFE9 RCALL _putchar
(0038) putchar(0x0d);
019D E00D LDI R16,0xD
019E DFE7 RCALL _putchar
(0039)
(0040) }
019F 940E01DD CALL pop_gset1
01A1 9508 RET
_putstr:
s --> R20
01A2 940E01DA CALL push_gset1
01A4 01A8 MOVW R20,R16
(0041) /* 不含回车换行的字符串输出函数 */
(0042) void putstr(char * s)
(0043) {
01A5 C005 RJMP 0x01AB
(0044) while (*s)
(0045) {
(0046) putchar(*s);
01A6 01FA MOVW R30,R20
01A7 8100 LDD R16,Z+0
01A8 DFDD RCALL _putchar
(0047) s++;
01A9 5F4F SUBI R20,0xFF
01AA 4F5F SBCI R21,0xFF
01AB 01FA MOVW R30,R20
01AC 8020 LDD R2,Z+0
01AD 2022 TST R2
01AE F7B9 BNE 0x01A6
(0048) }
(0049) }
01AF 940E01DD CALL pop_gset1
01B1 9508 RET
(0050) /* UART初始化 */
(0051) void uart_init(void)
(0052) {
(0053)
(0054) UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);;//允许发送和接收
_uart_init:
01B2 E988 LDI R24,0x98
01B3 B98A OUT 0x0A,R24
(0055) UBRRL=47; // 4M 25 8M 51 7.3728M 47
01B4 E28F LDI R24,0x2F
01B5 B989 OUT 0x09,R24
(0056) UBRRH=0; // 9600;
01B6 2422 CLR R2
01B7 BC20 OUT 0x20,R2
(0057) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
01B8 E886 LDI R24,0x86
01B9 BD80 OUT 0x20,R24
(0058) }
FILE: <library>
01BA 9508 RET
mod16u:
01BB 9468 BSET 6
01BC C001 RJMP xdiv16u
div16u:
01BD 94E8 BCLR 6
xdiv16u:
01BE 92EA ST R14,-Y
01BF 92FA ST R15,-Y
01C0 938A ST R24,-Y
01C1 24EE CLR R14
01C2 24FF CLR R15
01C3 E180 LDI R24,0x10
01C4 0F00 LSL R16
01C5 1F11 ROL R17
01C6 1CEE ROL R14
01C7 1CFF ROL R15
01C8 16E2 CP R14,R18
01C9 06F3 CPC R15,R19
01CA F018 BCS 0x01CE
01CB 1AE2 SUB R14,R18
01CC 0AF3 SBC R15,R19
01CD 9503 INC R16
01CE 958A DEC R24
01CF F7A1 BNE 0x01C4
01D0 F416 BRTC 0x01D3
01D1 2D0E MOV R16,R14
01D2 2D1F MOV R17,R15
01D3 9189 LD R24,Y+
01D4 90F9 LD R15,Y+
01D5 90E9 LD R14,Y+
01D6 9508 RET
pop_gset2:
01D7 E0E2 LDI R30,2
01D8 940C01DE JMP pop
push_gset1:
01DA 935A ST R21,-Y
01DB 934A ST R20,-Y
01DC 9508 RET
pop_gset1:
01DD E0E1 LDI R30,1
pop:
01DE 9149 LD R20,Y+
01DF 9159 LD R21,Y+
01E0 FDE0 SBRC R30,0
01E1 9508 RET
01E2 9169 LD R22,Y+
01E3 9179 LD R23,Y+
01E4 FDE1 SBRC R30,1
01E5 9508 RET
01E6 90A9 LD R10,Y+
01E7 90B9 LD R11,Y+
01E8 FDE2 SBRC R30,2
01E9 9508 RET
01EA 90C9 LD R12,Y+
01EB 90D9 LD R13,Y+
01EC FDE3 SBRC R30,3
01ED 9508 RET
01EE 90E9 LD R14,Y+
01EF 90F9 LD R15,Y+
01F0 9508 RET
push_gset2:
01F1 937A ST R23,-Y
01F2 936A ST R22,-Y
01F3 940C01DA JMP push_gset1
asgncblk:
01F5 93AA ST R26,-Y
01F6 93BA ST R27,-Y
01F7 93EA ST R30,-Y
01F8 93FA ST R31,-Y
01F9 920A ST R0,-Y
01FA 81AF LDD R26,Y+7
01FB 85B8 LDD R27,Y+8
01FC 81ED LDD R30,Y+5
01FD 81FE LDD R31,Y+6
01FE 3000 CPI R16,0
01FF 0701 CPC R16,R17
0200 F031 BEQ 0x0207
0201 95C8 LPM
0202 920D ST R0,X+
0203 9631 ADIW R30,1
0204 5001 SUBI R16,1
0205 4010 SBCI R17,0
0206 CFF7 RJMP 0x01FE
0207 9009 LD R0,Y+
0208 91F9 LD R31,Y+
0209 91E9 LD R30,Y+
020A 91B9 LD R27,Y+
020B 91A9 LD R26,Y+
020C 9624 ADIW R28,4
020D 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -