📄 lc.s
字号:
.module LC.c
.area text(rom, con, rel)
.dbfile E:\资料文件\MCU\myLC/LCD.h
.dbfunc e LCD_en_write _LCD_en_write fV
.even
_LCD_en_write::
.dbline -1
.dbline 21
; #include <iom16v.h>
; #include <macros.h>
; #include <stdlib.h>
; #include "LCD.h"
;
; #define C1 1 //C1=1uF
; #define L1 100 //L1=100uH
;
; unsigned int last_TCNT1,Cx,Lx;
; unsigned int Cn; //分布电容,单位pf
; unsigned char buf[8]="";
;
; /*------------------------------函数原型声明------------------------------*/
; void delay_nus (unsigned char n);
; void delay_nms (unsigned char n);
; void timer1_init (void);
; void timer2_init (void);
; void calc_Cn (void);
; void calc_Cx (void);
; void calc_Lx (void);
; /*------------------------------------------------------------------------*/
.dbline 22
;
sbi 0x15,1
.dbline 23
; void main(void)
ldi R16,5
xcall _delay_nus
.dbline 24
; {
cbi 0x15,1
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_write_char _LCD_write_char fV
; data_temp -> R22,R23
; command_temp -> R20,R21
; data -> R12,R13
; command -> R10,R11
.even
_LCD_write_char::
xcall push_gset4
movw R12,R18
movw R10,R16
.dbline -1
.dbline 28
; unsigned char k=5;
; /*----取消-----
; OSCCAL=0xA9;
; -------------*/
.dbline 30
;
; DDRA|=LCD_DATA; // 数据为输出
movw R20,R10
.dbline 31
; DDRC|=LCD_RS|LCD_EN; //置位RS和EN
movw R22,R12
.dbline 32
; DDRD=0x00;
ldi R16,20
xcall _delay_nus
.dbline 33
; PORTD=0xFF;
cpi R20,0
cpc R20,R21
brne L3
X0:
.dbline 34
; LCD_init();
.dbline 35
;
sbi 0x15,0
.dbline 36
; while (--k)
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 37
; delay_nms(100);
movw R24,R22
andi R24,240
andi R25,0
in R2,0x1b
clr R3
or R2,R24
or R3,R25
out 0x1b,R2
.dbline 38
;
xcall _LCD_en_write
.dbline 39
; CLI(); //disable all interrupts
lsl R22
rol R23
lsl R22
rol R23
lsl R22
rol R23
lsl R22
rol R23
.dbline 40
; timer1_init();
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 41
; timer2_init();
movw R24,R22
andi R24,240
andi R25,0
in R2,0x1b
clr R3
or R2,R24
or R3,R25
out 0x1b,R2
.dbline 42
; MCUCR = 0x00;
xcall _LCD_en_write
.dbline 43
; GICR = 0x00;
xjmp L4
L3:
.dbline 45
.dbline 46
cbi 0x15,0
.dbline 47
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 48
movw R24,R20
andi R24,240
andi R25,0
in R2,0x1b
clr R3
or R2,R24
or R3,R25
out 0x1b,R2
.dbline 49
xcall _LCD_en_write
.dbline 50
lsl R20
rol R21
lsl R20
rol R21
lsl R20
rol R21
lsl R20
rol R21
.dbline 51
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 52
movw R24,R20
andi R24,240
andi R25,0
in R2,0x1b
clr R3
or R2,R24
or R3,R25
out 0x1b,R2
.dbline 53
xcall _LCD_en_write
.dbline 54
L4:
.dbline -2
L2:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r data_temp 22 i
.dbsym r command_temp 20 i
.dbsym r data 12 i
.dbsym r command 10 i
.dbend
.dbfunc e LCD_set_xy _LCD_set_xy fV
; address -> R20
; y -> R20
; x -> R22
.even
_LCD_set_xy::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 58
; TIMSK = 0x40; //timer interrupt sources
; SEI();
;
; LCD_write_char(0x01,0);
; delay_nms(2);
; while(1);
; }
;
; #pragma interrupt_handler timer2_ovf_isr:5
; void timer2_ovf_isr(void)
; {
; TCCR2 = 0x00; //stop Timer1
; TCCR1B= 0x00; //stop Timer2
; last_TCNT1=TCNT1;
;
.dbline 60
; if((PIND|0xFE)==0xFE) //PORTD.0为0,校准模式,不接Cx和Lx
; {
tst R20
brne L6
.dbline 60
mov R20,R22
subi R20,128 ; addi 128
xjmp L7
L6:
.dbline 62
; LCD_write_char(0x01,0);
; delay_nms(2);
mov R20,R22
subi R20,64 ; addi 192
L7:
.dbline 63
; LCD_set_xy(0,0);
clr R18
clr R19
mov R16,R20
clr R17
xcall _LCD_write_char
.dbline -2
L5:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r address 20 c
.dbsym r y 20 c
.dbsym r x 22 c
.dbend
.dbfunc e LCD_init _LCD_init fV
.even
_LCD_init::
.dbline -1
.dbline 67
;
; LCD_write_char(0,'C');
; LCD_write_char(0,'n');
; LCD_write_char(0,'=');
.dbline 68
; calc_Cn();
ldi R16,30
xcall _delay_nms
.dbline 69
;
clr R18
clr R19
ldi R16,40
ldi R17,0
xcall _LCD_write_char
.dbline 70
; LCD_write_string(0,1,"TCNT1=");
clr R18
clr R19
ldi R16,12
ldi R17,0
xcall _LCD_write_char
.dbline 71
; LCD_write_string(1,1,itoa(buf,last_TCNT1,10));
clr R18
clr R19
ldi R16,1
ldi R17,0
xcall _LCD_write_char
.dbline 72
;
ldi R16,30
xcall _delay_nms
.dbline -2
L8:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_write_string _LCD_write_string fV
; s -> R20,R21
; y -> R10
; x -> R22
.even
_LCD_write_string::
xcall push_gset3
mov R10,R18
mov R22,R16
ldd R20,y+6
ldd R21,y+7
.dbline -1
.dbline 76
; }
; else //测量模式,接入被测元件Cx或Lx
; {
; LCD_write_char(0x01,0);
.dbline 77
; delay_nms(2);
mov R18,R10
mov R16,R22
xcall _LCD_set_xy
xjmp L11
L10:
.dbline 80
.dbline 81
movw R30,R20
ldd R18,z+0
clr R19
clr R16
clr R17
xcall _LCD_write_char
.dbline 82
subi R20,255 ; offset = 1
sbci R21,255
.dbline 83
L11:
.dbline 79
;
; LCD_set_xy(0,0);
movw R30,R20
ldd R2,z+0
tst R2
brne L10
.dbline -2
L9:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r s 20 pc
.dbsym r y 10 c
.dbsym r x 22 c
.dbend
.area data(ram, con, rel)
.dbfile E:\资料文件\MCU\myLC/LCD.h
_buf::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\资料文件\MCU\myLC/LCD.h
.blkb 7
.area idata
.byte 0,0,0,0,0,0,0
.area data(ram, con, rel)
.dbfile E:\资料文件\MCU\myLC/LCD.h
.dbfile E:\资料文件\MCU\myLC\LC.c
.dbsym e buf _buf A[8:8]c
.area text(rom, con, rel)
.dbfile E:\资料文件\MCU\myLC\LC.c
.dbfunc e main _main fV
; k -> R20
.even
_main::
.dbline -1
.dbline 24
.dbline 25
ldi R20,5
.dbline 30
in R24,0x1a
ori R24,240
out 0x1a,R24
.dbline 31
in R24,0x14
ori R24,3
out 0x14,R24
.dbline 32
clr R2
out 0x11,R2
.dbline 33
ldi R24,255
out 0x12,R24
.dbline 34
xcall _LCD_init
xjmp L15
L14:
.dbline 37
ldi R16,100
xcall _delay_nms
L15:
.dbline 36
mov R24,R20
subi R24,1
mov R20,R24
tst R24
brne L14
.dbline 39
cli
.dbline 40
xcall _timer1_init
.dbline 41
xcall _timer2_init
.dbline 42
clr R2
out 0x35,R2
.dbline 43
out 0x3b,R2
.dbline 44
ldi R24,64
out 0x39,R24
.dbline 45
sei
.dbline 47
clr R18
clr R19
ldi R16,1
ldi R17,0
xcall _LCD_write_char
.dbline 48
ldi R16,2
xcall _delay_nms
L17:
.dbline 49
L18:
.dbline 49
xjmp L17
X1:
.dbline -2
L13:
.dbline 0 ; func end
ret
.dbsym r k 20 c
.dbend
.area vector(rom, abs)
.org 16
jmp _timer2_ovf_isr
.area text(rom, con, rel)
.dbfile E:\资料文件\MCU\myLC\LC.c
.dbfunc e timer2_ovf_isr _timer2_ovf_isr fV
.even
_timer2_ovf_isr::
xcall push_lset
sbiw R28,2
.dbline -1
.dbline 54
.dbline 55
clr R2
out 0x25,R2
.dbline 56
out 0x2e,R2
.dbline 57
in R2,0x2c
in R3,0x2d
sts _last_TCNT1+1,R3
sts _last_TCNT1,R2
.dbline 59
in R24,0x10
ori R24,254
cpi R24,254
brne L21
.dbline 60
.dbline 61
clr R18
clr R19
ldi R16,1
ldi R17,0
xcall _LCD_write_char
.dbline 62
ldi R16,2
xcall _delay_nms
.dbline 63
clr R18
clr R16
xcall _LCD_set_xy
.dbline 65
ldi R18,67
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 66
ldi R18,110
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 67
ldi R18,61
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 68
xcall _calc_Cn
.dbline 70
ldi R24,<L23
ldi R25,>L23
std y+1,R25
std y+0,R24
ldi R18,1
clr R16
xcall _LCD_write_string
.dbline 71
ldi R24,10
ldi R25,0
std y+1,R25
std y+0,R24
lds R18,_last_TCNT1
lds R19,_last_TCNT1+1
ldi R16,<_buf
ldi R17,>_buf
xcall _itoa
std y+1,R17
std y+0,R16
ldi R18,1
ldi R16,1
xcall _LCD_write_string
.dbline 73
xjmp L22
L21:
.dbline 75
.dbline 76
clr R18
clr R19
ldi R16,1
ldi R17,0
xcall _LCD_write_char
.dbline 77
ldi R16,2
xcall _delay_nms
.dbline 79
clr R18
clr R16
xcall _LCD_set_xy
.dbline 80
; LCD_write_char(0,'C');
ldi R18,67
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 81
; LCD_write_char(0,'x');
ldi R18,120
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 82
; LCD_write_char(0,'=');
ldi R18,61
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 83
; calc_Cx();
xcall _calc_Cx
.dbline 85
;
; LCD_set_xy(0,1);
ldi R18,1
clr R16
xcall _LCD_set_xy
.dbline 86
; LCD_write_char(0,'L');
ldi R18,76
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 87
; LCD_write_char(0,'x');
ldi R18,120
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 88
; LCD_write_char(0,'=');
ldi R18,61
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 89
; calc_Lx();
xcall _calc_Lx
.dbline 90
; }
L22:
.dbline 92
;
; timer1_init();
xcall _timer1_init
.dbline 93
; timer2_init();
xcall _timer2_init
.dbline -2
L20:
adiw R28,2
xcall pop_lset
.dbline 0 ; func end
reti
.dbend
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 97
; }
;
; void timer1_init(void)
; {
.dbline 98
; TCCR1B = 0x00; //stop
clr R2
out 0x2e,R2
.dbline 99
; TCNT1H = 0x00;
out 0x2d,R2
.dbline 100
; TCNT1L = 0x00;
out 0x2c,R2
.dbline 101
; TCCR1A = 0x00;
out 0x2f,R2
.dbline 110
; /*----取消-----
; OCR1AH = 0x00;
; OCR1AL = 0x39;
; OCR1BH = 0x00;
; OCR1BL = 0x39;
; ICR1H = 0x00;
; ICR1L = 0x39;
; -------------*/
; TCCR1B = 0x06; //start,外部下降沿触发
ldi R24,6
out 0x2e,R24
.dbline -2
L24:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer2_init _timer2_init fV
.even
_timer2_init::
.dbline -1
.dbline 114
; }
;
; void timer2_init(void)
; {
.dbline 115
; TCCR2 = 0x00; //stop
clr R2
out 0x25,R2
.dbline 116
; ASSR = 0x00; //同步计算模式
out 0x22,R2
.dbline 117
; TCNT2 = 0x0A; //置初值,定时0.25s
ldi R24,10
out 0x24,R24
.dbline 121
; /*----取消-----
; OCR2=0x9C;
; -------------*/
; TCCR2 = 0x07; //start,系统时钟1024分频
ldi R24,7
out 0x25,R24
.dbline -2
L25:
.dbline 0 ; func end
ret
.dbend
.dbfunc e calc_Cn _calc_Cn fV
; f -> y+2
.even
_calc_Cn::
xcall push_gset3
sbiw R28,10
.dbline -1
.dbline 125
; }
;
; void calc_Cn(void)
; {
.dbline 126
; float f=1/(last_TCNT1*4)*1000000;
lds R18,_last_TCNT1
lds R19,_last_TCNT1+1
ldi R16,4
ldi R17,0
xcall empy16s
movw R18,R16
ldi R16,1
ldi R17,0
xcall div16u
movw R2,R16
clr R4
clr R5
ldi R20,64
ldi R21,66
ldi R22,15
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32s
xcall long2fp
movw R30,R28
std z+2,R16
std z+3,R17
std z+4,R18
std z+5,R19
.dbline 127
; Cn=(1/(39.4384*f*f*L1)-C1)/1000000;
ldi R16,<L29
ldi R17,>L29
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
ldi R16,<L30
ldi R17,>L30
xcall lpm32
st -y,R19
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -