📄 shiyan.s
字号:
.module shiyan.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\徐胜辉\桌面\新建文件夹\shiyan.c
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\徐胜辉\桌面\新建文件夹\shiyan.c
_dispcode::
.blkb 17
.area idata
.byte 48,49,50,51,52,53,54,55,56,57,'A,'B,'C,'D,'E,'F
.byte 0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\徐胜辉\桌面\新建文件夹\shiyan.c
.dbsym e dispcode _dispcode A[17:17]c
_str1::
.blkb 12
.area idata
.byte 'n,'u,'m,'b,'e,'r,32,'i,'s,58,32,0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\徐胜辉\桌面\新建文件夹\shiyan.c
.dbsym e str1 _str1 A[12:12]c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\徐胜辉\桌面\新建文件夹\shiyan.c
.dbfunc e delay1ms _delay1ms fV
; j -> R20,R21
; i -> R16,R17
.even
_delay1ms::
st -y,R20
st -y,R21
.dbline -1
.dbline 15
; #include<iom16v.h>
; #define uchar unsigned char
; #define uint unsigned int
; #define RS_1 PORTA|=(1<<3)
; #define RS_0 PORTA&=~(1<<3)
; #define RW_1 PORTA|=(1<<4)
; #define RW_0 PORTA&=~(1<<4)
; #define EN_1 PORTA|=(1<<5)
; #define EN_0 PORTA&=~(1<<5)
; unsigned char dispcode[]="0123456789ABCDEF";
; unsigned char str1[]={"number is: "};
;
; /*************************lcd1602程序**************************/
; void delay1ms(uint i)//延时1毫秒(不够精确的)
; {
.dbline 17
; unsigned int j;
; for(;i>0;i--)
xjmp L5
L2:
.dbline 18
; for(j=0;j<1142;j++);
clr R20
clr R21
xjmp L9
L6:
.dbline 18
L7:
.dbline 18
subi R20,255 ; offset = 1
sbci R21,255
L9:
.dbline 18
cpi R20,118
ldi R30,4
cpc R21,R30
brlo L6
X0:
L3:
.dbline 17
subi R16,1
sbci R17,0
L5:
.dbline 17
cpi R16,0
cpc R16,R17
brne L2
X1:
.dbline -2
L1:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.dbsym r j 20 i
.dbsym r i 16 i
.dbend
.dbfunc e wr_com _wr_com fV
; com -> R10
.even
_wr_com::
st -y,R10
mov R10,R16
.dbline -1
.dbline 21
; }
; void wr_com(unsigned char com)//写指令//
; {
.dbline 22
; delay1ms(1);
ldi R16,1
ldi R17,0
xcall _delay1ms
.dbline 23
; RS_0;
cbi 0x1b,3
.dbline 24
; RW_0;
cbi 0x1b,4
.dbline 25
; EN_0;
cbi 0x1b,5
.dbline 26
; PORTB=com;
out 0x18,R10
.dbline 27
; delay1ms(1);
ldi R16,1
ldi R17,0
xcall _delay1ms
.dbline 28
; EN_1;
sbi 0x1b,5
.dbline 29
; delay1ms(1);
ldi R16,1
ldi R17,0
xcall _delay1ms
.dbline 30
; EN_0;
cbi 0x1b,5
.dbline -2
L10:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r com 10 c
.dbend
.dbfunc e wr_dat _wr_dat fV
; dat -> R10
.even
_wr_dat::
st -y,R10
mov R10,R16
.dbline -1
.dbline 33
; }
; void wr_dat(unsigned char dat)//写数据//
; {
.dbline 34
; delay1ms(1);
ldi R16,1
ldi R17,0
xcall _delay1ms
.dbline 35
; RS_1;
sbi 0x1b,3
.dbline 36
; RW_0;
cbi 0x1b,4
.dbline 37
; EN_0;
cbi 0x1b,5
.dbline 38
; PORTB=dat;
out 0x18,R10
.dbline 39
; delay1ms(1);
ldi R16,1
ldi R17,0
xcall _delay1ms
.dbline 40
; EN_1;
sbi 0x1b,5
.dbline 41
; delay1ms(1);
ldi R16,1
ldi R17,0
xcall _delay1ms
.dbline 42
; EN_0;
cbi 0x1b,5
.dbline -2
L11:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r dat 10 c
.dbend
.dbfunc e lcd_init _lcd_init fV
.even
_lcd_init::
.dbline -1
.dbline 45
; }
; void lcd_init()//初始化设置//
; {
.dbline 46
; DDRB|=0xFF; /*I/O口方向设置*/
in R24,0x17
ori R24,255
out 0x17,R24
.dbline 47
; DDRA|=(1<<3)|(1<<4)|(1<<5);
in R24,0x1a
ori R24,56
out 0x1a,R24
.dbline 48
; delay1ms(15);
ldi R16,15
ldi R17,0
xcall _delay1ms
.dbline 49
; wr_com(0x38);delay1ms(5);
ldi R16,56
xcall _wr_com
.dbline 49
ldi R16,5
ldi R17,0
xcall _delay1ms
.dbline 50
; wr_com(0x08);delay1ms(5);
ldi R16,8
xcall _wr_com
.dbline 50
ldi R16,5
ldi R17,0
xcall _delay1ms
.dbline 51
; wr_com(0x01);delay1ms(5);
ldi R16,1
xcall _wr_com
.dbline 51
ldi R16,5
ldi R17,0
xcall _delay1ms
.dbline 52
; wr_com(0x06);delay1ms(5);
ldi R16,6
xcall _wr_com
.dbline 52
ldi R16,5
ldi R17,0
xcall _delay1ms
.dbline 53
; wr_com(0x0c);delay1ms(5);
ldi R16,12
xcall _wr_com
.dbline 53
ldi R16,5
ldi R17,0
xcall _delay1ms
.dbline -2
L12:
.dbline 0 ; func end
ret
.dbend
.dbfunc e display _display fV
; p -> R20,R21
.even
_display::
st -y,R20
st -y,R21
movw R20,R16
.dbline -1
.dbline 57
; }
;
; void display(unsigned char *p)//显示//
; {
xjmp L15
L14:
.dbline 59
; while(*p!='\0')
; {
.dbline 60
; wr_dat(*p);
movw R30,R20
ldd R16,z+0
xcall _wr_dat
.dbline 61
; p++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 62
; delay1ms(1);
ldi R16,1
ldi R17,0
xcall _delay1ms
.dbline 63
; }
L15:
.dbline 58
movw R30,R20
ldd R2,z+0
tst R2
brne L14
X2:
.dbline -2
L13:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.dbsym r p 20 pc
.dbend
.dbfunc e delay_18B20 _delay_18B20 fV
; time -> R16,R17
.even
_delay_18B20::
.dbline -1
.dbline 68
; }
;
; /******************************ds1820程序***************************************/
; void delay_18B20(int time)
; {
L18:
.dbline 70
; do
; time--;
subi R16,1
sbci R17,0
L19:
.dbline 71
; while(time>1);
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlt L18
X3:
.dbline -2
L17:
.dbline 0 ; func end
ret
.dbsym r time 16 I
.dbend
.dbfunc e ds1820rst _ds1820rst fc
; ack -> R20
.even
_ds1820rst::
st -y,R20
.dbline -1
.dbline 74
; }
; unsigned char ds1820rst()/*ds1820复位*/
; {
.dbline 76
; unsigned char ack;
; DDRA|=0x01;
sbi 0x1a,0
.dbline 77
; PORTA&=0xfe;
in R24,0x1b
andi R24,254
out 0x1b,R24
.dbline 78
; delay_18B20(500);
ldi R16,500
ldi R17,1
xcall _delay_18B20
.dbline 79
; PORTA|=0x01;
sbi 0x1b,0
.dbline 80
; DDRA&=0xfe;
in R24,0x1a
andi R24,254
out 0x1a,R24
.dbline 81
; delay_18B20(75);
ldi R16,75
ldi R17,0
xcall _delay_18B20
.dbline 82
; ack=PINA;
in R20,0x19
.dbline 83
; ack&=0x01;
andi R20,1
.dbline 84
; delay_18B20(500);
ldi R16,500
ldi R17,1
xcall _delay_18B20
.dbline 85
; return ack;
mov R16,R20
.dbline -2
L21:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r ack 20 c
.dbend
.dbfunc e ds1820rd _ds1820rd fc
; byte -> R20
; temp -> R10
; i -> R22
.even
_ds1820rd::
xcall push_xgsetF00C
.dbline -1
.dbline 89
; }
;
; unsigned char ds1820rd()/*读数据*/
; {
.dbline 91
; unsigned char i,byte,temp;
; byte=0x00;
clr R20
.dbline 92
; for (i=0;i<8;i++)
clr R22
xjmp L26
L23:
.dbline 93
; {
.dbline 94
; DDRA|=0x01;
sbi 0x1a,0
.dbline 95
; PORTA&=0xfe;//给脉冲信号
in R24,0x1b
andi R24,254
out 0x1b,R24
.dbline 96
; delay_18B20(3);
ldi R16,3
ldi R17,0
xcall _delay_18B20
.dbline 97
; PORTA|=0x01;
sbi 0x1b,0
.dbline 98
; DDRA&=0xfe;
in R24,0x1a
andi R24,254
out 0x1a,R24
.dbline 99
; delay_18B20(10);
ldi R16,10
ldi R17,0
xcall _delay_18B20
.dbline 100
; temp=(PINA&0x01);
in R24,0x19
andi R24,1
mov R10,R24
.dbline 101
; if(temp!=0x00)
tst R24
breq L27
X4:
.dbline 102
; byte|=0x80;
ori R20,128
L27:
.dbline 103
; if(i<7)
cpi R22,7
brsh L29
X5:
.dbline 104
; byte=byte>>1;
lsr R20
L29:
.dbline 105
; delay_18B20(100);
ldi R16,100
ldi R17,0
xcall _delay_18B20
.dbline 106
; DDRA|=0x01;
sbi 0x1a,0
.dbline 107
; delay_18B20(5);
ldi R16,5
ldi R17,0
xcall _delay_18B20
.dbline 108
; }
L24:
.dbline 92
inc R22
L26:
.dbline 92
cpi R22,8
brlo L23
X6:
.dbline 109
; return byte;
mov R16,R20
.dbline -2
L22:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r byte 20 c
.dbsym r temp 10 c
.dbsym r i 22 c
.dbend
.dbfunc e ds1820wr _ds1820wr fV
; i -> R22
; j -> R10
; wdata -> R20
.even
_ds1820wr::
xcall push_xgsetF00C
mov R20,R16
.dbline -1
.dbline 113
; }
;
; void ds1820wr(uchar wdata)/*写数据*/
; {
.dbline 115
; unsigned char i,j;
; DDRA|=0x01;
sbi 0x1a,0
.dbline 116
; for (j=0;j<=7;j++)
clr R10
xjmp L35
L32:
.dbline 117
; {
.dbline 118
; i=wdata&0x01;
mov R22,R20
andi R22,1
.dbline 119
; if(i==0x01)
cpi R22,1
brne L36
X7:
.dbline 120
; {
.dbline 121
; PORTA&=0xfe;
in R24,0x1b
andi R24,254
out 0x1b,R24
.dbline 122
; delay_18B20(10);
ldi R16,10
ldi R17,0
xcall _delay_18B20
.dbline 123
; PORTA|=0x01;
sbi 0x1b,0
.dbline 124
; delay_18B20(100);
ldi R16,100
ldi R17,0
xcall _delay_18B20
.dbline 125
; }
xjmp L37
L36:
.dbline 127
; else
; {
.dbline 128
; PORTA&=0xfe;
in R24,0x1b
andi R24,254
out 0x1b,R24
.dbline 129
; delay_18B20(100);
ldi R16,100
ldi R17,0
xcall _delay_18B20
.dbline 130
; PORTA|=0x01;
sbi 0x1b,0
.dbline 131
; delay_18B20(10);
ldi R16,10
ldi R17,0
xcall _delay_18B20
.dbline 132
; }
L37:
.dbline 133
; wdata=wdata>>1;
lsr R20
.dbline 134
; }
L33:
.dbline 116
inc R10
L35:
.dbline 116
ldi R24,7
cp R24,R10
brsh L32
X8:
.dbline -2
L31:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r i 22 c
.dbsym r j 10 c
.dbsym r wdata 20 c
.dbend
.dbfunc e asc2con _asc2con fV
; i -> R10
; temp -> R20
; len -> R12
; q -> R14,R15
.even
_asc2con::
xcall push_xgset30FC
mov R12,R18
movw R14,R16
.dbline -1
.dbline 138
; }
; /************将十六进制转换成ASCII码,并送LCD显示****************/
; void asc2con(unsigned char *q,unsigned char len)
; {
.dbline 140
; unsigned char temp,i;
; wr_com(0xc0);
ldi R16,192
xcall _wr_com
.dbline 141
; for(i=0;i<len;i++)
clr R10
xjmp L42
L39:
.dbline 142
; {
.dbline 143
; temp=q[len-1-i]&0xf0;
mov R2,R10
clr R3
mov R30,R12
clr R31
sbiw R30,1
sub R30,R2
sbc R31,R3
add R30,R14
adc R31,R15
ldd R20,z+0
andi R20,240
.dbline 144
; temp=temp>>4;
mov R24,R20
swap R24
andi R24,#0x0F
mov R20,R24
.dbline 145
; wr_dat(dispcode[temp]);
ldi R24,<_dispcode
ldi R25,>_dispcode
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _wr_dat
.dbline 146
; temp=q[len-1-i]&0x0f;
mov R2,R10
clr R3
mov R30,R12
clr R31
sbiw R30,1
sub R30,R2
sbc R31,R3
add R30,R14
adc R31,R15
ldd R20,z+0
andi R20,15
.dbline 147
; wr_dat(dispcode[temp]);
ldi R24,<_dispcode
ldi R25,>_dispcode
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _wr_dat
.dbline 148
; }
L40:
.dbline 141
inc R10
L42:
.dbline 141
cp R10,R12
brsh X10
xjmp L39
X10:
X9:
.dbline -2
L38:
.dbline 0 ; func end
xjmp pop_xgset30FC
.dbsym r i 10 c
.dbsym r temp 20 c
.dbsym r len 12 c
.dbsym r q 14 pc
.dbend
.dbfunc e main _main fV
; a -> y+0
; i -> R20
.even
_main::
sbiw R28,8
.dbline -1
.dbline 152
; }
; /********************主程序***********************************/
; void main()
; {
.dbline 154
; unsigned char a[8],i;
; lcd_init();
xcall _lcd_init
.dbline 155
; display(str1);
ldi R16,<_str1
ldi R17,>_str1
xcall _display
.dbline 156
; ds1820rst();
xcall _ds1820rst
.dbline 157
; delay1ms(1);
ldi R16,1
ldi R17,0
xcall _delay1ms
.dbline 158
; ds1820wr(0x33);
ldi R16,51
xcall _ds1820wr
.dbline 159
; for(i=0;i<8;i++)
clr R20
xjmp L47
L44:
.dbline 160
; {
.dbline 161
; a[i]=ds1820rd();
xcall _ds1820rd
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
std z+0,R16
.dbline 162
; }
L45:
.dbline 159
inc R20
L47:
.dbline 159
cpi R20,8
brlo L44
X11:
.dbline 163
; asc2con(a,8);
ldi R18,8
movw R16,R28
xcall _asc2con
L48:
.dbline 164
; while(1);
L49:
.dbline 164
xjmp L48
X12:
.dbline -2
L43:
.dbline 0 ; func end
adiw R28,8
ret
.dbsym l a 0 A[8:8]c
.dbsym r i 20 c
.dbend
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -