📄 twi_master.lst
字号:
__text_start:
__start:
0028 E5CF LDI R28,0x5F
0029 E0D4 LDI R29,4
002A BFCD OUT 0x3D,R28
002B BFDE OUT 0x3E,R29
002C 51C0 SUBI R28,0x10
002D 40D0 SBCI R29,0
002E EA0A LDI R16,0xAA
002F 8308 STD Y+0,R16
0030 2400 CLR R0
0031 E8E2 LDI R30,0x82
0032 E0F0 LDI R31,0
0033 E010 LDI R17,0
0034 38E2 CPI R30,0x82
0035 07F1 CPC R31,R17
0036 F011 BEQ 0x0039
0037 9201 ST R0,Z+
0038 CFFB RJMP 0x0034
0039 8300 STD Z+0,R16
003A E2EE LDI R30,0x2E
003B E0F0 LDI R31,0
003C E6A0 LDI R26,0x60
003D E0B0 LDI R27,0
003E E010 LDI R17,0
003F 35E0 CPI R30,0x50
0040 07F1 CPC R31,R17
0041 F021 BEQ 0x0046
0042 95C8 LPM
0043 9631 ADIW R30,1
0044 920D ST R0,X+
0045 CFF9 RJMP 0x003F
0046 D04A RCALL _main
_exit:
0047 CFFF RJMP _exit
FILE: E:\atmega16子函数\TWI_master\main.c
(0001) #include"iom16v.h"
(0002) #include <iom16v.h>
(0003) #include<macros.h>
(0004) #include"UART.h"
(0005) #include"DELAY.h"
(0006)
(0007) #define uchar unsigned char
(0008) #define STATUS (TWSR&0xf8)
(0009) #define SLA_W 0x32
(0010) #define SLA_R 0x33
(0011) #define SLAVER_ADDRESS 0x32
(0012) #define START 0x08
(0013) #define RE_START 0x10
(0014) #define MT_SLA_WRITE_ACK 0x18
(0015) #define MT_SLA_READ_ACK 0x40
(0016) #define MT_DATA_ACK 0x28
(0017) #define MT_READ_ACK 0x58
(0018)
(0019) void Start(void)
(0020) {
(0021) TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
_Start:
0048 EA84 LDI R24,0xA4
0049 BF86 OUT 0x36,R24
(0022) while(!(TWCR&(1<<TWINT)));
004A B626 IN R2,0x36
004B FE27 SBRS R2,7
004C CFFD RJMP 0x004A
(0023) }
004D 9508 RET
(0024) void Stop(void)
(0025) {
(0026) TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
_Stop:
004E E984 LDI R24,0x94
004F BF86 OUT 0x36,R24
(0027) }
0050 9508 RET
(0028) void Load(uchar i)
(0029) {
(0030) TWDR=i;
_Load:
i --> R16
0051 B903 OUT 0x03,R16
(0031) TWCR=(1<<TWINT)|(1<<TWEN);
0052 E884 LDI R24,0x84
0053 BF86 OUT 0x36,R24
(0032) while(!(TWCR&(1<<TWINT)));
0054 B626 IN R2,0x36
0055 FE27 SBRS R2,7
0056 CFFD RJMP 0x0054
(0033)
(0034) }
0057 9508 RET
(0035)
(0036) void Get(unsigned char *d)
(0037) {
(0038) TWCR=(1<<TWINT)|(1<<TWEN);
_Get:
d --> R16
0058 E884 LDI R24,0x84
0059 BF86 OUT 0x36,R24
(0039) while(!(TWCR&(1<<TWINT)));
005A B626 IN R2,0x36
005B FE27 SBRS R2,7
005C CFFD RJMP 0x005A
(0040) *d= TWDR;
005D B023 IN R2,0x03
005E 01F8 MOVW R30,R16
005F 8220 STD Z+0,R2
(0041) }
0060 9508 RET
_ERROR:
state --> R20
0061 D0ED RCALL push_gset1
0062 2F40 MOV R20,R16
(0042) void ERROR(uchar state)
(0043) {Stop();
0063 DFEA RCALL _Stop
(0044) }
0064 D0ED RCALL pop_gset1
0065 9508 RET
_SendByte:
data --> R20
0066 D0E8 RCALL push_gset1
0067 2F40 MOV R20,R16
(0045)
(0046) /*写一个字节data,成功则返回1,否则
(0047) 返回0*/
(0048) uchar SendByte(uchar data)
(0049) {
(0050) //启动I2C
(0051) Start();
0068 DFDF RCALL _Start
(0052) if(STATUS!=START) //{ERROR(STATUS);return 0;}
0069 B181 IN R24,0x01
006A 7F88 ANDI R24,0xF8
006B 3088 CPI R24,0x8
006C F019 BEQ 0x0070
(0053) puts("Start ERRor");
006D E706 LDI R16,0x76
006E E010 LDI R17,0
006F D072 RCALL _puts
(0054) //发送从机地址(写),等待回应, 错误检测
(0055) Load(0);
0070 2700 CLR R16
0071 DFDF RCALL _Load
(0056) if(STATUS!=MT_SLA_WRITE_ACK) //{ERROR(STATUS);return 0;}
0072 B181 IN R24,0x01
0073 7F88 ANDI R24,0xF8
0074 3188 CPI R24,0x18
0075 F019 BEQ 0x0079
(0057) puts("SLA_W RROR");
0076 E60B LDI R16,0x6B
0077 E010 LDI R17,0
0078 D069 RCALL _puts
(0058) /*
(0059) //发送EEPROM地址,等待回应,错误检测
(0060) Load(addr);
(0061) if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
(0062) */
(0063) //发送数据,等待回应,错误检测
(0064) Load(data);
0079 2F04 MOV R16,R20
007A DFD6 RCALL _Load
(0065) if(STATUS!=MT_DATA_ACK) //{ERROR(STATUS);return 0;}
007B B181 IN R24,0x01
007C 7F88 ANDI R24,0xF8
007D 3288 CPI R24,0x28
007E F019 BEQ 0x0082
(0066) puts("Date Error");
007F E600 LDI R16,0x60
0080 E010 LDI R17,0
0081 D060 RCALL _puts
(0067) Stop();
0082 DFCB RCALL _Stop
(0068) return 1;//发送成功,返回1;
0083 E001 LDI R16,1
0084 D0CD RCALL pop_gset1
0085 9508 RET
(0069)
(0070) }
(0071)
(0072) void Init_Io(void)
(0073) {
(0074) DDRC&=~((1<<PC0)&(1<<PC1)&(1<<PC2));
_Init_Io:
0086 B384 IN R24,0x14
0087 7F8F ANDI R24,0xFF
0088 BB84 OUT 0x14,R24
(0075) PORTC|= (1<<PC0)|(1<<PC1)|(1<<PC2);
0089 B385 IN R24,0x15
008A 6087 ORI R24,7
008B BB85 OUT 0x15,R24
(0076) TWCR=(1<<TWEA)|(1<<TWEN); //主机模式,使能TWI
008C E484 LDI R24,0x44
008D BF86 OUT 0x36,R24
(0077) TWBR=32;//波特率 100K 8M晶振
008E E280 LDI R24,0x20
008F B980 OUT 0x00,R24
(0078) }
0090 9508 RET
(0079) void main()
(0080) {
(0081) uchar temp;
(0082) Init_Io();
_main:
temp --> Y+1
0091 DFF4 RCALL _Init_Io
(0083) uart_init();
0092 D06F RCALL _uart_init
(0084) // puts("串口工作");
(0085) SendByte(0x30);
0093 E300 LDI R16,0x30
0094 DFD1 RCALL _SendByte
(0086) while(1)
0095 CFFF RJMP 0x0095
(0087) {
(0088) ;
(0089) }
(0090) /*for(temp=0;temp<10;temp++)
(0091) {
(0092) SendByte(temp+0x30);
(0093) Delay_nms(10);
(0094) }
(0095) */
(0096) }
0096 9508 RET
_put:
d --> Y+0
i --> R20
0097 D0B7 RCALL push_gset1
0098 01A8 MOVW R20,R16
0099 9728 SBIW R28,0x8
FILE: E:\atmega16子函数\TWI_master\uart.c
(0001) #include <iom8v.h>
(0002) #include<macros.h>
(0003)
(0004) void put(unsigned int i)
(0005) {
(0006) char d[8]={0};
009A E286 LDI R24,0x26
009B E090 LDI R25,0
009C 01FE MOVW R30,R28
009D E008 LDI R16,0x8
009E E010 LDI R17,0
009F 93FA ST R31,-Y
00A0 93EA ST R30,-Y
00A1 939A ST R25,-Y
00A2 938A ST R24,-Y
00A3 D0C5 RCALL asgncblk
(0007) Int_to_Char(i,d);
00A4 019E MOVW R18,R28
00A5 018A MOVW R16,R20
00A6 D005 RCALL _Int_to_Char
(0008) puts(d);
00A7 018E MOVW R16,R28
00A8 D039 RCALL _puts
(0009) }
00A9 9628 ADIW R28,0x8
00AA D0A7 RCALL pop_gset1
00AB 9508 RET
_Int_to_Char:
p --> R20
i --> R22
00AC D0B9 RCALL push_gset2
00AD 01A9 MOVW R20,R18
00AE 01B8 MOVW R22,R16
(0010) void Int_to_Char(unsigned int i,char *p)
(0011) {p[0]=i/1000+48;
00AF EE28 LDI R18,0xE8
00B0 E033 LDI R19,3
00B1 018B MOVW R16,R22
00B2 D080 RCALL div16u
00B3 01C8 MOVW R24,R16
00B4 96C0 ADIW R24,0x30
00B5 01FA MOVW R30,R20
00B6 8380 STD Z+0,R24
(0012) p[1]=(i/100)%10+48;
00B7 E624 LDI R18,0x64
00B8 E030 LDI R19,0
00B9 018B MOVW R16,R22
00BA D078 RCALL div16u
00BB E02A LDI R18,0xA
00BC E030 LDI R19,0
00BD D073 RCALL mod16u
00BE 01C8 MOVW R24,R16
00BF 96C0 ADIW R24,0x30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -