📄 17khz150ms.asm
字号:
SBIM Tmp2,01H; 减2
LDI Tmp6,00H;
SBCM Tmp3,00H;
LDI Tmp6,00H;
SBCM Tmp4,00H;
LoadCoordY:
LDA Tmp2,00H;
STA CoordYL,00H;
LDA Tmp3,00H;
STA CoordYH,00H;
JMP ToCoordinateX
;*******去计算x坐标****************
ToCoordinateX:
LDI CoordXL,00H;
LDI CoordXH,08H;初始化x坐标
LDA LINEY0_0H,00H;
BNZ CoordXMain ;当接近0行的坐标为0的时候不去处理
LDA LINEY0_0L,00H;
BNZ JudgeNextDataX ;
LDI SysInitFlg,09H;
JMP SYSINI
JudgeNextDataX:
LDA LINEY0_0L,00H;判断是不是接近第一根线
STA Tmp0,00H;
SBI Tmp0,01H;
BAZ NextDataJudgeX
JMP CoordXMain
NextDataJudgeX:;判断是不是0和1相邻
LDA LINEY1_0H,00H;
BNZ CoordXMain ;
LDA LINEY1_0L,00H;
BAZ CoordXLoadOne;如果是和01相邻,则y坐标为0
JMP CoordXMain
CoordXLoadOne:
LDI CoordXL,01H;
LDI CoordXH,00H;
JMP ToComputeCode
CoordXMain:
LDA LINEY0_0L,00H;
STA Tmp2,00H;相乘以后的结果
LDA LINEY0_0H,00H;
STA Tmp3,00H;
LDI Tmp4,00H;
LDI Tmp6,00H;
ADIM Tmp6,00H; 乘于2
LDA LINEY0_0L,00H;
ADDM Tmp2,00H;
LDA LINEY0_0H,00H;
ADCM Tmp3,00H;
LDI Tmp6,00H;
ADCM Tmp4,00H;
;***判断到底AvailY1H是不是有用数据
;如果一个数据的情况下,默认判为上面线上的***
;如果AvailY1H为8fh的话则直接去加载
LDA AvailY1H,00H;
BA3 LoadCoordX;
;*********判断到底是减1还是减1*******
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA LINEY0_0L,00H;
STA Tmp0,00H;
LDA LINEY0_0H,00H;
STA Tmp1,00H;
LDA LINEY1_0L,00H;
STA Tmp7,00H;
LDA LINEY1_0H,00H;
STA Tmp8,00H;
LDA Tmp0,00H;
SUB Tmp7,00H;判断相邻两根线的大小关系
LDA Tmp1,00H;
SBC Tmp8,00H;
BC LoadCoordX
LDI Tmp6,00H;
ADIM Tmp6,00H;
SBIM Tmp2,01H; 减2
LDI Tmp6,00H;
SBCM Tmp3,00H;
LDI Tmp6,00H;
SBCM Tmp4,00H;
LoadCoordX:
LDA Tmp2,00H;
STA CoordXL,00H;
LDA Tmp3,00H;
STA CoordXH,00H;
JMP ToComputeCode
ToComputeCode:;左页计算序号y*28+x=code
;当在右页的时候可以右公式:code=Y*28+2016+27-X得到
; LDI PageFlg,01H; 调试为右页的时候
LDI FinalCodeHexL,00H;
LDI FinalCodeHexM,00H;
LDI FinalCodeHexH,00H;
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA CoordYL,00H;
STA Tmp0,00H;y值放如tmp1tmp0
LDA CoordYH,00H;
STA Tmp1,00H;
LDI Tmp2,0CH;28
LDI Tmp3,01H;
NOP
CALL AGAIN8Bits
NOP
LDA PageFlg,00H;
BNZ PageRightDataDeal
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA CoordXL,00H;
ADDM FinalCodeHexL,00H;
LDI Tmp6,00H;
LDA CoordXH,00H;
ADCM FinalCodeHexM,00H;
LDI Tmp6,00H;
ADCM FinalCodeHexH,00H;
NOP
JMP SendData
PageRightDataDeal:
LDI Tmp6,00H;
ADIM Tmp6,00H;
ADIM FinalCodeHexL,0BH;加2043
LDI Tmp6,0FH;
ADCM FinalCodeHexM,00H;
LDI Tmp6,07H;
ADCM FinalCodeHexH,00H;
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA CoordXL,00H;
SUBM FinalCodeHexL,00H;减x
LDA CoordXH,00H;
SBCM FinalCodeHexM,00H;
LDI Tmp6,00H;
SBCM FinalCodeHexH,00H;
LDI Tmp6,00H;
ADIM Tmp6,00H;
SendData:
;IF 0
NOP
LDA FinalCodeHexH,00H;
STA Tmp2,00H;
LDA FinalCodeHexM,00H;
STA Tmp1,00H;
LDA FinalCodeHexL,00H;
STA Tmp0,00H;
CALL CHANGE
LDI SendDataBufH,0FH;
LDI SendDataBufL,0FH;
CALL SendOneByte
NOP
LDA CodeDec3,00H;
STA SendDataBufH,00H;
LDA CodeDec2,00H;
STA SendDataBufL,00H;
CALL SendOneByte
NOP
LDA CodeDec1,00H;
STA SendDataBufH,00H;
LDA CodeDec0,00H;
STA SendDataBufL,00H;
CALL SendOneByte
NOP
LDI SendDataBufL,0FH;
LDI SendDataBufH,0FH;
CALL SendOneByte
NOP
;ENDIF
IF 0
LDI SendDataBufH,0AH;
LDI SendDataBufL,0AH;
CALL SendOneByte
NOP
LDI SendDataBufH,00H;
LDA FinalCodeHexH,00H;
STA SendDataBufL,00H;
CALL SendOneByte
NOP
LDA FinalCodeHexM,00H;
STA SendDataBufH,00H;
LDA FinalCodeHexL,00H;
STA SendDataBufL,00H;
CALL SendOneByte
NOP
LDI Tmp3,00H;
LDA FinalCodeHexM,00H;
STA Tmp1,00H;
LDA FinalCodeHexL,00H;
STA Tmp0,00H;
LDA FinalCodeHexH,00H;
STA Tmp2,00H;tmp3&tmp2+tmp1&tmp0
ADDM Tmp0,00H;
LDA Tmp3,00H;
ADCM Tmp1,00H;
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA Tmp1,00H;
STA SendDataBufH,00H;
LDA Tmp0,00H;
STA SendDataBufL,00H;
CALL SendOneByte
NOP
LDI SendDataBufH,05H;
LDI SendDataBufL,05H;
CALL SendOneByte
NOP
ENDIF
;*********输出坐标*****************
;JMP SendData
LDI ACountL0,00H;
LDI ACountM0,00H;
LDI ACountH0,00H;
LDI SampFlg,00H;
LDI TimerFlg,00H;
;LDI PageFlg,00H;
LDI TM0,0EH ;設定計時器頻率為(OSCX)记数时钟为oscx的二分频
LDI T0L,0BH ;設定計時器計數起始值低4 位,载入初始值6输出频率为20khz
LDI T0H,0EH ;設定計時器計數起始值高4 位
LDI IEX,0100B ;设置口中断中断标志位
LDI IRQT,0000B ;清除TIMER0中斷標誌
Call DelayHalfms
JMP PageJudgeMain
;**************************************
AGAIN8Bits:
SBIM Tmp2,01H ;check multiplication is ok ?
BC ADD_CC8Bits ;if CY=1,thin jump to ADD_CC
SBIM Tmp3,01H ;check multilication is ok ?
BC ADD_CC8Bits ;if CY=1,then jump to ADD_CC
JMP MUL_OK8Bits ;end multiplication
ADD_CC8Bits:
LDA Tmp0,00H ;get data
ADDM FinalCodeHexL,00H ;add MA0 to RUT_0
LDA Tmp1,00H ;get data
ADCM FinalCodeHexM,00H ;add CY and MA1 to RUT_1
LDI Tmp6,00H ;clear AC
ADD_RUT_08Bits:
ADCM FinalCodeHexH,00H ;add CY to RUT_2
JMP AGAIN8Bits
MUL_OK8Bits:
NOP
RTNI
;************************************************************************
;**************************************
SYSINI: ;系统初始化
LDI ACountL0,00H ;记数器低四位
LDI ACountM0,00H ;记数器中四位
LDI ACountH0,00H ;记数器高四位
LDI SampFlg,00H;
LDI CurrentChnL,00H;
LDI CurrentChnH,00H;
IF 0
LDI PreAvailX0L,0FH;
LDI PreAvailX0H,08H;
LDI PreAvailX1L,0FH;
LDI PreAvailX1H,08H;
LDI PreAvailY0L,0FH;
LDI PreAvailY0H,08H;
LDI PreAvailY1L,0FH;
LDI PreAvailY1H,08H;
ENDIF
LDI SampFlg,00H;
LDI TimerFlg,00H;
LDI SysInitFlg,00H;
;LDI PageFlg,00H;
LDI TM0,0EH ;設定計時器頻率為(OSCX)记数时钟为oscx的二分频
LDI T0L,0BH ;設定計時器計數起始值低4 位,载入初始值6输出频率为20khz
LDI T0H,0EH ;設定計時器計數起始值高4 位
LDI IEX,0100B ;设置口中断中断标志位
LDI IRQT,0000B ;清除TIMER0中斷標誌
Call DelayHalfms
JMP PageJudgeMain
;将二进制数转为十进制数
IF 1
CHANGE: LDI CodeDec3,00H ;
LDI CodeDec2,00H ;clear result register
LDI CodeDec1,00H
LDI CodeDec0,00H
DOC: LDA Tmp0,00H ;get binary code
ADDM CodeDec0,00H ;add Binary low nibble to BCD0
DAA CodeDec0
LDI Tmp6,00H ;clear AC
ADCM CodeDec1,00H ;add CY to BCD1
DOCG: SBIM Tmp1,01H ;BIN1-1 >0 ?
BC CG2 ;yes,goto CG2
DOCGG: SBIM Tmp2,01H ;
BC DOCLoad ;yes,goto CG2
JMP ENDCH ;no,goto ENDCH
DOCLoad:
LDI Tmp0,0FH;
LDI Tmp6,00H;
ADIM Tmp6,00H;
;***********************
ADIM CodeDec0,01H ;add 16 to result
DAA CodeDec0
LDI Tmp6,00H ;clear AC
ADCM CodeDec1,00H ;add CY to BCD1
DAA CodeDec1 ;adjust BCD1
LDI Tmp6,00H ;clear AC
ADCM CodeDec2,00H ;add CY to BCD2
DAA CodeDec2
LDI Tmp6,00H;
ADCM CodeDec3,00H;
;***********************
JMP DOC
CG2: ADIM CodeDec0,06H ;add 16 to result
DAA CodeDec0
LDI Tmp6,00H ;clear AC
ADCM CodeDec1,00H ;add CY to BCD1
DAA CodeDec1 ;adjust BCD1
LDI Tmp6,00H ;clear AC
ADCM CodeDec2,00H ;add CY to BCD2
DAA CodeDec2
LDI Tmp6,00H;
ADCM CodeDec3,00H;
ADIM CodeDec1,01H
DAA CodeDec1 ;adjust BCD1
LDI Tmp6,00H ;clear AC
ADCM CodeDec2,00H ;add CY to BCD2
DAA CodeDec2
LDI Tmp6,00H;
ADCM CodeDec3,00H;
JMP DOCG
ENDCH: NOP
RTNI ;return to main program
ENDIF
;******得到在表中的便移****************
GETOFFSET:
LDI Tmp6,00H;
ADIM Tmp6,00H;
GETOFFSETLOOP:
SBIM Tmp2,01H ;Tmp2存放每个数据所占的半字节数
BC ADD_CCLOOP ;
JMP ENEMULLOOP ;
ADD_CCLOOP:
LDA Tmp0,00H ;
ADDM Tmp3,00H ;
LDA Tmp1,00H ;
ADCM Tmp4,00H ;
LDI Tmp6,00H ;
ADCM Tmp5,00H ;
JMP GETOFFSETLOOP
ENEMULLOOP:
NOP
RTNI
;******八位的减法*******************
SUB8BITS:
LDI Tmp9,00H;
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA Tmp2,00H ;get subtrahend low nibble data
SUB Tmp4,00H ;low nibble subtraction
STA Tmp0,00H ;save result to RUT_L
LDA Tmp3,00H ;get subtrahend high nibble data
SBC Tmp5,00H ;high nibble subtraction
STA Tmp1,00H ;save result to RUT_H
BC Tmp9Equ1
LDI Tmp9,00H;
JMP ENDSUB
Tmp9Equ1:
LDI Tmp9,01H;
ENDSUB: NOP
RTNI
;***********比较两个一字节数的大小***************
Cmp8Bits: ;tmp0&tmp1>tmp2&tmp3 tmp4==0 , tmp0&tmp1<tmp2&tmp3 tmp4==1 ,else tmp4=2
LDI Tmp4,0FH;
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA Tmp3,00H;
SUB Tmp1,00H;比较两个的大小
BNC Cmp8BitsFLGX1
BAZ Cmp8BitsCMPL4X
LDI Tmp4,00H;
JMP ENDCMP8BITS
Cmp8BitsFLGX1:
LDI Tmp4,01H;
JMP ENDCMP8BITS
Cmp8BitsCMPL4X:
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDA Tmp2,00H;
SUB Tmp0,00H;
BNC Cmp8BitsFLGX1
BAZ Cmp8BitsEQUDEAL1;x0=x1
LDI Tmp4,00H;x0>x1
JMP ENDCMP8BITS
Cmp8BitsEQUDEAL1:
LDI Tmp4,0010B;
;JMP ENDCMP8BITS
ENDCMP8BITS:
NOP
RTNI
;***********发送一个字节的数据到串口波特率38.4k******
;发送数据的高位放在SendDataBufH
;发送数据的低位放SendDataBufL
;
SendOneByte:
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDI SendDataAcc,05H;
FirstHalf:;前半字节和一个开始位
BC SendFirstHigh
NOP
LDI PORTB,1101B;低
JMP AjustBuf
SendFirstHigh:
NOP
LDI PORTB,1111B;高
NOP
AjustBuf:
SBIM SendDataAcc,01H;
BAZ NextHalf
CALL DelayNus
LDA SendDataBufL,00H;
SHR
STA SendDataBufL,00H;
JMP FirstHalf
NextHalf:
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDI SendDataAcc,04H;
CALL DelayNus
FollowSend:
LDA SendDataBufH,00H;
SHR
STA SendDataBufH,00H;
BC SendNextHigh
NOP
LDI PORTB,1101B;低
JMP AjustNext
SendNextHigh:
NOP
LDI PORTB,1111B;gao
AjustNext:
SBIM SendDataAcc,01H;
BAZ EndSendData
CALL DelayNus
JMP FollowSend
EndSendData:
CALL DelayNus
NOP
NOP
NOP
NOP
NOP
LDI PORTB,1111B;
Nop
CALL DelayNus
CALL DelayNus
CALL DelayNus
CALL DelayNus
RTNI
DelayNus:
LDI Tmp0,05H
DelayNus_LOOP:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -