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

📄 17khz150ms.asm

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