📄 adc.asm
字号:
;/////////////////////////////////////////////////////////////////////
;此子程序将进行AD转换和AD处理,处理后的12位AD值中低八位存放在
;adc_buffer_low中,高四位存放在adc_buffer_hi寄存器的低四位
;/////////////////////////////////////////////////////////////////////
@@adc:
clr adc_buffer_hi
clr adc_buffer_low
call @@adc_converting
call @@adc_converting
call @@adc_converting
call @@adc_converting
call @@adc_converting
call @@adc_converting
call @@adc_converting
call @@adc_converting
@@division_eight:
b0bclr fc
rrcm adc_buffer_low
b0bclr fc
rrcm adc_buffer_low
b0bclr fc
rrcm adc_buffer_low ;将低位向右依三位除八
b0bclr fc
rrcm adc_buffer_hi ;将高位向右移一位然后判断溢出的数是否为1
b0bts0 fc
b0bset adc_buffer_low.5 ;如果为1则将低位第5位置1
b0bclr fc
rrcm adc_buffer_hi
b0bts0 fc
b0bset adc_buffer_low.6
b0bclr fc
rrcm adc_buffer_hi
b0bts0 fc
b0bset adc_buffer_low.7
ret
;/////////////////////////////////////////////////////////////////////
;循环5次进行AD转换,每次的值分别连续放在ADC_BUFFER中
;/////////////////////////////////////////////////////////////////////
@@adc_converting:
b0bset fgchs
mov a #05h
mov temp1 a ;单次循环转换次数重装载
clr y
b0mov z #adc_buffer$l ;取adc_buffer的低位地址
@@cycle_converting:
b0bset fads ;开始转换
@@endconverting:
b0bts1 feoc
jmp @@endconverting
mov a adb
mov @yz a
incms z
nop
mov a adr
and a #0fh
mov @yz a
incms z
nop
decms temp1
jmp @@cycle_converting
;/////////////////////////////////////////////////////////////////////
;将ADC_BUFFER中的数据依大小排序,将最小的数放在ADC_BUFFER中最前面
;/////////////////////////////////////////////////////////////////////
@@sequence_arrange_initialization:
mov a #04h
mov temp2 a
@@sequence_arrange:
mov a #04h
mov temp1 a
clr y
b0mov z #adc_buffer$l ;送adc_bufer的地址到z
@@start_sequence_arrange:
; call @@getdata
@@getdata1:
b0mov a @yz ;将当前YZ的数据送往temp3
mov temp3 a
mov a #2h ;
add z a
mov a @yz ;将后两个地址数据送A
decms z
nop
decms z
nop
; ret
cmprs a temp3 ;判断第一数高8位与第二数的高8位大小
jmp @@check_fc1
@@check_adc_buffer_low:
incms z ;将地址切换到第1位数据的低8位
nop
; call @@getdata
@@getdata2:
b0mov a @yz ;将当前YZ的数据送往temp3
mov temp3 a
mov a #2h ;
add z a
mov a @yz ;将后两个地址数据送A
decms z
nop
decms z
nop
; ret
cmprs a temp3 ;比较两数大小
jmp @@check_fc2
incms z ;将地址切换到第二位数据的高8位
nop
jmp @@next_cycel
@@check_fc1:
b0bts0 fc ;判断第一数高8位与第二数的高8位大小
jmp @@change_add1
; call @@change_adc_buffer_place;交换第一数高8位与第二数的高8位的数据
@@change_adc_buffer_place1:
mov a @yz
mov temp3 a ;将当前高位地址yz数据送往temp3
mov a #2h
add z a ;将地址切到yz+2
mov a @yz ;读取YZ+2地址中的数据送往a
b0xch a temp3 ;将YZ地址中的数据与YZ+2地址中的数据进行交换
mov @yz a
decms z ;将地址切回到yz。
nop
decms z
nop
b0xch a temp3
mov @yz a ;将YZ+2地址中的数据送往yz
; ret
incms z ;将地址切换到第1位数据的低8位
nop
; call @@change_adc_buffer_place;交换第一数低8位与第二数的低8位的数据
@@change_adc_buffer_place2:
mov a @yz
mov temp3 a ;将当前高位地址yz数据送往temp3
mov a #2h
add z a ;将地址切到yz+2
mov a @yz ;读取YZ+2地址中的数据送往a
b0xch a temp3 ;将YZ地址中的数据与YZ+2地址中的数据进行交换
mov @yz a
decms z ;将地址切回到yz。
nop
decms z
nop
b0xch a temp3
mov @yz a ;将YZ+2地址中的数据送往yz
; ret
incms z ;将地址切换到第二位数据的高8位
nop
jmp @@next_cycel
@@change_add1:
mov a #2h ;将地址切换到第二位数据的高8位
add z a
jmp @@next_cycel
@@check_fc2:
b0bts0 fc ;判断第一数低8位与第二数的低8位大小
jmp @@change_add2
; call @@change_adc_buffer_place;交换第一数低8位与第二数的低8位的数据
@@change_adc_buffer_place3:
mov a @yz
mov temp3 a ;将当前高位地址yz数据送往temp3
mov a #2h
add z a ;将地址切到yz+2
mov a @yz ;读取YZ+2地址中的数据送往a
b0xch a temp3 ;将YZ地址中的数据与YZ+2地址中的数据进行交换
mov @yz a
decms z ;将地址切回到yz。
nop
decms z
nop
b0xch a temp3
mov @yz a ;将YZ+2地址中的数据送往yz
; ret
decms z ;将地址切换到第1位数据的高8位
nop
; call @@change_adc_buffer_place;交换第一数高8位与第二数的高8位的数据
@@change_adc_buffer_place4:
mov a @yz
mov temp3 a ;将当前高位地址yz数据送往temp3
mov a #2h
add z a ;将地址切到yz+2
mov a @yz ;读取YZ+2地址中的数据送往a
b0xch a temp3 ;将YZ地址中的数据与YZ+2地址中的数据进行交换
mov @yz a
decms z ;将地址切回到yz。
nop
decms z
nop
b0xch a temp3
mov @yz a ;将YZ+2地址中的数据送往yz
; ret
mov a #2h
add z a ;将地址切换到第二位数据的高8位
jmp @@next_cycel
@@change_add2:
incms z ;将地址切换到第二位数据的高8位
nop
jmp @@next_cycel
@@next_cycel:
decms temp1
jmp @@start_sequence_arrange
decms temp2
jmp @@sequence_arrange
jmp @@exit_sequence_arrange
;/////////////////////////////////////////////////////////////////////
;获取当前YZ地址和YZ+2地址中的数据,分别存在TEMP3和A中
;/////////////////////////////////////////////////////////////////////
;@@getdata:
; b0mov a @yz ;将当前YZ的数据送往temp3
; mov temp3 a
; mov a #2h ;
; add z a
; mov a @yz ;将后两个地址数据送A
; decms z
; nop
; decms z
; nop
; ret
;/////////////////////////////////////////////////////////////////////
;将YZ地址和YZ+2地址中的数据进行交换
;/////////////////////////////////////////////////////////////////////
;@@change_adc_buffer_place:
; mov a @yz
; mov temp3 a ;将当前高位地址yz数据送往temp3
; mov a #2h
; add z a ;将地址切到yz+2
; mov a @yz ;读取YZ+2地址中的数据送往a
; b0xch a temp3 ;将YZ地址中的数据与YZ+2地址中的数据进行交换
; mov @yz a
; decms z ;将地址切回到yz。
; nop
; decms z
; nop
; b0xch a temp3
; mov @yz a ;将YZ+2地址中的数据送往yz
; ret
@@exit_sequence_arrange:
clr y
clr z
@@sum_adc_data:
b0mov z #adc_buffer$l
mov a #4h ;取出AD中间值
add z a
swapm @yz ;将高八位的低四位与高四位交换后送A
mov a @yz
and a #0f0h
incms z
nop
add @yz a ;将原高八位中的低四位与adc值的低四位叠加
mov a @yz ;将AD值的低8位与adc_buffer_low中的数据累加
add adc_buffer_low a
b0bts1 fc ;如果发生进位则将adc_buffer_hi中的值加一
jmp @@sum_adc_buffer_hi
incms adc_buffer_hi
nop
@@sum_adc_buffer_hi:
decms z
nop
mov a #0fh
and @yz a ;将高四位值清0
mov a @yz ;将ADC的高位值与adc_buffer_hi中的值累加
add adc_buffer_hi a
@@ret_adc:
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -