📄 clock.s
字号:
.module clock.c
.area text(rom, con, rel)
.dbfile C:\icc\examples.avr\zgs\clock.c
.dbfunc e writeclock _writeclock fc
; wordad -> R20
; sla_w -> R22
; j -> R20
; clock_wb -> R16,R17
.even
_writeclock::
xcall push_gset2
.dbline -1
.dbline 18
; #include "iom64v.h"
; #define uchar unsigned char
; #define START 0x08
; #define MT_SLA_ACK 0x18
; #define MT_DATA_ACK 0x28
; #define MR_SLA_ACK 0x40
; #define MR_DATA_ACK 0x50
;
; #define TINT 0x80
; #define TEA 0x40
; #define TSTA 0x20
; #define TSTO 0x10
; #define TWC 0x08
; #define TEN 0x04
; #define TIE 0x01
;
; uchar writeclock(uchar *clock_wb )
; {
.dbline 21
; uchar sla_w,wordad,j;
;
; sla_w=0xa0;
ldi R22,160
.dbline 22
; wordad=0x00;
clr R20
.dbline 23
; TWCR = (TWCR)|(TINT)|(TSTA)|(TEN);
lds R24,116
ori R24,164
sts 116,R24
L2:
.dbline 24
L3:
.dbline 24
; while (!(TWCR &(TINT)));
lds R2,116
sbrs R2,7
rjmp L2
.dbline 26
;
; if ((TWSR & 0xF8) != START)
lds R24,113
andi R24,248
cpi R24,8
breq L5
.dbline 27
; return 0;
clr R16
xjmp L1
L5:
.dbline 29
;
; TWDR = sla_w;
sts 115,R22
.dbline 30
; TWCR = (TWCR)|(TINT)|(TEN);
lds R24,116
ori R24,132
sts 116,R24
L7:
.dbline 31
L8:
.dbline 31
; while (!(TWCR & (TINT)));
lds R2,116
sbrs R2,7
rjmp L7
.dbline 33
;
; if ((TWSR & 0xF8) != MT_SLA_ACK)
lds R24,113
andi R24,248
cpi R24,24
breq L10
.dbline 34
; return 0;
clr R16
xjmp L1
L10:
.dbline 36
;
; TWDR = wordad;
sts 115,R20
.dbline 37
; TWCR = (TWCR)|(TINT)|(TEN);
lds R24,116
ori R24,132
sts 116,R24
L12:
.dbline 38
L13:
.dbline 38
; while (!(TWCR & (TINT)));
lds R2,116
sbrs R2,7
rjmp L12
.dbline 40
;
; if ((TWSR & 0xF8) != MT_DATA_ACK)
lds R24,113
andi R24,248
cpi R24,40
breq L15
.dbline 41
; return 0;
clr R16
xjmp L1
L15:
.dbline 42
; for(j=0;j<8;j++)
clr R20
xjmp L20
L17:
.dbline 43
; {
.dbline 44
; TWDR = clock_wb[j];
mov R30,R20
clr R31
add R30,R16
adc R31,R17
ldd R2,z+0
sts 115,R2
.dbline 45
; TWCR = (TWCR)|(TINT)|(TEN);
lds R24,116
ori R24,132
sts 116,R24
L21:
.dbline 46
L22:
.dbline 46
; while (!(TWCR & (TINT)));
lds R2,116
sbrs R2,7
rjmp L21
.dbline 48
;
; if ((TWSR & 0xF8) != MT_DATA_ACK)
lds R24,113
andi R24,248
cpi R24,40
breq L24
.dbline 49
; return 0;
clr R16
xjmp L1
L24:
.dbline 50
L18:
.dbline 42
inc R20
L20:
.dbline 42
cpi R20,8
brlo L17
.dbline 52
; }
;
; TWCR = (TWCR)|(TINT)|(TEN)|(TSTO);
lds R24,116
ori R24,148
sts 116,R24
.dbline 54
;
; return 1;
ldi R16,1
.dbline -2
L1:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r wordad 20 c
.dbsym r sla_w 22 c
.dbsym r j 20 c
.dbsym r clock_wb 16 pc
.dbend
.dbfunc e readclock _readclock fc
; sla_r -> R20
; wordad -> R20
; sla_w -> R22
; j -> R20
; clock_rb -> R16,R17
.even
_readclock::
xcall push_gset2
.dbline -1
.dbline 58
; }
;
; uchar readclock(uchar *clock_rb )
; {
.dbline 62
; uchar sla_r,j;
; uchar sla_w,wordad;
;
; sla_w=0xa0;
ldi R22,160
.dbline 63
; wordad=0x00;
clr R20
.dbline 65
;
; TWCR = (TWCR)|(TINT)|(TSTA)|(TEN);
lds R24,116
ori R24,164
sts 116,R24
L27:
.dbline 66
L28:
.dbline 66
; while (!(TWCR & (TINT)));
lds R2,116
sbrs R2,7
rjmp L27
.dbline 68
;
; if ((TWSR & 0xF8) != START)
lds R24,113
andi R24,248
cpi R24,8
breq L30
.dbline 69
; return 0;
clr R16
xjmp L26
L30:
.dbline 71
;
; TWDR = sla_w;
sts 115,R22
.dbline 72
; TWCR = (TWCR)|(TINT)|(TEN);
lds R24,116
ori R24,132
sts 116,R24
L32:
.dbline 73
L33:
.dbline 73
; while (!(TWCR & (TINT)));
lds R2,116
sbrs R2,7
rjmp L32
.dbline 75
;
; if ((TWSR & 0xF8) != MT_SLA_ACK)
lds R24,113
andi R24,248
cpi R24,24
breq L35
.dbline 76
; return 0;
clr R16
xjmp L26
L35:
.dbline 79
;
;
; TWDR = wordad;
sts 115,R20
.dbline 80
; TWCR = (TWCR)|(TINT)|(TEN);
lds R24,116
ori R24,132
sts 116,R24
L37:
.dbline 81
L38:
.dbline 81
; while (!(TWCR & (TINT)));
lds R2,116
sbrs R2,7
rjmp L37
.dbline 83
;
; if ((TWSR & 0xF8) != MT_DATA_ACK)
lds R24,113
andi R24,248
cpi R24,40
breq L40
.dbline 84
; return 0;
clr R16
xjmp L26
L40:
.dbline 86
;
; TWCR = (TWCR)|(TINT)|(TSTA)|(TEN);
lds R24,116
ori R24,164
sts 116,R24
L42:
.dbline 87
L43:
.dbline 87
; while (!(TWCR & (TINT)));
lds R2,116
sbrs R2,7
rjmp L42
.dbline 89
;
; if ((TWSR & 0xF8) != START)
lds R24,113
andi R24,248
cpi R24,8
breq L45
.dbline 90
; return 0;
clr R16
xjmp L26
L45:
.dbline 92
;
; sla_r=0xa1;
ldi R20,161
.dbline 93
; TWCR = (TWCR)|(TINT)|(TEN);
lds R24,116
ori R24,132
sts 116,R24
L47:
.dbline 94
L48:
.dbline 94
; while (!(TWCR & (TINT)));
lds R2,116
sbrs R2,7
rjmp L47
.dbline 96
;
; if ((TWSR & 0xF8) != MR_SLA_ACK)
lds R24,113
andi R24,248
cpi R24,64
breq L50
.dbline 97
; return 0;
clr R16
xjmp L26
L50:
.dbline 99
;
; for(j=0;j<8;j++)
clr R20
xjmp L55
L52:
.dbline 100
; {
.dbline 101
; TWCR = (TWCR)|(TINT)|(TEN)|(TEA);
lds R24,116
ori R24,196
sts 116,R24
L56:
.dbline 102
L57:
.dbline 102
; while (!(TWCR & (TINT)));
lds R2,116
sbrs R2,7
rjmp L56
.dbline 103
; if ((TWSR & 0xF8) != MR_DATA_ACK)
lds R24,113
andi R24,248
cpi R24,80
breq L59
.dbline 104
; return 0;
clr R16
xjmp L26
L59:
.dbline 106
mov R30,R20
clr R31
add R30,R16
adc R31,R17
ldd R2,z+0
sts 115,R2
.dbline 108
L53:
.dbline 99
inc R20
L55:
.dbline 99
cpi R20,8
brlo L52
.dbline 110
;
; TWDR = clock_rb[j];
;
; }
;
; TWCR = (TWCR)|(TINT)|(TEN)|(TSTO);
lds R24,116
ori R24,148
sts 116,R24
.dbline 111
; return 1;
ldi R16,1
.dbline -2
L26:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r sla_r 20 c
.dbsym r wordad 20 c
.dbsym r sla_w 22 c
.dbsym r j 20 c
.dbsym r clock_rb 16 pc
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -