📄 ac15-3.s
字号:
.module ac15-3.c
.area lit(rom, con, rel)
_dis_7::
.byte 192,249
.byte 164,176
.byte 153,146
.byte 130,248
.byte 128,144
.dbfile D:\programe\AVR实验\I2C\TWI-at2401\ac15-3.c
.dbsym e dis_7 _dis_7 A[10:10]kc
_position::
.byte 16,32
.dbsym e position _position A[2:2]kc
.area data(ram, con, rel)
.dbfile D:\programe\AVR实验\I2C\TWI-at2401\ac15-3.c
_dis_buff::
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile D:\programe\AVR实验\I2C\TWI-at2401\ac15-3.c
.dbsym e dis_buff _dis_buff A[2:2]c
.area text(rom, con, rel)
.dbfile D:\programe\AVR实验\I2C\TWI-at2401\ac15-3.c
.dbfunc e Delay_2us _Delay_2us fV
.even
_Delay_2us::
.dbline -1
.dbline 53
; #include <iom8v.h>
; #include <macros.h>
; //-----------------------------------------------
; #define uchar unsigned char
; #define uint unsigned int
;
; //TWI状态定义
; //MT 主方式传输 MR 主方式接收
; #define START 0x08
; #define RE_START 0x10
; #define MT_SLA_ACK 0x18
; #define MT_SLA_NOACK 0x20
; #define MT_DATA_ACK 0x28
; #define MT_DATA_NOACK 0x30
; #define MR_SLA_ACK 0x40
; #define MR_SLA_NOACK 0x48
; #define MR_DATA_ACK 0x50
; #define MR_DATA_NOACK 0x58
;
;
; #define rd_device_add 0xa1
; #define wr_device_add 0xa0
;
; #define DS12_CONTROL_PORT PORTB
; #define CS PB3
; #define CS_ON() ( DS12_CONTROL_PORT &= ~(1<<CS) )
; #define CS_OFF() ( DS12_CONTROL_PORT |= (1<<CS) )
;
; //常用TWI操作(主模式写和主模式读)
; #define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
; #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
; #define Wait() {while(!(TWCR&(1<<TWINT)));}
; #define TestAck() (TWSR&0xf8)
; #define SetAck() (TWCR|=(1<<TWEA))
; #define SetNoAck() (TWCR&=~(1<<TWEA))
; #define Twi() (TWCR=(1<<TWINT)|(1<<TWEN))
; #define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
;
; #define xtal 8
;
; flash unsigned char dis_7[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
; flash unsigned char position[]={0x10,0x20};
; unsigned char dis_buff[2]={0,0},posit;
;
; //========函数声明=========
;
; void port_init(void);
; void delay_ms(unsigned int time);
; void delay_us(int time);
; //=======================
;
; void Delay_2us()
; {
.dbline 54
; NOP();NOP();NOP();
nop
.dbline 54
nop
.dbline 54
nop
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e _delay_us __delay_us fV
; xus -> R20,R21
.even
__delay_us::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 58
; }
;
; void _delay_us(unsigned int xus)
; {
xjmp L4
L3:
.dbline 60
xcall _Delay_2us
L4:
.dbline 59
; while (xus--)
movw R2,R20
subi R20,1
sbci R21,0
tst R2
brne L3
tst R3
brne L3
X0:
.dbline -2
L2:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r xus 20 i
.dbend
.dbfunc e delay_ms _delay_ms fV
; i -> R20,R21
; j -> R22,R23
; xms -> R16,R17
.even
_delay_ms::
xcall push_gset2
.dbline -1
.dbline 64
; Delay_2us();
; }
;
; void delay_ms(unsigned int xms) //crystal=8MHz
; {
.dbline 66
; unsigned int i,j; //variable:declare Word
; for(i=0; i<xms; i++)
clr R20
clr R21
xjmp L10
L7:
.dbline 67
; for(j=0; j<498;j++)
clr R22
clr R23
xjmp L14
L11:
.dbline 68
.dbline 69
nop
.dbline 69
nop
.dbline 69
nop
.dbline 69
nop
.dbline 70
nop
.dbline 70
nop
.dbline 70
nop
.dbline 70
nop
.dbline 70
nop
.dbline 72
L12:
.dbline 67
subi R22,255 ; offset = 1
sbci R23,255
L14:
.dbline 67
cpi R22,242
ldi R30,1
cpc R23,R30
brlo L11
L8:
.dbline 66
subi R20,255 ; offset = 1
sbci R21,255
L10:
.dbline 66
cp R20,R16
cpc R21,R17
brlo L7
.dbline -2
L6:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r j 22 i
.dbsym r xms 16 i
.dbend
.dbfunc e display _display fV
; adc1 -> R20
.even
_display::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 76
; {
; NOP();NOP();NOP();NOP();
; NOP();NOP();NOP();NOP();NOP();
;
; }
; }
;
; void display(unsigned char adc1) // 2 位LED 数码管动态扫描函数
; {
.dbline 77
; dis_buff[1]=adc1 /10;
ldi R17,10
mov R16,R20
xcall div8u
sts _dis_buff+1,R16
.dbline 79
;
; dis_buff[0]=adc1 %10;
ldi R17,10
mov R16,R20
xcall mod8u
sts _dis_buff,R16
.dbline 82
;
; //PORTB = 0x00;
; for(posit=0; posit<2;posit++)
clr R2
sts _posit,R2
xjmp L20
L17:
.dbline 83
.dbline 85
ldi R24,<_dis_buff
ldi R25,>_dis_buff
lds R30,_posit
clr R31
add R30,R24
adc R31,R25
ldd R30,z+0
clr R31
ldi R24,<_dis_7
ldi R25,>_dis_7
add R30,R24
adc R31,R25
lpm R30,Z
out 0x12,R30
.dbline 86
ldi R24,<_position
ldi R25,>_position
lds R30,_posit
clr R31
add R30,R24
adc R31,R25
lpm R30,Z
out 0x18,R30
.dbline 88
ldi R16,100
ldi R17,0
xcall __delay_us
.dbline 91
L18:
.dbline 82
lds R24,_posit
subi R24,255 ; addi 1
sts _posit,R24
L20:
.dbline 82
lds R24,_posit
cpi R24,2
brlo L17
.dbline -2
L15:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r adc1 20 c
.dbend
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 96
; {
;
; PORTD = dis_7[dis_buff[posit]];
; PORTB = position[posit];
;
; _delay_us(100);
; //PORTB &= ~position[posit];
;
; }
; }
;
; /********************端口初始化******************/
; void port_init(void)
; {
.dbline 100
; //PORTA = 0x00;
; //DDRA = 0xFF;
; // PORTB = 0x00;
; DDRB = 0xFF;
ldi R24,255
out 0x17,R24
.dbline 102
; // PORTC = 0x00;
; DDRC = 0x30;
ldi R24,48
out 0x14,R24
.dbline 104
; // PORTD = 0xFF;
; DDRD = 0xFF;
ldi R24,255
out 0x11,R24
.dbline -2
L21:
.dbline 0 ; func end
ret
.dbend
.dbfunc e i2c_Read _i2c_Read fc
; temp -> R20
; RomAddress -> R16
.even
_i2c_Read::
xcall push_gset1
.dbline -1
.dbline 113
; }
;
;
; /******************************************
; I2C总线读一个字节
; 如果读失败返回0
; *******************************************/
; unsigned char i2c_Read(unsigned char RomAddress)
; {
.dbline 115
; unsigned char temp;
; Start();
ldi R24,164
out 0x36,R24
.dbline 116
L23:
.dbline 116
L24:
.dbline 116
; Wait();
in R2,0x36
sbrs R2,7
rjmp L23
.dbline 116
.dbline 116
.dbline 117
; if (TestAck()!=START) return 0;
in R24,0x1
andi R24,248
cpi R24,8
breq L26
.dbline 117
clr R16
xjmp L22
L26:
.dbline 118
; Write8Bit(wr_device_add);
.dbline 118
ldi R24,160
out 0x3,R24
.dbline 118
ldi R24,132
out 0x36,R24
.dbline 118
.dbline 118
.dbline 119
L28:
.dbline 119
L29:
.dbline 119
; Wait();
in R2,0x36
sbrs R2,7
rjmp L28
.dbline 119
.dbline 119
.dbline 120
; if (TestAck()!=MT_SLA_ACK) return 0;
in R24,0x1
andi R24,248
cpi R24,24
breq L31
.dbline 120
clr R16
xjmp L22
L31:
.dbline 121
; Write8Bit(RomAddress);
.dbline 121
out 0x3,R16
.dbline 121
ldi R24,132
out 0x36,R24
.dbline 121
.dbline 121
.dbline 122
L33:
.dbline 122
L34:
.dbline 122
; Wait();
in R2,0x36
sbrs R2,7
rjmp L33
.dbline 122
.dbline 122
.dbline 123
; if (TestAck()!=MT_DATA_ACK) return 0;
in R24,0x1
andi R24,248
cpi R24,40
breq L36
.dbline 123
clr R16
xjmp L22
L36:
.dbline 124
; Start();
ldi R24,164
out 0x36,R24
.dbline 125
L38:
.dbline 125
L39:
.dbline 125
; Wait();
in R2,0x36
sbrs R2,7
rjmp L38
.dbline 125
.dbline 125
.dbline 126
; if (TestAck()!=RE_START) return 0;
in R24,0x1
andi R24,248
cpi R24,16
breq L41
.dbline 126
clr R16
xjmp L22
L41:
.dbline 127
; Write8Bit(rd_device_add);
.dbline 127
ldi R24,161
out 0x3,R24
.dbline 127
ldi R24,132
out 0x36,R24
.dbline 127
.dbline 127
.dbline 128
L43:
.dbline 128
L44:
.dbline 128
; Wait();
in R2,0x36
sbrs R2,7
rjmp L43
.dbline 128
.dbline 128
.dbline 129
; if(TestAck()!=MR_SLA_ACK) return 0;
in R24,0x1
andi R24,248
cpi R24,64
breq L46
.dbline 129
clr R16
xjmp L22
L46:
.dbline 130
; Twi();
ldi R24,132
out 0x36,R24
.dbline 131
L48:
.dbline 131
L49:
.dbline 131
; Wait();
in R2,0x36
sbrs R2,7
rjmp L48
.dbline 131
.dbline 131
.dbline 132
; if(TestAck()!=MR_DATA_NOACK) return 0;
in R24,0x1
andi R24,248
cpi R24,88
breq L51
.dbline 132
clr R16
xjmp L22
L51:
.dbline 133
; temp=TWDR;
in R20,0x3
.dbline 134
; Stop();
ldi R24,148
out 0x36,R24
.dbline 135
; return temp;
mov R16,R20
.dbline -2
L22:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbsym r RomAddress 16 c
.dbend
.dbfunc e i2c_Write _i2c_Write fc
; Wdata -> R20
; RomAddress -> R22
.even
_i2c_Write::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 144
; }
;
; /******************************************
; I2C总线写一个字节
; 返回0:写成功
; 返回非0:写失败
; *******************************************/
; unsigned char i2c_Write(unsigned char RomAddress,unsigned char Wdata)
; {
.dbline 145
; Start();
ldi R24,164
out 0x36,R24
.dbline 146
L54:
.dbline 146
L55:
.dbline 146
; Wait();
in R2,0x36
sbrs R2,7
rjmp L54
.dbline 146
.dbline 146
.dbline 147
; if(TestAck()!=START) return 1;
in R24,0x1
andi R24,248
cpi R24,8
breq L57
.dbline 147
ldi R16,1
xjmp L53
L57:
.dbline 148
; Write8Bit(wr_device_add);
.dbline 148
ldi R24,160
out 0x3,R24
.dbline 148
ldi R24,132
out 0x36,R24
.dbline 148
.dbline 148
.dbline 149
L59:
.dbline 149
L60:
.dbline 149
; Wait();
in R2,0x36
sbrs R2,7
rjmp L59
.dbline 149
.dbline 149
.dbline 150
; if(TestAck()!=MT_SLA_ACK) return 1;
in R24,0x1
andi R24,248
cpi R24,24
breq L62
.dbline 150
ldi R16,1
xjmp L53
L62:
.dbline 151
; Write8Bit(RomAddress);
.dbline 151
out 0x3,R22
.dbline 151
ldi R24,132
out 0x36,R24
.dbline 151
.dbline 151
.dbline 152
L64:
.dbline 152
L65:
.dbline 152
; Wait();
in R2,0x36
sbrs R2,7
rjmp L64
.dbline 152
.dbline 152
.dbline 153
; if(TestAck()!=MT_DATA_ACK) return 1;
in R24,0x1
andi R24,248
cpi R24,40
breq L67
.dbline 153
ldi R16,1
xjmp L53
L67:
.dbline 154
; Write8Bit(Wdata);
.dbline 154
out 0x3,R20
.dbline 154
ldi R24,132
out 0x36,R24
.dbline 154
.dbline 154
.dbline 155
L69:
.dbline 155
L70:
.dbline 155
; Wait();
in R2,0x36
sbrs R2,7
rjmp L69
.dbline 155
.dbline 155
.dbline 156
; if(TestAck()!=MT_DATA_ACK) return 1;
in R24,0x1
andi R24,248
cpi R24,40
breq L72
.dbline 156
ldi R16,1
xjmp L53
L72:
.dbline 157
; Stop();
ldi R24,148
out 0x36,R24
.dbline 158
; delay_ms(10);
ldi R16,10
ldi R17,0
xcall _delay_ms
.dbline 159
; return 0;
clr R16
.dbline -2
L53:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r Wdata 20 c
.dbsym r RomAddress 22 c
.dbend
.dbfunc e twi_init _twi_init fV
.even
_twi_init::
.dbline -1
.dbline 164
; }
;
;
; void twi_init(void)
; {
.dbline 165
; TWCR= 0X00; //disable twi
clr R2
out 0x36,R2
.dbline 166
; TWBR= 0x12; //set bit rate
ldi R24,18
out 0x0,R24
.dbline 167
; TWSR= 0x01; //set prescale
ldi R24,1
out 0x1,R24
.dbline 168
; TWCR= 0x04; //enable twi
ldi R24,4
out 0x36,R24
.dbline -2
L74:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
; i -> <dead>
; key_val -> <dead>
; wr_val -> R20
; j -> R20
; rd_val -> R22
; k -> R10,R11
.even
_main::
.dbline -1
.dbline 175
;
;
;
; }
; //******************************************
; void main(void)
; {
.dbline 176
; uchar key_val,wr_val=0,rd_val,i,j;
clr R20
.dbline 178
; uint k;
; port_init();
xcall _port_init
.dbline 179
; CS_OFF();
sbi 0x18,3
.dbline 180
; delay_ms(10);
ldi R16,10
ldi R17,0
xcall _delay_ms
.dbline 181
; delay_ms(10);
ldi R16,10
ldi R17,0
xcall _delay_ms
xjmp L77
L76:
.dbline 184
; //twi_init();
; while(1)
; {
.dbline 185
; rd_val=12;
ldi R22,12
.dbline 196
;
; //for(i=1; i<255;i++)
; //{
; // i2c_Write(i,i);
; // _delay_us(20);
;
; //adc_to_disbuffer1(16);
;
; //
; //}
; for( j=1; j<255;j++)
ldi R20,1
xjmp L82
L79:
.dbline 197
; {
.dbline 198
; for( k=1; k<1025;k++)
ldi R24,1
ldi R25,0
movw R10,R24
xjmp L86
L83:
.dbline 199
.dbline 200
mov R16,R20
xcall _i2c_Read
mov R22,R16
.dbline 201
xcall _display
.dbline 204
L84:
.dbline 198
movw R24,R10
adiw R24,1
movw R10,R24
L86:
.dbline 198
movw R24,R10
cpi R24,1
ldi R30,4
cpc R25,R30
brlo L83
.dbline 205
L80:
.dbline 196
inc R20
L82:
.dbline 196
cpi R20,255
brlo L79
.dbline 206
L77:
.dbline 183
xjmp L76
X1:
.dbline -2
L75:
.dbline 0 ; func end
ret
.dbsym l i 1 c
.dbsym l key_val 1 c
.dbsym r wr_val 20 c
.dbsym r j 20 c
.dbsym r rd_val 22 c
.dbsym r k 10 i
.dbend
.area bss(ram, con, rel)
.dbfile D:\programe\AVR实验\I2C\TWI-at2401\ac15-3.c
_posit::
.blkb 1
.dbsym e posit _posit c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -