⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 17khz150ms.asm

📁 中颖单片机sh6613的一个坐标扫描程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        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 + -