📄 thermometer-c51.s
字号:
.module Thermometer-C51.c
.area data(ram, con, rel)
_Table::
.blkb 2
.area idata
.byte 63,6
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 91,'O
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'f,'m
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 125,7
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 127,'o
.area data(ram, con, rel)
.dbfile J:\AVRpractice\BOOK\SPI\Thermometer-C51.c
.dbsym e Table _Table A[10:10]c
.area text(rom, con, rel)
.dbfile J:\AVRpractice\BOOK\SPI\Thermometer-C51.c
.dbfunc e DelayMs _DelayMs fV
; j -> R20,R21
; i -> R16,R17
.even
_DelayMs::
rcall push_gset1
.dbline -1
.dbline 12
; #include <IO8535V.h>
; #include <MACROS.H>
; #define uchar unsigned char
; #define uint unsigned int
; uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
; //SPI INTERFACE
; //sbit CE=PD^4; 置1:|0x10 ,置0:&0xef
; //sbit SDI=PD^5; 置1:|0x20 ,置0:&0xdf
; //sbit SDO=PD^6; 置1:|0x40 ,置0:&0xbf
; //sbit SCLK=PD^7; 置1:|0x80 ,置0:&0x7f
; void DelayMs(uint i)
; {uint j;
.dbline 13
; for(;i!=0;i--)
rjmp L5
L2:
.dbline 14
.dbline 14
ldi R20,2000
ldi R21,7
rjmp L9
L6:
.dbline 14
.dbline 14
.dbline 14
L7:
.dbline 14
subi R20,1
sbci R21,0
L9:
.dbline 14
cpi R20,0
cpc R20,R21
brne L6
X0:
.dbline 14
L3:
.dbline 13
subi R16,1
sbci R17,0
L5:
.dbline 13
cpi R16,0
cpc R16,R17
brne L2
X1:
.dbline -2
.dbline 15
; {for(j=2000;j!=0;j--) {;}}
; }
L1:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r j 20 i
.dbsym r i 16 i
.dbend
.dbfunc e DelayNOP _DelayNOP fV
; i -> R16
.even
_DelayNOP::
.dbline -1
.dbline 18
;
; void DelayNOP(uchar i)
; {for(;i!=0;i--)
.dbline 18
rjmp L14
L11:
.dbline 19
.dbline 19
nop
.dbline 19
L12:
.dbline 18
dec R16
L14:
.dbline 18
tst R16
brne L11
.dbline -2
.dbline 20
; { NOP();}
; }
L10:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e Display _Display fV
; sel -> R20
; i -> R22
; p -> R10,R11
.even
_Display::
rcall push_gset3
mov R10,R16
mov R11,R17
.dbline -1
.dbline 23
;
; void Display(uchar *p)
; {uchar i,sel=0x01;
.dbline 23
ldi R20,1
.dbline 24
; for(i=0;i<4;i++)
clr R22
rjmp L19
L16:
.dbline 25
.dbline 25
out 0x1b,R20
.dbline 26
mov R30,R22
clr R31
add R30,R10
adc R31,R11
ldd R30,z+0
clr R31
ldi R24,<_Table
ldi R25,>_Table
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
ldi R24,255
ldi R25,0
sub R24,R2
sbc R25,R3
out 0x15,R24
.dbline 27
ldi R16,2
ldi R17,0
rcall _DelayMs
.dbline 28
lsl R20
.dbline 29
L17:
.dbline 24
inc R22
L19:
.dbline 24
cpi R22,4
brlo L16
.dbline -2
.dbline 30
; {PORTA=sel;
; PORTC=0xff-Table[p[i]];
; DelayMs(2);
; sel=sel<<1;
; }
; }
L15:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r sel 20 c
.dbsym r i 22 c
.dbsym r p 10 pc
.dbend
.dbfunc e Set_CE _Set_CE fV
; i -> R16
.even
_Set_CE::
.dbline -1
.dbline 33
;
; void Set_CE(uchar i)
; {if(i==1) PORTD=PORTD|0x10;
.dbline 33
cpi R16,1
brne L21
.dbline 33
sbi 0x12,4
L21:
.dbline 34
tst R16
brne L23
.dbline 34
in R24,0x12
andi R24,239
out 0x12,R24
L23:
.dbline -2
.dbline 34
; if(i==0) PORTD=PORTD&0xef;}
L20:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e Set_SDI _Set_SDI fV
; i -> R16
.even
_Set_SDI::
.dbline -1
.dbline 37
;
; void Set_SDI(uchar i)
; {if(i==1) PORTD=PORTD|0x20;
.dbline 37
cpi R16,1
brne L26
.dbline 37
sbi 0x12,5
L26:
.dbline 38
tst R16
brne L28
.dbline 38
in R24,0x12
andi R24,223
out 0x12,R24
L28:
.dbline -2
.dbline 38
; if(i==0) PORTD=PORTD&0xdf;}
L25:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e Set_SCLK _Set_SCLK fV
; i -> R16
.even
_Set_SCLK::
.dbline -1
.dbline 41
;
; void Set_SCLK(uchar i)
; {if(i==1) PORTD=PORTD|0x80;
.dbline 41
cpi R16,1
brne L31
.dbline 41
sbi 0x12,7
L31:
.dbline 42
tst R16
brne L33
.dbline 42
in R24,0x12
andi R24,127
out 0x12,R24
L33:
.dbline -2
.dbline 42
; if(i==0) PORTD=PORTD&0x7f;}
L30:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e SPI_Init _SPI_Init fV
.even
_SPI_Init::
.dbline -1
.dbline 45
;
; void SPI_Init(void)
; {Set_CE(0);//CE=0;//Disable Chip_Select
.dbline 45
clr R16
rcall _Set_CE
.dbline 46
; Set_SCLK(1);//SCLK=1;//Clock Polarity(CPOL)=1
ldi R16,1
.dbline -2
.dbline 47
; }
L35:
.dbline 0 ; func end
rjmp _Set_SCLK
.dbend
.dbfunc e SPI_Process _SPI_Process fV
; i -> R22
; p2 -> R20,R21
; p1 -> R22,R23
.even
_SPI_Process::
rcall push_gset2
mov R20,R18
mov R21,R19
mov R22,R16
mov R23,R17
.dbline -1
.dbline 50
;
; void SPI_Process(uchar *p1,uchar *p2)
; {uchar i;
.dbline 51
; p2[0]=p1[0]/100;
ldi R17,100
mov R30,R22
mov R31,R23
ldd R16,z+0
rcall div8u
mov R30,R20
mov R31,R21
std z+0,R16
.dbline 52
; i=p1[0]%100;
ldi R17,100
mov R30,R22
mov R31,R23
ldd R16,z+0
rcall mod8u
mov R22,R16
.dbline 53
; p2[1]=i/10;
ldi R17,10
rcall div8u
mov R30,R20
mov R31,R21
std z+1,R16
.dbline 54
; p2[2]=i-p2[1]*10;
mov R30,R20
mov R31,R21
ldd R17,z+1
ldi R16,10
rcall mpy8s
mov R2,R22
sub R2,R16
mov R30,R20
mov R31,R21
std z+2,R2
.dbline 55
; p2[3]=0;
clr R2
mov R30,R20
mov R31,R21
std z+3,R2
.dbline -2
.dbline 56
; }
L36:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 22 c
.dbsym r p2 20 pc
.dbsym r p1 22 pc
.dbend
.dbfunc e SPI_Write1Byte _SPI_Write1Byte fV
; i -> R20
; Data -> R22
; Address -> R10
.even
_SPI_Write1Byte::
rcall push_gset3
mov R22,R18
mov R10,R16
.dbline -1
.dbline 59
;
; void SPI_Write1Byte(uchar Address,uchar Data)
; {uchar i;
.dbline 60
; Set_SDI(0);//SDI=0;
clr R16
rcall _Set_SDI
.dbline 61
; Set_SCLK(1);//SCLK=1;//CPOL=1
ldi R16,1
rcall _Set_SCLK
.dbline 62
; Set_CE(1);//CE=1;//Enable Chip_Select
ldi R16,1
rcall _Set_CE
.dbline 63
; for(i=0;i<8;i++) //送地址;
clr R20
rjmp L41
L38:
.dbline 64
; {Set_SCLK(0);//SCLK=0;//时钟恢复
.dbline 64
clr R16
rcall _Set_SCLK
.dbline 65
; if(Address&0x80) Set_SDI(1);//SDI=1;//MSB first
sbrs R10,7
rjmp L42
.dbline 65
ldi R16,1
rcall _Set_SDI
rjmp L43
L42:
.dbline 66
; else Set_SDI(0);//SDI=0;
clr R16
rcall _Set_SDI
L43:
.dbline 67
lsl R10
.dbline 68
ldi R16,1
rcall _Set_SCLK
.dbline 69
ldi R16,30
rcall _DelayNOP
.dbline 69
L39:
.dbline 63
inc R20
L41:
.dbline 63
cpi R20,8
brlo L38
.dbline 70
; Address=Address<<1;//左移
; Set_SCLK(1);//SCLK=1;//上升沿完成,锁存
; DelayNOP(30);}
; for(i=0;i<8;i++) //送地址;
clr R20
rjmp L47
L44:
.dbline 71
; {Set_SCLK(0);//SCLK=0;//时钟恢复
.dbline 71
clr R16
rcall _Set_SCLK
.dbline 72
; if(Data&0x80) Set_SDI(1);//SDI=1;//MSB first
sbrs R22,7
rjmp L48
.dbline 72
ldi R16,1
rcall _Set_SDI
rjmp L49
L48:
.dbline 73
; else Set_SDI(0);//SDI=0;
clr R16
rcall _Set_SDI
L49:
.dbline 74
lsl R22
.dbline 75
ldi R16,1
rcall _Set_SCLK
.dbline 76
ldi R16,30
rcall _DelayNOP
.dbline 76
L45:
.dbline 70
inc R20
L47:
.dbline 70
cpi R20,8
brlo L44
.dbline 77
; Data=Data<<1;//左移
; Set_SCLK(1);//SCLK=1;//上升沿完成,锁存
; DelayNOP(30);}
; Set_CE(0);//CE=0;
clr R16
rcall _Set_CE
.dbline -2
.dbline 78
; }
L37:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r Data 22 c
.dbsym r Address 10 c
.dbend
.dbfunc e SPI_Read1Byte _SPI_Read1Byte fc
; temp -> R20
; i -> R22
; Address -> R10
.even
_SPI_Read1Byte::
rcall push_gset3
mov R10,R16
.dbline -1
.dbline 81
;
; uchar SPI_Read1Byte(uchar Address)
; {uchar i,temp;
.dbline 83
; //SDO=1;
; Set_SCLK(1);//SCLK=1;//CPOL=1
ldi R16,1
rcall _Set_SCLK
.dbline 84
; Set_CE(1);//CE=1;//Enable Chip_Select
ldi R16,1
rcall _Set_CE
.dbline 85
; for(i=0;i<8;i++) //送地址;
clr R22
rjmp L54
L51:
.dbline 86
; {Set_SCLK(0);//SCLK=0;//时钟恢复
.dbline 86
clr R16
rcall _Set_SCLK
.dbline 87
; if(Address&0x80) Set_SDI(1);//SDI=1;//MSB first
sbrs R10,7
rjmp L55
.dbline 87
ldi R16,1
rcall _Set_SDI
rjmp L56
L55:
.dbline 88
; else Set_SDI(0);//SDI=0;
clr R16
rcall _Set_SDI
L56:
.dbline 89
lsl R10
.dbline 90
ldi R16,1
rcall _Set_SCLK
.dbline 91
ldi R16,30
rcall _DelayNOP
.dbline 91
L52:
.dbline 85
inc R22
L54:
.dbline 85
cpi R22,8
brlo L51
.dbline 92
; Address=Address<<1;//左移
; Set_SCLK(1);//SCLK=1;//上升沿完成,锁存
; DelayNOP(30);}
; for(i=0;i<8;i++)
clr R22
rjmp L60
L57:
.dbline 93
; {Set_SCLK(0);//SCLK=0;//提供一个下降沿接收一位数据
.dbline 93
clr R16
rcall _Set_SCLK
.dbline 94
; temp=temp<<1;
lsl R20
.dbline 95
; DelayNOP(30);
ldi R16,30
rcall _DelayNOP
.dbline 96
; if(PIND&0x40) temp=temp|0x01;
sbis 0x10,6
rjmp L61
.dbline 96
ori R20,1
L61:
.dbline 98
ldi R16,1
rcall _Set_SCLK
.dbline 99
ldi R16,30
rcall _DelayNOP
.dbline 99
L58:
.dbline 92
inc R22
L60:
.dbline 92
cpi R22,8
brlo L57
.dbline 100
; //if(SDO) temp=temp|0x01;//采样
; Set_SCLK(1);//SCLK=1;//时钟恢复
; DelayNOP(30);}
; Set_CE(0);//CE=0;//Disbale Chip_Select
clr R16
rcall _Set_CE
.dbline 101
; return(temp);
mov R16,R20
.dbline -2
L50:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbsym r i 22 c
.dbsym r Address 10 c
.dbend
.dbfunc e main _main fV
; i -> <dead>
; Temp -> y+2
; Read_Temp -> y+0
.even
_main::
sbiw R28,6
.dbline -1
.dbline 105
; }
;
; void main(void)
; {uchar Read_Temp[2];
.dbline 108
; uchar Temp[4];
; uchar i;
; DDRA=0xff;
ldi R24,255
out 0x1a,R24
.dbline 109
; DDRC=0xff;
out 0x14,R24
.dbline 110
; DDRD=0xbf;
ldi R24,191
out 0x11,R24
.dbline 111
; PORTA=0xff;
ldi R24,255
out 0x1b,R24
.dbline 112
; PORTC=0x00;
clr R2
out 0x15,R2
.dbline 113
; DelayMs(2500);
ldi R16,2500
ldi R17,9
rcall _DelayMs
.dbline 114
; PORTC=0xff;
ldi R24,255
out 0x15,R24
.dbline 115
; SPI_Init();
rcall _SPI_Init
.dbline 116
; SPI_Write1Byte(0x80,0xf0);//1 1 1 1SHOT R2 R1 R0 SD,8bit sampling
ldi R18,240
ldi R16,128
rcall _SPI_Write1Byte
rjmp L65
L64:
.dbline 119
.dbline 119
ldi R16,1
rcall _SPI_Read1Byte
std y+1,R16
.dbline 120
ldi R16,2
rcall _SPI_Read1Byte
std y+0,R16
.dbline 121
mov R18,R28
mov R19,R29
subi R18,254 ; offset = 2
sbci R19,255
mov R16,R28
mov R17,R29
rcall _SPI_Process
.dbline 123
mov R16,R28
mov R17,R29
subi R16,254 ; offset = 2
sbci R17,255
rcall _Display
.dbline 124
L65:
.dbline 118
rjmp L64
X2:
.dbline -2
.dbline 125
; //1 1 1 1 0 0 0 0//SD=0 indicate continuous convertion
; while(1)
; {Read_Temp[1]=SPI_Read1Byte(0x01);//Low Byte
; Read_Temp[0]=SPI_Read1Byte(0x02);//Hign Byte
; SPI_Process(Read_Temp,Temp);
; //DelayMs(250);
; Display(Temp);
; }
; }
L63:
adiw R28,6
.dbline 0 ; func end
ret
.dbsym l i 1 c
.dbsym l Temp 2 A[4:4]c
.dbsym l Read_Temp 0 A[2:2]c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -