📄 m16.s
字号:
.module m16.c
.area lit(rom, con, rel)
_DisV::
.byte 'V,58,0
.dbfile D:\PROTEU~1.7\PROTEU~1.7\JOHU\a___EWTS82\m16.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\m16.c
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 26
; #include <iom16v.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转换后的值
; void main(void)
; {
.dbline 27
; LcdIni() ;
xcall _LcdIni
.dbline 28
; DisTextConst(0x80,DisV) ;
ldi R18,<_DisV
ldi R19,>_DisV
ldi R16,128
xcall _DisTextConst
.dbline 29
; DisTextConst(0xc0,DisP) ;
ldi R18,<_DisP
ldi R19,>_DisP
ldi R16,192
xcall _DisTextConst
xjmp L3
L2:
.dbline 32
.dbline 33
ldi R16,1
xcall _AdcVal
movw R18,R16
ldi R16,130
xcall _ShowNum
.dbline 34
ldi R16,2
xcall _AdcVal
movw R18,R16
ldi R16,194
xcall _ShowNum
.dbline 35
L3:
.dbline 31
xjmp L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.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 39
;
; while(1)
; {
; ShowNum(0x82,AdcVal(1)) ;
; ShowNum(0xC2,AdcVal(2)) ;
; }
; }
;
; int AdcVal(uchar n)
; {//软件滤波
.dbline 41
; uchar i,k ;
; uint tmp=0 ;
clr R10
clr R11
.dbline 42
; for(i=0 ;i<20 ;i++)
clr R12
xjmp L9
L6:
.dbline 43
mov R16,R20
xcall _AdcValPro
movw R2,R10
add R2,R16
adc R3,R17
lsr R3
ror R2
movw R10,R2
L7:
.dbline 42
inc R12
L9:
.dbline 42
mov R24,R12
cpi R24,20
brlo L6
.dbline 44
; 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 L10
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 L11
L10:
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
L11:
.dbline 45
; Adc[n]=k>5 ? tmp:Adc[n] ;
ldi R24,5
cp R24,R22
brsh L12
movw R22,R10
xjmp L13
L12:
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
L13:
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 46
; 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
L5:
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 50
; }
;
; int AdcValPro(uchar n)
; {//返回第N个ADC的值从0到7
.dbline 53
; 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 54
; 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 55
; ADMUX=0x40+n ; //选择AVCC,选择第N个ADC
mov R24,R20
subi R24,192 ; addi 64
out 0x7,R24
.dbline 56
; ADCSRA=0xc0 ; //允许转换ADEN,ADSC
ldi R24,192
out 0x6,R24
L15:
.dbline 57
L16:
.dbline 57
; while(ADCSRA & BIT(ADSC)) ; //
sbic 0x6,6
rjmp L15
.dbline 58
; dat1=ADCH ;
in R22,0x5
.dbline 59
; dat0=ADCL ;
in R20,0x4
.dbline 60
; 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 62
;
; DDRB=0xff;
ldi R24,255
out 0x17,R24
.dbline 63
; PORTB=val; return val ;
out 0x18,R10
.dbline 63
movw R16,R10
.dbline -2
L14:
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 67
; }
;
; void ShowNum(uchar addr,uint num) //在addr处显示数字num
; {//将num转化成五个BCD码存放在全局数组BCD[5]中
.dbline 69
; uchar i ;
; for(i=5 ;i>0 ;i--) //将NUM数据转化成ASCII码,如521会转化为00521
ldi R20,5
xjmp L22
L19:
.dbline 70
.dbline 71
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 72
ldi R18,10
ldi R19,0
movw R16,R22
xcall div16u
movw R22,R16
.dbline 73
L20:
.dbline 69
dec R20
L22:
.dbline 69
clr R2
cp R2,R20
brlo L19
.dbline 74
; {
; BCD[i-1]=(uchar)(num%10+0x30) ; //取出最低位
; num/=10 ; //去掉最低位
; }
; i=0 ;
clr R20
.dbline 76
; // while(BCD ==0x30 && i<4) BCD[i++]=' ' ; //NUM转换成数组存放,但还没有加上小数点
; BCD[5]='\0' ;
sts _BCD+5,R2
.dbline 77
; DisText(addr,BCD+1) ;
ldi R18,<_BCD+1
ldi R19,>_BCD+1
mov R16,R10
xcall _DisText
.dbline -2
L18:
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 81
; }
;
; void DisText(uchar addr,uchar *p)
; {
.dbline 82
; WrOp(addr) ;
mov R16,R22
xcall _WrOp
xjmp L28
L27:
.dbline 83
movw R30,R20
ld R16,Z+
movw R20,R30
xcall _WrDat
L28:
.dbline 83
; while(*p !='\0')WrDat(*(p++)) ;
movw R30,R20
ldd R2,z+0
tst R2
brne L27
.dbline -2
L26:
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 87
; }
;
; void DisTextConst(uchar addr,uchar const *p)
; {
.dbline 88
; WrOp(addr) ;
mov R16,R22
xcall _WrOp
xjmp L32
L31:
.dbline 89
movw R2,R20
subi R20,255 ; offset = 1
sbci R21,255
movw R30,R2
lpm R16,Z
xcall _WrDat
L32:
.dbline 89
; while(*p !='\0')WrDat(*(p++)) ;
movw R30,R20
lpm R30,Z
tst R30
brne L31
.dbline -2
L30:
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 93
; }
;
; void LcdIni()
; {
.dbline 95
; uint i ;
; DDRD=0XFF ; //设置PA输出
ldi R24,255
out 0x11,R24
.dbline 96
; PORTD=0XFF ; //全部加上上拉电阻
out 0x12,R24
.dbline 97
; DDRC=0XFF ; //设置PC为输出
out 0x14,R24
.dbline 98
; PORTC=0XFF ; //全部加上上拉电阻
out 0x15,R24
.dbline 99
; WrOp(0x38) ;
ldi R16,56
xcall _WrOp
.dbline 100
; WrOp(0x06) ; //光标加1
ldi R16,6
xcall _WrOp
.dbline 101
; WrOp(0x0c) ; //开显示
ldi R16,12
xcall _WrOp
.dbline 102
; WrOp(0x01) ;
ldi R16,1
xcall _WrOp
.dbline 103
clr R20
clr R21
xjmp L38
L35:
.dbline 103
L36:
.dbline 103
subi R20,255 ; offset = 1
sbci R21,255
L38:
.dbline 103
; for(i=0 ;i<5000 ;i++) ;
cpi R20,136
ldi R30,19
cpc R21,R30
brlo L35
.dbline -2
L34:
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 107
; }
;
; void WrOp(uchar dat)
; {
.dbline 109
; uchar i ;
; ChkBusy() ;
xcall _ChkBusy
.dbline 110
; PORTD &=~BIT(rs) ; //RS=0
cbi 0x12,2
.dbline 111
; PORTD &=~BIT(rw) ; //RW=0
cbi 0x12,3
.dbline 112
; PORTD &=~BIT(en) ; //EN=0
cbi 0x12,4
.dbline 113
; PORTC =dat ; //送数据
out 0x15,R20
.dbline 114
; PORTD |=BIT(en) ; //EN=1
sbi 0x12,4
.dbline 115
ldi R20,1
xjmp L43
L40:
.dbline 115
L41:
.dbline 115
inc R20
L43:
.dbline 115
; for(i=1 ;i ;i++) ; //延时
tst R20
brne L40
.dbline 116
; PORTD &=~BIT(en) ; //EN=0
cbi 0x12,4
.dbline -2
L39:
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 120
; }
;
; void WrDat(uchar dat)
; {
.dbline 122
; uchar i ;
; ChkBusy() ;
xcall _ChkBusy
.dbline 123
; PORTD |=BIT(rs) ; //rs=1
sbi 0x12,2
.dbline 124
; PORTD &=~BIT(rw) ; //rw=0
cbi 0x12,3
.dbline 125
; PORTD &=~BIT(en) ; //en=0
cbi 0x12,4
.dbline 126
; PORTC=dat ; //送数据
out 0x15,R20
.dbline 127
; PORTD |=BIT(en) ; //en=1
sbi 0x12,4
.dbline 128
ldi R20,1
xjmp L48
L45:
.dbline 128
L46:
.dbline 128
inc R20
L48:
.dbline 128
; for(i=1 ;i ;i++) ; //延时
tst R20
brne L45
.dbline 129
; PORTD &=~BIT(en) ; //en=0
cbi 0x12,4
.dbline -2
L44:
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 133
; }
;
; void ChkBusy()
; {
.dbline 134
; DDRC=0X00 ; //设置为输入
clr R2
out 0x14,R2
.dbline 135
; PORTC=0X00 ; //不设置上拉电阻
out 0x15,R2
.dbline 136
; PORTD &=~BIT(rs) ; //RS=0
cbi 0x12,2
.dbline 137
; PORTD |=BIT(rw) ; //RW=1
sbi 0x12,3
.dbline 138
; PORTD |=BIT(en) ; //EN=1
sbi 0x12,4
L50:
.dbline 139
L51:
.dbline 139
; while(PINC & 0x80) ; //送数据
sbic 0x13,7
rjmp L50
.dbline 140
; PORTD &=~BIT(en) ; //en=0
cbi 0x12,4
.dbline 141
; DDRC=0xff ; //设置为输出
ldi R24,255
out 0x14,R24
.dbline -2
L49:
.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 145
; }
;
; void delayms(uint n)
; {
.dbline 148
; uchar j ;
; uint i ;
; for(i=0 ;i<n ;i++)
clr R20
clr R21
xjmp L57
L54:
.dbline 149
clr R22
xjmp L61
L58:
.dbline 149
L59:
.dbline 149
inc R22
L61:
.dbline 149
cpi R22,250
brlo L58
L55:
.dbline 148
subi R20,255 ; offset = 1
sbci R21,255
L57:
.dbline 148
cp R20,R16
cpc R21,R17
brlo L54
.dbline -2
L53:
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\m16.c
_Adc::
.blkb 6
.dbsym e Adc _Adc A[6:3]I
_BCD::
.blkb 6
.dbsym e BCD _BCD A[6:6]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -