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

📄 master_1.s

📁 ICCavr编写的TWI总线协议读写函数
💻 S
字号:
	.module master_1.c
	.area data(ram, con, rel)
_Date::
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile D:\AVR\代码\ICCdaima\TWI/UART.h
	.dbsym e Date _Date A[4:4]c
	.area text(rom, con, rel)
	.dbfile D:\AVR\代码\ICCdaima\TWI/UART.h
	.dbfile D:\AVR\代码\ICCdaima\TWI\master_1.c
	.dbfunc e Start _Start fV
	.even
_Start::
	.dbline -1
	.dbline 17
; #include"iom8v.h"
; #include"UART.h"
; #define  uchar  unsigned char
; #define  STATUS  (TWSR&0xf8)
; #define  SLA_W    0x32
; #define  SLA_R    0x33
; #define  SLAVER_ADDRESS     0x32
; #define  START              0x08
; #define  RE_START           0x10
; #define  MT_SLA_WRITE_ACK   0x18
; #define  MT_SLA_READ_ACK    0x40 
; #define  MT_DATA_ACK        0x28
; #define  MT_READ_ACK        0x58  
;     
; 
; void Start(void)
; {
	.dbline 18
;  TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
	ldi R24,164
	out 0x36,R24
L2:
	.dbline 19
L3:
	.dbline 19
;  while(!(TWCR&(1<<TWINT)));
	in R2,0x36
	sbrs R2,7
	rjmp L2
	.dbline -2
	.dbline 20
; }
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Stop _Stop fV
	.even
_Stop::
	.dbline -1
	.dbline 22
; void Stop(void)
; {
	.dbline 23
;  TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
	ldi R24,148
	out 0x36,R24
	.dbline -2
	.dbline 24
; }
L5:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Load _Load fV
;              i -> R16
	.even
_Load::
	.dbline -1
	.dbline 26
; void Load(uchar i)
; {
	.dbline 27
;  TWDR=i;
	out 0x3,R16
	.dbline 28
;  TWCR=(1<<TWINT)|(1<<TWEN);
	ldi R24,132
	out 0x36,R24
L7:
	.dbline 29
L8:
	.dbline 29
;  while(!(TWCR&(1<<TWINT))); 
	in R2,0x36
	sbrs R2,7
	rjmp L7
	.dbline -2
	.dbline 31
; 
; }
L6:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.dbfunc e Get _Get fV
;              d -> R16,R17
	.even
_Get::
	.dbline -1
	.dbline 34
; 
; void Get(unsigned char *d)
; {
	.dbline 35
;  TWCR=(1<<TWINT)|(1<<TWEN);
	ldi R24,132
	out 0x36,R24
L11:
	.dbline 36
L12:
	.dbline 36
;  while(!(TWCR&(1<<TWINT)));
	in R2,0x36
	sbrs R2,7
	rjmp L11
	.dbline 37
;  *d= TWDR;
	in R2,0x3
	movw R30,R16
	std z+0,R2
	.dbline -2
	.dbline 38
; }
L10:
	.dbline 0 ; func end
	ret
	.dbsym r d 16 pc
	.dbend
	.dbfunc e ERROR _ERROR fV
;          state -> R20
	.even
_ERROR::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 40
; void ERROR(uchar state)
; {Stop();
	.dbline 40
	rcall _Stop
	.dbline -2
	.dbline 41
; }
L14:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r state 20 c
	.dbend
	.dbfunc e SendByte _SendByte fc
;           data -> R20
	.even
_SendByte::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 46
; 
; /*写一个字节data,成功则返回1,否则
;   返回0*/
; uchar SendByte(uchar data)
; {
	.dbline 48
;    //启动I2C
;    Start();
	rcall _Start
	.dbline 49
;   if(STATUS!=START) //{ERROR(STATUS);return 0;}
	in R24,0x1
	andi R24,248
	cpi R24,8
	breq L16
	.dbline 50
;                       puts("Start ERRor");
	ldi R16,<L18
	ldi R17,>L18
	rcall _puts
L16:
	.dbline 52
;    //发送从机地址(写),等待回应, 错误检测
;    Load(0);
	clr R16
	rcall _Load
	.dbline 53
;    if(STATUS!=MT_SLA_WRITE_ACK) //{ERROR(STATUS);return 0;}
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L19
	.dbline 54
;                       puts("SLA_W RROR");
	ldi R16,<L21
	ldi R17,>L21
	rcall _puts
L19:
	.dbline 61
;    /*
;    //发送EEPROM地址,等待回应,错误检测
;    Load(addr);
;    if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
;    */
;    //发送数据,等待回应,错误检测
;    Load(data);
	mov R16,R20
	rcall _Load
	.dbline 62
;    if(STATUS!=MT_DATA_ACK) //{ERROR(STATUS);return 0;}
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L22
	.dbline 63
;                          puts("Date Error");
	ldi R16,<L24
	ldi R17,>L24
	rcall _puts
L22:
	.dbline 64
;    Stop();
	rcall _Stop
	.dbline 65
;    return 1;//发送成功,返回1;
	ldi R16,1
	.dbline -2
L15:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbend
	.dbfunc e Init_Io _Init_Io fV
	.even
_Init_Io::
	.dbline -1
	.dbline 70
;    
; }
; 
; void Init_Io(void)
; {
	.dbline 71
;  DDRC&=~((1<<PC4)&(1<<PC5)&(1<<PC2));  
	in R24,0x14
	andi R24,255
	out 0x14,R24
	.dbline 72
;  PORTC|= (1<<PC4)|(1<<PC5)|(1<<PC2);
	in R24,0x15
	ori R24,52
	out 0x15,R24
	.dbline 73
;  TWCR=(1<<TWEA)|(1<<TWEN); //主机模式,使能TWI
	ldi R24,68
	out 0x36,R24
	.dbline 74
;  TWBR=32;//波特率 100K   8M晶振
	ldi R24,32
	out 0x0,R24
	.dbline -2
	.dbline 75
; }
L25:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;           temp -> R20
	.even
_main::
	.dbline -1
	.dbline 77
; void main()
; {
	.dbline 79
;   uchar temp;
;   Init_Io();
	rcall _Init_Io
	.dbline 80
;   uart_init();
	rcall _uart_init
	.dbline 81
;   puts("串口工作");
	ldi R16,<L27
	ldi R17,>L27
	rcall _puts
	rjmp L29
L28:
	.dbline 83
;   while(1)
;   for(temp=0;temp<10;temp++)
	clr R20
	rjmp L34
L31:
	.dbline 84
	.dbline 85
	mov R16,R20
	subi R16,208    ; addi 48
	rcall _SendByte
	.dbline 86
	ldi R16,10
	ldi R17,0
	rcall _Delay_nms
	.dbline 87
L32:
	.dbline 83
	inc R20
L34:
	.dbline 83
	cpi R20,10
	brlo L31
L29:
	.dbline 82
	rjmp L28
X0:
	.dbline -2
	.dbline 89
;   {
;     SendByte(temp+0x30);  
; 	Delay_nms(10);
;    }
;   
; }
L26:
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbend
	.area data(ram, con, rel)
	.dbfile D:\AVR\代码\ICCdaima\TWI\master_1.c
L27:
	.blkb 9
	.area idata
	.byte 180,174,191,218,185,164,215,247,0
	.area data(ram, con, rel)
	.dbfile D:\AVR\代码\ICCdaima\TWI\master_1.c
L24:
	.blkb 11
	.area idata
	.byte 'D,'a,'t,'e,32,'E,'r,'r,'o,'r,0
	.area data(ram, con, rel)
	.dbfile D:\AVR\代码\ICCdaima\TWI\master_1.c
L21:
	.blkb 11
	.area idata
	.byte 'S,'L,'A,95,'W,32,'R,'R,'O,'R,0
	.area data(ram, con, rel)
	.dbfile D:\AVR\代码\ICCdaima\TWI\master_1.c
L18:
	.blkb 12
	.area idata
	.byte 'S,'t,'a,'r,'t,32,'E,'R,'R,'o,'r,0
	.area data(ram, con, rel)
	.dbfile D:\AVR\代码\ICCdaima\TWI\master_1.c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -