📄 17khz150ms.asm
字号:
DphAdd1: ;如果tmp4的最高位为1则dph左移一位后加1得到dph
LDA DPH,00H;
ADIM DPH,01H;
LDI Tmp6,00H;
WriteData: ;写数据到前面算出来的偏移地址中
LDA ACountL0,00H;
STA INX,00H ;低四位数据往数据区写ACountL
NOP
ADIM DPL,01H ;索引地址加1
LDI Tmp6,00H;
ADCM DPM,00H ;中间三位带进位加法
BA3 WriteDPHAdd1;如果中间三位加1后大于7则最高三位加1
LDI Tmp6,00H;
JMP WriteData1
WriteDPHAdd1
LDI Tmp6,00H;
ADIM DPH,01H ;高三位带进位加法
WriteData1:
LDA ACountM0,00H;
STA INX,00H ;中四位数据往数据区写ACountM
NOP
ADIM DPL,01H ;索引地址加1
LDI Tmp6,00H;
ADCM DPM,00H ;中间三位带进位加法
BA3 WriteDPHAdd2;如果中间三位加1后大于7则最高三位加1
LDI Tmp6,00H;
JMP WriteData2
WriteDPHAdd2
LDI Tmp6,00H;
ADIM DPH,01H ;高三位带进位加法
WriteData2:
LDI Tmp6,00H;
LDA ACountH0,00H;
STA INX,00H ;中四位数据往数据区写ACountM
NOP
EndAccWrite2Memery:
NOP
RTNI
;***********得到当前通道存放地址偏移[3*(CurrentChnH*16+CurrentChnL)]**********
GetAdrOffset:
SBIM Tmp2,01H ;Tmp2存放每个数据所占的半字节数
BC ADD_CC ;
JMP MUL_OK ;
ADD_CC: LDA Tmp0,00H ;
ADDM Tmp3,00H ;
LDA Tmp1,00H ;
ADCM Tmp4,00H ;
LDI Tmp6,00H ;
ADCM Tmp5,00H ;
JMP GetAdrOffset
MUL_OK:
ADIM Tmp3,00H;
LDI Tmp6,00H;
ADIM Tmp4,09H; 偏移地址上加上基地址40h得到绝对地址
LDI Tmp6,00H;
ADCM Tmp5,00H;
NOP
RTNI
;*********转换下个通道******************************
Turn2NextChn:
NOP
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDI Tmp6,00H;
LDA CurrentChnH,00H;
BNZ Left_Right
SBI CurrentChnL,0EH;
BNC EndTurn2NextChn ;小于0eh的时候,由于是行扫描直接去下一路就可以了
BAZ Jmp2Page
JMP Left_Right ;大于0eh的时候去判断左页还是右页
Left_Right:
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA PageFlg,00H;
BAZ OnLeftPage
JMP OnRightPage
Jmp2Page:
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA PageFlg,00H;
BAZ OnLeftPage;到左页去扫描列
LDI CurrentChnL,08H;跳到右页的列扫描
LDI CurrentChnH,01H;
NOP
RTNI
OnLeftPage:
LDI Tmp0,07H;左页的路数是连续的最大到17h,右页最大到20h
LDI Tmp1,01H;
JMP TurnChanel
OnRightPage:
LDI Tmp0,00H;右页的最大路数到20h
LDI Tmp1,02H;
TurnChanel:
LDA CurrentChnH,00H;
STA Tmp3,00H;
LDA CurrentChnL,00H;
STA Tmp2,00H;
SUBM Tmp0,00H;
LDA Tmp3,00H;
SBCM Tmp1,00H;
BC EndTurn2NextChn;大于的时候去转下一路
DataDeal: ;数据处理部分
LDI SampFlg,1000B;
NOP
RTNI
EndTurn2NextChn:
LDI Tmp6,00H; 转下一个通道
ADIM Tmp6,00H;
LDI Tmp6,00H;
ADIM CurrentChnL,01H;
LDI Tmp6,00H;
ADCM CurrentChnH,00H;
LDI Tmp6,00H;
ADIM Tmp6,00H;
NOP
NOP
RTNI
;**********累加器计数累加子程序*****************
ACountAdd1:
LDI Tmp0,00H ;
ADIM ACountL0,01H ;低位加1
LDI Tmp0,00H ;
ADCM ACountM0,00H ;中间4位加1
;LDI Tmp0,00H ;
;ADCM ACountH0,00H ;高四位加1
LDI Tmp6,00H;
ADIM Tmp6,00H;
SBI CurrentChnL,0FH;域值行和列采用不同的标准
BAZ MaxRowLimit
LDA CurrentChnH,00H;
BNZ MaxRowLimit
LDA ACountM0,00H; 设置域值
BA0 MaxTimeLimit
JMP ENDACount
MaxTimeLimit0Then:
LDA ACountL0,00H; 设置域值
BA1 MaxTimeLimit
JMP ENDACount
MaxRowLimit:
LDA ACountM0,00H; 设置域值
BA0 MaxTimeLimit
JMP ENDACount
MaxTimeLimit1Then:
LDA ACountM0,00H;
BA0 MaxTimeLimit
JMP ENDACount
MaxTimeLimit:
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDI CmpFlg,01H;
LDI ACountL0,0FH;
LDI ACountM0,0FH;
LDI ACountH0,0FH;
LDI SampFlg,0100B;标志最大累时已到,可以跳到下一路去扫描
ENDACount:
NOP
RTNI
;************计算坐标值*******************************
ToComputeXY:
LDI IEX,0000B ;关掉所有中断去处理数据
LDI IRQT,0000B ;清除TIMER0中斷標誌
LDI LINE_D_MARK,00H;d线被标记
LDI AvailX0L,0FH;
LDI AvailX0H,1000B;初始化
LDI AvailX1L,0FH;
LDI AvailX1H,1000B;初始化
LDI AvailY0L,0FH;
LDI AvailY0H,1000B;初始化
LDI AvailY1L,0FH;
LDI AvailY1H,1000B;初始化
LDI AvailFLG3,00H;
LDI AvailFLG2,00H;
LDI AvailFLG1,00H;
LDI AvailFLG0,00H;
GOChooseNextY:
LDI Tmp1,00H;
LDI Tmp0,00H;
GOChooseNextX:
LDI Tmp2,03H;存放每个数据所占的半字节数
LDI Tmp3,00H;当前路数在数据存放取的偏移
LDI Tmp4,00H;
LDI Tmp5,00H;当前路数在数据存放取的偏移
LDI Tmp6,00H;
LDI Tmp7,0FH;比较的数据初始化
LDI Tmp8,0FH;
LDI Tmp9,08H;
LDI TmpA,00H;
LDI TmpB,00H;
LDI TmpC,00H;
ChooseNextMain:
NOP
NOP
LDI Tmp2,03H;
LDI Tmp3,00H;当前路数在数据存放取的偏移
LDI Tmp4,00H;
LDI Tmp5,00H;
CALL GETOFFSET
NOP
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDI DPL,0000B
LDI DPM,0001B;基地址90h
LDI DPH,0001B;
LDA Tmp3,00H;
ADDM DPL,00H;这里由于存放的数据地址选的在100h-17FH,所以最高位不溢出
LDI Tmp6,00H;
LDA Tmp4,00H;
ADCM DPM,00H; 最高位没做处理
LDA INX,00H;
STA TmpA,00H;将预比较数据放如tmp1,tmpb,tmpc中
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDI Tmp6,00H;
ADIM DPL,01H;
LDI Tmp6,00H;
ADCM DPM,00H;
LDA INX,00H;
STA TmpB,00H;
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDI Tmp6,00H;
ADIM DPL,01H;
LDI Tmp6,00H;
ADCM DPM,00H;
LDA INX,00H;
STA TmpC,00H;
BA2 NEXTY ;域值判断,当大于200h的时候
NOP
CALL COMPARE12Bits
NOP
LDA AvailFLG2,00H;
BNZ ToChooseX; 去选择x
;*********选择y线
LDA AvailFLG0,00H;
BA0 NEXTY ;如果AvailFLGX0为1则TmpCTmpBTmpA>Tmp9Tmp8Tmp7不去存放标记
LDA Tmp0,00H; 如果当前路不等于AvailX0中的数据则加载数据
SUB AvailX0L,00H;
BNZ LoadChannel ;NO
LDA Tmp1,00H;
SBC AvailX0H,00H;
BNZ LoadChannel
JMP NEXTY; YES
LoadChannel:
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA AvailFLG1,00H;
BAZ LoadAvailX0 ;first Timer
JMP LoadAvailX1;Second Time
LoadAvailX0:
SBI Tmp0,0DH;如果为od扫描线的话则只做记录而不存入AvailX0L
BAZ MarkScanD ;去作od扫描线的标记
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA TmpA,00H; 将最小的数据放如tmp789
STA Tmp7,00H;
LDA TmpB,00H;
STA Tmp8,00H;
LDA TmpC,00H;
STA Tmp9,00H;
LDA Tmp0,00H;
STA AvailX0L,00H; 最小的数据放入AvailX0
LDA Tmp1,00H;
STA AvailX0H,00H;
JMP NEXTY
MarkScanD:
NOP
LDI LINE_D_MARK,01H;把odh扫描线的标致置1
JMP NEXTY
LoadAvailX1:
SBI Tmp0,0DH;如果为od扫描线的话则只做记录而不存入AvailX0L
BAZ MarkScanD ;去作od扫描线的标记
LDA TmpA,00H; 将最小的数据放如tmp789
STA Tmp7,00H;
LDA TmpB,00H;
STA Tmp8,00H;
LDA TmpC,00H;
STA Tmp9,00H;
LDA Tmp0,00H;
STA AvailX1L,00H; 最小的数据放入AvailX0
LDA Tmp1,00H;
STA AvailX1H,00H;
JMP NEXTY
;**********选择x方向*****************
ToChooseX:
LDA AvailFLG0,00H;
BA0 NEXTY ;如果AvailFLGX0为1则TmpCTmpBTmpA>Tmp9Tmp8Tmp7不去存放标记
LDA Tmp0,00H; 如果当前路不等于AvailX0中的数据则加载数据
SUB AvailY0L,00H;
BNZ LoadChannelX ;NO
LDA Tmp1,00H;
SBC AvailY0H,00H;
BNZ LoadChannelX
JMP NEXTY; YES
LoadChannelX:
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA AvailFLG3,00H;
BAZ LoadAvailX0X ;first Timer
JMP LoadAvailX1X;Second Time
LoadAvailX0X:
LDA TmpA,00H; 将最小的数据放如tmp789
STA Tmp7,00H;
LDA TmpB,00H;
STA Tmp8,00H;
LDA TmpC,00H;
STA Tmp9,00H;
LDA Tmp0,00H;
STA AvailY0L,00H; 最小的数据放入AvailX0
LDA Tmp1,00H;
STA AvailY0H,00H;
JMP NEXTY
LoadAvailX1X:
LDA TmpA,00H; 将最小的数据放如tmp789
STA Tmp7,00H;
LDA TmpB,00H;
STA Tmp8,00H;
LDA TmpC,00H;
STA Tmp9,00H;
LDA Tmp0,00H;
STA AvailY1L,00H; 最小的数据放入AvailX0
LDA Tmp1,00H;
STA AvailY1H,00H;
JMP NEXTY
;*******************************************
NEXTY:
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA Tmp1,00H;
BNZ COMPUTEX
LDA Tmp0,00H;
SBI Tmp0,0FH;如果当前的路数大于等于0F
BNC GOChooseY
JMP COMPUTEX ;当路数小于of时去选y
GOChooseY:
LDA Tmp0,00H;
SBI Tmp0,0EH;
BAZ AvailFLG1Add1
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDI Tmp6,00H; 下一路数据
ADIM Tmp0,01H;
LDI Tmp6,00H;
ADCM Tmp1,00H;
JMP ChooseNextMain
AvailFLG1Add1:
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA AvailFLG1,00H;
BAZ AvailFLG1Equ1
BA0 AvailFLG1Equ2
AvailFLG1Equ1:
LDI AvailFLG1,0001B;
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDI Tmp6,00H; 下一路数据
ADIM Tmp0,01H;
LDI Tmp6,00H;
ADCM Tmp1,00H;
JMP GOChooseNextY
AvailFLG1Equ2:
LDI AvailFLG0,00H;
LDI AvailFLG1,00H;
LDI AvailFLG2,0001B;
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDI Tmp6,00H; 下一路数路,从ofh开始
ADIM Tmp0,01H;
LDI Tmp6,00H;
ADCM Tmp1,00H;
JMP GOChooseNextX
COMPUTEX:
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDI Tmp6,00H; 下一路数路,从10h开始
ADIM Tmp0,01H;
LDI Tmp6,00H;
ADCM Tmp1,00H;
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA Tmp1,00H;
BA0 JudgeLow4X
JMP ERROR
JudgeLow4X:
LDA Tmp0,00H; 判断如果超出最大路数的话则结束查找
SBI Tmp0,08H;
BC JudgeSecond
JMP ChooseNextMain
JudgeSecond:
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA AvailFLG3,00H;
BAZ AvailFLG3Add1
BA0 TOComputeY1_Y2
JMP ERROR
AvailFLG3Add1:
LDI AvailFLG3,01H;
LDI Tmp0,0FH;
LDI Tmp1,00H;
JMP GOChooseNextX
ERROR:
NOP
LDI SysInitFlg,01H;
JMP SYSINI
;*****比较12位数的大小******************
COMPARE12Bits:
LDI AvailFLG0,00H;
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA Tmp7,00H ;get subtrahend low nibble data
SUB TmpA,00H ;low nibble subtraction
;STA ScanCount0L,00H ;save result to RUT_L
LDA Tmp8,00H ;get subtrahend high nibble data
SBC TmpB,00H ;high nibble subtraction
;STA ScanCount0M,00H ;save result to RUT_H
LDA Tmp9,00H ;get subtrahend high nibble data
SBC TmpC,00H ;high nibble subtraction
;STA ScanCount0H,00H ;save result to RUT_H
BC AvailFLGX0Equ1
BAZ ENDSUB12;相等时取第一个
JMP ENDSUB12
AvailFLGX0Equ1:
NOP
LDI AvailFLG0,01H;
ENDSUB12:
NOP
RTNI
;************************************
TOComputeY1_Y2:
IF 0
;********比较x********
LDA AvailX0L,00H;
EOR PreAvailX0L,00H;
BNZ LOOKUPTABLE
LDA AvailX0H,00H;
EOR PreAvailX0H,00H;
BNZ LOOKUPTABLE
LDA AvailX1L,00H;
EOR PreAvailX1L,00H;
BNZ LOOKUPTABLE
LDA AvailX1H,00H;
EOR PreAvailX1H,00H;
BNZ LOOKUPTABLE
;********比较y***************
LDA AvailY0L,00H;
EOR PreAvailY0L,00H;
BNZ LOOKUPTABLE
LDA AvailY0H,00H;
EOR PreAvailY0H,00H;
BNZ LOOKUPTABLE
LDA AvailY1L,00H;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -