📄 m128.s
字号:
.module m128.c
.area lit(rom, con, rel)
_DisV::
.byte 'V,58,0
.dbfile D:\PROTEU~1.7\PROTEU~1.7\JOHU\a___EWTS82\m128.c
.dbsym e DisV _DisV A[3:3]kc
_DisP::
.byte 'P,58,0
.dbsym e DisP _DisP A[3:3]kc
.area text(rom, con, rel)
.dbfile D:\PROTEU~1.7\PROTEU~1.7\JOHU\a___EWTS82\m128.c
.dbfunc e asc_tran1 _asc_tran1 fV
; asc_p -> y+4
; y -> R20
; x -> R22
.even
_asc_tran1::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 34
; #include <iom128v.h>
; #define uchar unsigned char
; #define uint unsigned int
; #define LcdBus PORTA
; #define BIT(i) (1<<i)
; #define rs 2 //LCD端口定义
; #define rw 3
; #define en 4
;
; const char DisV[]={"V:"} ;//灵敏度
; const char DisP[]={"P:"} ;//精确度
;
; void LcdIni(void) ;
; void WrOp(uchar dat) ;
; void WrDat(uchar dat) ;
; void ChkBusy(void) ;
; void DisText(uchar addr,uchar *text) ;
; void DisTextConst(uchar addr,uchar const *text) ;
; void ShowNum(uchar addr,uint num) ; //在addr处显示数字num
; int AdcVal(uchar n) ;
; void delayms(uint n) ;
; int AdcValPro(uchar n) ;
; char BCD[6] ; //十位二进制的显示码分别是千百十个位的显示
; int Adc[3] ; //存放Adc转换后的值
;
;
;
;
;
;
; /* 传送ASCII字母到LCD */
; /* x:0x00~0x0f y:0~64 */
; void asc_tran1(unsigned char x,unsigned char y,unsigned char *asc_p)
; {
.dbline 35
; x+=4;
subi R22,252 ; addi 4
.dbline 37
; //while((*asc_p)!=0)
; {
.dbline 38
; ocmj_write(0xf1);
ldi R16,241
ldi R17,0
xcall _ocmj_write
.dbline 39
; ocmj_write(x);
mov R16,R22
clr R17
xcall _ocmj_write
.dbline 40
; ocmj_write(y);
mov R16,R20
clr R17
xcall _ocmj_write
.dbline 41
; ocmj_write(*asc_p);
ldd R30,y+4
ldd R31,y+5
ldd R16,z+0
clr R17
xcall _ocmj_write
.dbline 42
; asc_p++;
ldd R24,y+4
ldd R25,y+5
adiw R24,1
std y+5,R25
std y+4,R24
.dbline 43
; if (x<0x13)
cpi R22,19
brsh L2
.dbline 44
; x++;
inc R22
xjmp L3
L2:
.dbline 46
; else
; {
.dbline 47
; x=0x04;
ldi R22,4
.dbline 48
; y+=8;
subi R20,248 ; addi 8
.dbline 49
; }
L3:
.dbline 50
; }
.dbline -2
L1:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l asc_p 4 pc
.dbsym r y 20 c
.dbsym r x 22 c
.dbend
.area lit(rom, con, rel)
L5:
.byte 48,49
.byte 50,51
.byte 52,53
.byte 54,55
.byte 56,57
.area text(rom, con, rel)
.dbfile D:\PROTEU~1.7\PROTEU~1.7\JOHU\a___EWTS82\m128.c
.dbfunc e main _main fV
; code -> y+2
; a -> R20,R21
; i -> R22,R23
; x -> R10,R11
.even
_main::
sbiw R28,12
.dbline -1
.dbline 53
; }
; void main(void)
; {int x=0,a=0,i=0;
.dbline 53
clr R10
clr R11
.dbline 53
clr R20
clr R21
.dbline 53
clr R22
clr R23
.dbline 54
; char code[]={'0','1','2','3','4','5','6','7','8','9',};
ldi R24,<L5
ldi R25,>L5
movw R30,R28
adiw R30,2
ldi R16,10
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 55
; ocmj_init();//初始化
xcall _ocmj_init
.dbline 56
; ocmj_write(0xf4);//清屏
ldi R16,244
ldi R17,0
xcall _ocmj_write
.dbline 57
; hz_tran(3,0,"数模转换");//传送内部汉字
ldi R24,<L6
ldi R25,>L6
std y+1,R25
std y+0,R24
clr R18
clr R19
ldi R16,3
ldi R17,0
xcall _hz_tran
xjmp L8
L7:
.dbline 59
; while(1)
; {
.dbline 61
;
; x=(int )AdcVal(1);
ldi R16,1
xcall _AdcVal
movw R10,R16
.dbline 62
; for(i=0;i<7;i++)
clr R22
clr R23
L10:
.dbline 63
.dbline 63
ldi R18,10
ldi R19,0
movw R16,R10
xcall mod16s
movw R20,R16
.dbline 64
movw R24,R28
adiw R24,2
movw R2,R20
add R2,R24
adc R3,R25
std y+1,R3
std y+0,R2
ldi R18,50
ldi R16,10
sub R16,R22
sbc R17,R23
xcall _asc_tran1
.dbline 65
ldi R18,10
ldi R19,0
movw R16,R10
xcall div16s
movw R10,R16
.dbline 66
L11:
.dbline 62
subi R22,255 ; offset = 1
sbci R23,255
.dbline 62
cpi R22,7
ldi R30,0
cpc R23,R30
brlt L10
.dbline 67
clr R10
clr R11
.dbline 72
L8:
.dbline 58
xjmp L7
X0:
.dbline -2
L4:
adiw R28,12
.dbline 0 ; func end
ret
.dbsym l code 2 A[10:10]c
.dbsym r a 20 I
.dbsym r i 22 I
.dbsym r x 10 I
.dbend
.dbfunc e AdcVal _AdcVal fI
; k -> R22
; i -> R12
; tmp -> R10,R11
; n -> R20
.even
_AdcVal::
xcall push_gset4
mov R20,R16
.dbline -1
.dbline 76
; {a=x%10;
; asc_tran1(10-i,50,& code[a]);
; x=x/10;
; }
; x=0;
; /* ADCSRA = 0x00; //disable adc
; ADMUX = 0x00; //select adc input 0
; ACSR = 0x80;
; ADCSRA = 0x86;*/
; }
; }
;
; int AdcVal(uchar n)
; {//软件滤波
.dbline 78
; uchar i,k ;
; uint tmp=0 ;
clr R10
clr R11
.dbline 79
; for(i=0 ;i<20 ;i++)
clr R12
xjmp L18
L15:
.dbline 80
mov R16,R20
xcall _AdcValPro
movw R2,R10
add R2,R16
adc R3,R17
lsr R3
ror R2
movw R10,R2
L16:
.dbline 79
inc R12
L18:
.dbline 79
mov R24,R12
cpi R24,20
brlo L15
.dbline 81
; tmp=(tmp+AdcValPro(n))/2 ;
; k=tmp>Adc[n] ? (tmp-Adc[n]):(Adc[n]-tmp) ;
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_Adc
ldi R25,>_Adc
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
cp R2,R10
cpc R3,R11
brsh L19
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_Adc
ldi R25,>_Adc
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
movw R22,R10
sub R22,R2
sbc R23,R3
xjmp L20
L19:
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_Adc
ldi R25,>_Adc
add R30,R24
adc R31,R25
ldd R22,z+0
ldd R23,z+1
sub R22,R10
sbc R23,R11
L20:
.dbline 82
; Adc[n]=k>5 ? tmp:Adc[n] ;
ldi R24,5
cp R24,R22
brsh L21
movw R22,R10
xjmp L22
L21:
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_Adc
ldi R25,>_Adc
add R30,R24
adc R31,R25
ldd R22,z+0
ldd R23,z+1
L22:
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_Adc
ldi R25,>_Adc
add R30,R24
adc R31,R25
std z+1,R23
std z+0,R22
.dbline 83
; return Adc[n] ;
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_Adc
ldi R25,>_Adc
add R30,R24
adc R31,R25
ldd R16,z+0
ldd R17,z+1
.dbline -2
L14:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r k 22 c
.dbsym r i 12 c
.dbsym r tmp 10 i
.dbsym r n 20 c
.dbend
.dbfunc e AdcValPro _AdcValPro fI
; dat0 -> R20
; dat1 -> R22
; val -> R10,R11
; n -> R20
.even
_AdcValPro::
xcall push_gset3
mov R20,R16
.dbline -1
.dbline 87
; }
;
; int AdcValPro(uchar n)
; {//返回第N个ADC的值从0到7
.dbline 90
; uchar dat1,dat0 ;
; int val ;
; DDRA &=~BIT(n) ; //设置对应的ADC口为输入
ldi R16,1
mov R17,R20
xcall lsl8
mov R2,R16
com R2
in R3,0x1a
and R3,R2
out 0x1a,R3
.dbline 91
; PORTA &=~BIT(n) ;
ldi R16,1
mov R17,R20
xcall lsl8
mov R2,R16
com R2
in R3,0x1b
and R3,R2
out 0x1b,R3
.dbline 92
; ADMUX=0x40+n ; //选择AVCC,选择第N个ADC
mov R24,R20
subi R24,192 ; addi 64
out 0x7,R24
.dbline 93
; ADCSRA=0xc0 ; //允许转换ADEN,ADSC
ldi R24,192
out 0x6,R24
L24:
.dbline 94
L25:
.dbline 94
; while(ADCSRA & BIT(ADSC)) ; //
sbic 0x6,6
rjmp L24
.dbline 95
; dat1=ADCH ;
in R22,0x5
.dbline 96
; dat0=ADCL ;
in R20,0x4
.dbline 97
; val=ADCH*256+ADCL ;
in R18,0x5
clr R19
ldi R16,256
ldi R17,1
xcall empy16s
movw R10,R16
in R2,0x4
clr R3
add R10,R2
adc R11,R3
.dbline 98
; ADCSRA=0x00 ;
clr R2
out 0x6,R2
.dbline 99
; return val ;
movw R16,R10
.dbline -2
L23:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r dat0 20 c
.dbsym r dat1 22 c
.dbsym r val 10 I
.dbsym r n 20 c
.dbend
.dbfunc e ShowNum _ShowNum fV
; i -> R20
; num -> R22,R23
; addr -> R10
.even
_ShowNum::
xcall push_gset3
movw R22,R18
mov R10,R16
.dbline -1
.dbline 103
; }
;
; void ShowNum(uchar addr,uint num) //在addr处显示数字num
; {//将num转化成五个BCD码存放在全局数组BCD[5]中
.dbline 105
; uchar i ;
; for(i=5 ;i>0 ;i--) //将NUM数据转化成ASCII码,如521会转化为00521
ldi R20,5
xjmp L31
L28:
.dbline 106
.dbline 107
ldi R18,10
ldi R19,0
movw R16,R22
xcall mod16u
movw R24,R16
adiw R24,48
ldi R30,<_BCD-1
ldi R31,>_BCD-1
mov R26,R20
clr R27
add R26,R30
adc R27,R31
st x,R24
.dbline 108
ldi R18,10
ldi R19,0
movw R16,R22
xcall div16u
movw R22,R16
.dbline 109
L29:
.dbline 105
dec R20
L31:
.dbline 105
clr R2
cp R2,R20
brlo L28
.dbline 110
; {
; BCD[i-1]=(uchar)(num%10+0x30) ; //取出最低位
; num/=10 ; //去掉最低位
; }
; i=0 ;
clr R20
.dbline 112
; // while(BCD ==0x30 && i<4) BCD[i++]=' ' ; //NUM转换成数组存放,但还没有加上小数点
; BCD[5]='\0' ;
sts _BCD+5,R2
.dbline 113
; DisText(addr,BCD+1) ;
ldi R18,<_BCD+1
ldi R19,>_BCD+1
mov R16,R10
xcall _DisText
.dbline -2
L27:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r num 22 i
.dbsym r addr 10 c
.dbend
.dbfunc e DisText _DisText fV
; p -> R20,R21
; addr -> R22
.even
_DisText::
xcall push_gset2
movw R20,R18
mov R22,R16
.dbline -1
.dbline 117
; }
;
; void DisText(uchar addr,uchar *p)
; {
.dbline 118
; WrOp(addr) ;
mov R16,R22
xcall _WrOp
xjmp L37
L36:
.dbline 119
movw R30,R20
ld R16,Z+
movw R20,R30
xcall _WrDat
L37:
.dbline 119
; while(*p !='\0')WrDat(*(p++)) ;
movw R30,R20
ldd R2,z+0
tst R2
brne L36
.dbline -2
L35:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r p 20 pc
.dbsym r addr 22 c
.dbend
.dbfunc e DisTextConst _DisTextConst fV
; p -> R20,R21
; addr -> R22
.even
_DisTextConst::
xcall push_gset2
movw R20,R18
mov R22,R16
.dbline -1
.dbline 123
; }
;
; void DisTextConst(uchar addr,uchar const *p)
; {
.dbline 124
; WrOp(addr) ;
mov R16,R22
xcall _WrOp
xjmp L41
L40:
.dbline 125
movw R2,R20
subi R20,255 ; offset = 1
sbci R21,255
movw R30,R2
lpm R16,Z
xcall _WrDat
L41:
.dbline 125
; while(*p !='\0')WrDat(*(p++)) ;
movw R30,R20
lpm R30,Z
tst R30
brne L40
.dbline -2
L39:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r p 20 pkc
.dbsym r addr 22 c
.dbend
.dbfunc e LcdIni _LcdIni fV
; i -> R20,R21
.even
_LcdIni::
xcall push_gset1
.dbline -1
.dbline 129
; }
;
; void LcdIni()
; {
.dbline 131
; uint i ;
; DDRD=0XFF ; //设置PA输出
ldi R24,255
out 0x11,R24
.dbline 132
; PORTD=0XFF ; //全部加上上拉电阻
out 0x12,R24
.dbline 133
; DDRC=0XFF ; //设置PC为输出
out 0x14,R24
.dbline 134
; PORTC=0XFF ; //全部加上上拉电阻
out 0x15,R24
.dbline 135
; WrOp(0x38) ;
ldi R16,56
xcall _WrOp
.dbline 136
; WrOp(0x06) ; //光标加1
ldi R16,6
xcall _WrOp
.dbline 137
; WrOp(0x0c) ; //开显示
ldi R16,12
xcall _WrOp
.dbline 138
; WrOp(0x01) ;
ldi R16,1
xcall _WrOp
.dbline 139
clr R20
clr R21
xjmp L47
L44:
.dbline 139
L45:
.dbline 139
subi R20,255 ; offset = 1
sbci R21,255
L47:
.dbline 139
; for(i=0 ;i<5000 ;i++) ;
cpi R20,136
ldi R30,19
cpc R21,R30
brlo L44
.dbline -2
L43:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbend
.dbfunc e WrOp _WrOp fV
; i -> R20
; dat -> R20
.even
_WrOp::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 143
; }
;
; void WrOp(uchar dat)
; {
.dbline 145
; uchar i ;
; ChkBusy() ;
xcall _ChkBusy
.dbline 146
; PORTD &=~BIT(rs) ; //RS=0
cbi 0x12,2
.dbline 147
; PORTD &=~BIT(rw) ; //RW=0
cbi 0x12,3
.dbline 148
; PORTD &=~BIT(en) ; //EN=0
cbi 0x12,4
.dbline 149
; PORTC =dat ; //送数据
out 0x15,R20
.dbline 150
; PORTD |=BIT(en) ; //EN=1
sbi 0x12,4
.dbline 151
ldi R20,1
xjmp L52
L49:
.dbline 151
L50:
.dbline 151
inc R20
L52:
.dbline 151
; for(i=1 ;i ;i++) ; //延时
tst R20
brne L49
.dbline 152
; PORTD &=~BIT(en) ; //EN=0
cbi 0x12,4
.dbline -2
L48:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r dat 20 c
.dbend
.dbfunc e WrDat _WrDat fV
; i -> R20
; dat -> R20
.even
_WrDat::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 156
; }
;
; void WrDat(uchar dat)
; {
.dbline 158
; uchar i ;
; ChkBusy() ;
xcall _ChkBusy
.dbline 159
; PORTD |=BIT(rs) ; //rs=1
sbi 0x12,2
.dbline 160
; PORTD &=~BIT(rw) ; //rw=0
cbi 0x12,3
.dbline 161
; PORTD &=~BIT(en) ; //en=0
cbi 0x12,4
.dbline 162
; PORTC=dat ; //送数据
out 0x15,R20
.dbline 163
; PORTD |=BIT(en) ; //en=1
sbi 0x12,4
.dbline 164
ldi R20,1
xjmp L57
L54:
.dbline 164
L55:
.dbline 164
inc R20
L57:
.dbline 164
; for(i=1 ;i ;i++) ; //延时
tst R20
brne L54
.dbline 165
; PORTD &=~BIT(en) ; //en=0
cbi 0x12,4
.dbline -2
L53:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r dat 20 c
.dbend
.dbfunc e ChkBusy _ChkBusy fV
.even
_ChkBusy::
.dbline -1
.dbline 169
; }
;
; void ChkBusy()
; {
.dbline 170
; DDRC=0X00 ; //设置为输入
clr R2
out 0x14,R2
.dbline 171
; PORTC=0X00 ; //不设置上拉电阻
out 0x15,R2
.dbline 172
; PORTD &=~BIT(rs) ; //RS=0
cbi 0x12,2
.dbline 173
; PORTD |=BIT(rw) ; //RW=1
sbi 0x12,3
.dbline 174
; PORTD |=BIT(en) ; //EN=1
sbi 0x12,4
L59:
.dbline 175
L60:
.dbline 175
; while(PINC & 0x80) ; //送数据
sbic 0x13,7
rjmp L59
.dbline 176
; PORTD &=~BIT(en) ; //en=0
cbi 0x12,4
.dbline 177
; DDRC=0xff ; //设置为输出
ldi R24,255
out 0x14,R24
.dbline -2
L58:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delayms _delayms fV
; i -> R20,R21
; j -> R22
; n -> R16,R17
.even
_delayms::
xcall push_gset2
.dbline -1
.dbline 181
; }
;
; void delayms(uint n)
; {
.dbline 184
; uchar j ;
; uint i ;
; for(i=0 ;i<n ;i++)
clr R20
clr R21
xjmp L66
L63:
.dbline 185
clr R22
xjmp L70
L67:
.dbline 185
L68:
.dbline 185
inc R22
L70:
.dbline 185
cpi R22,250
brlo L67
L64:
.dbline 184
subi R20,255 ; offset = 1
sbci R21,255
L66:
.dbline 184
cp R20,R16
cpc R21,R17
brlo L63
.dbline -2
L62:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r j 22 c
.dbsym r n 16 i
.dbend
.area bss(ram, con, rel)
.dbfile D:\PROTEU~1.7\PROTEU~1.7\JOHU\a___EWTS82\m128.c
_Adc::
.blkb 6
.dbsym e Adc _Adc A[6:3]I
_BCD::
.blkb 6
.dbsym e BCD _BCD A[6:6]c
.area data(ram, con, rel)
.dbfile D:\PROTEU~1.7\PROTEU~1.7\JOHU\a___EWTS82\m128.c
L6:
.blkb 9
.area idata
.byte 202,253,196,163,215,170,187,187,0
.area data(ram, con, rel)
.dbfile D:\PROTEU~1.7\PROTEU~1.7\JOHU\a___EWTS82\m128.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -