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

📄 pen.asm

📁 完整的方案
💻 ASM
字号:
RxDly:                           .EQU 0x80
TxDly:                           .EQU 0x100
TxWaitT:                         .EQU 0x0000  //50ms
ModeCmd:                         .EQU 0x10
ParaCmd:                         .EQU 0x20
VerCmd:                          .EQU 0x30
ParaAddr:                        .EQU 0x100+FPara-1
VerAddr:                         .EQU 0x100+FVer-1
ParaLen:                         .EQU 22
VerLen:                          .EQU 17
TxNum:                           .EQU _Tmp1
TxAddr:                          .EQU _Tmp2
TxLen:                           .EQU _Tmp3
RxCmdBak:                        .EQU _Tmp1
RxNum:                           .EQU _Tmp2
RxLen:                           .EQU _Tmp3
RxCSBak:                         .EQU _Tmp4

dTxNoAckErr:                     .EQU 1
dTxNibbleWaitLoErr:              .EQU 2
dTxNibbleWaitHiErr:              .EQU 3

//   0:  Ok
//   1:  No sign error
//   2:  Mode umatched error
//   3:  Checksum error
//   4:  Wait low clk error
//   5:  Wait high clk error
//   6:  Cmd 0 Error

ComTxMode:
         R1|=ModeCmd
         [_CommBuf]=R1
         R1=_CommBuf
         [TxAddr]=R1
         R1=1
         JMP ComTxStr

ComTxPara:
         R1=ParaCmd
         [ParaAddr]=R1
         R1=ParaAddr
         [TxAddr]=R1
         R1=ParaLen
         JMP ComTxStr

ComTxVer:
         R1=VerCmd
         [VerAddr]=R1
         R1=VerAddr
         [TxAddr]=R1
         R1=VerLen

ComTxStr:
         [TxLen]=R1
         R3=[TxAddr]                   // Addr
         R1=[TxLen]
         [TxNum]=R1                    // Length
         CALL ClrAck                   // ACK=0
ComTxStrWClkL:
         R1=TxWaitT
ComTxStrWClkL0:
         R1-=1
         JE ComTxWaitAckErr
         R2+=1
         R2=[P_IOA_Data]
         TEST R2, PClkB
         JNE ComTxStrWClkL0

         CALL ComTxNibble              // shake hand
         CMP R1, 0
         JNE ComTxStrErr1
         R4=0
ComTxStr0:
         R1=[R3]
         R1=R1 LSR 4
         R1&=0x0f
         CALL ComTxNibble              // High nibble
         CMP R1, 0
         JNE ComTxStrErr2
         R1=[R3]
         R1&=0x0f
         CALL ComTxNibble              // Low nibble
         CMP R1, 0
         JNE ComTxStrErr3
         R3+=1                         // Addr++
         R1=[TxNum]
         R1-=1
         [TxNum]=R1                    // Len--
         JNE ComTxStr0
         R1=R4
         R1&=0x0f
         CALL ComTxNibble              // CheckSum
         CMP R1, 0
         JNE ComTxStrErr4
         R1=0
         RETF

ComTxWaitAckErr:
         R1=dTxNoAckErr
         JMP ComTxStrErr_
ComTxStrErr4:
         R1+=0x10
ComTxStrErr3:
         R1+=0x10
ComTxStrErr2:       
         R1+=0x10
ComTxStrErr1:
         R1+=0x10
ComTxStrErr_:
         R4=R1
         CALL SetAck
         CALL Delay2ms
         R1=R4
         RETF
         
ComTxNibble:
         R4+=R1
         R5=R1
         R5&=0x0f
         R5|=0xf000
ComTxNibble0:
         R1=[P_IOA_Buffer]
         TEST R5, Bit0
         JNE  ComTxNibbleHi
ComTxNibbleLo:
         R1&=PDatB_
         JMP ComTxNibble_
ComTxNibbleHi:
         R1|=PDatB
ComTxNibble_:
         R1&=PAckB_
         [P_IOA_Buffer]=R1             //  Tx data & Ack=0
ComTxNibbleWL:
         R1=TxDly
ComTxNibbleWL0:
         R1-=1
         JNE ComTxNibbleWL_
         R1=dTxNibbleWaitLoErr
         RETF
ComTxNibbleWL_:
         R2=[P_IOA_Data]
         TEST R2, PClkB
         JNE ComTxNibbleWL0
ComTxNibbleWH:
         R2=[P_IOA_Buffer]
         R2|=PAckB
         [P_IOA_Buffer]=R2             //  Ack=1
         R1=TxDly
ComTxNibbleWH0:
         R1-=1
         JNE ComTxNibbleWH_
         R1=dTxNibbleWaitHiErr
         RETF
ComTxNibbleWH_:
         R2=[P_IOA_Data]
         TEST R2, PClkB
         JE ComTxNibbleWH0
ComTxNibble2:
         R5=R5 LSR 1
         TEST R5, BitC
         JNE ComTxNibble0
ComTxNibbleE:
         R1=0
         RETF

         
ComRx:
         R1=[P_IOA_Data]
         TEST R1, PClkB
         JE ComRx_1
ComRxErr1:
         R1=dRxNoSign
         RETF

ComRx_1:
         CALL ComRxNibble              // shake hand
         R1-=0
         JNE ComRxRet
         R4=1
         CALL ComRxByte
         R1-=0
         JNE ComRxRet
         CMP R3, 0xff
         JNE ComRxCoord
         PC = ComRxComand

ComRxCoord:                            // normal command
         [_XCoord]=R3
         CALL ComRxByte
         R1-=0
         JNE ComRxRet
         [_YCoord]=R3
         CALL ComChecksum
         R1-=0
         JNE ComRxRet
         R1=[_CardMode]
         CMP R1, NormalMode
         JE ComRxOk
         R1=[_CardMode]
         CMP R1, CoordMode
         JE ComRxOk
ComRxErr2:
         R1=dRxUnmatchedModeErr
         RETF

ComRxOk:
         R1=[_SysFlagA]
         R1|=CoordBit
         [_SysFlagA]=R1
         R1=16
         [_RxErrCnt]=R1
         R1=dRxOk
         RETF

ComRxComand:
         CALL ComRxByte
         R1-=0
         JNE ComRxRet
         R3=R3 LSR 4
         R3+=ComandTab
         PC=[R3]

ComC1Err:
         CALL ComChecksum
         R1-=0
         JNE ComRxRet
         R1=ErrC02Err
         JMP ComRxErrCmd

ComNo:
         R1=6
ComRxRet:     
         RETF   

ComC2Err:
         CALL ComChecksum
         R1-=0
         JNE ComRxRet
         R1 = ErrC02DataErr
         JMP ComRxErrCmd


ComAdjPErr:
         CALL ComChecksum
         R1-=0
         JNE ComRxRet
         R1 = AdjustPercisionErr
ComRxErrCmd:
         [_ErrType]=R1
         R1=[_SysFlagA]
         R1|=SysErrBit
         [_SysFlagA]=R1
         R1=dRxOk
         RETF
  
ComRxKey:
         CALL ComChecksum
         R1-=0
         JNE ComRxRet
         R1=[_SysFlagA]
         R1|=KeyBit
         [_SysFlagA]=R1
         R1=dRxOk
         RETF

    
ComRxVer:
         R1=16
         [RxLen]=R1
         CALL ComRxStr
         R1-=0
         JNE ComRxRet
         R1=[_CardMode]
         CMP R1,VersionMode
         JNE ComRxErr2_
         PC=ComRxOk

ComRxRes:
         R1=36
         [RxLen]=R1
         CALL ComRxStr
         R1-=0
         JNE ComRxRet
         R1=[_SysFlagA]
         R1&=BaseDataBit_
         [_SysFlagA]=R1
         R1=[_CardMode]
         CMP R1,TestMode
         JNE ComRxErr2_
         PC=ComRxOk
      
ComRxAdj1:
         R1=8
         [RxLen]=R1
         CALL ComRxStr
         R1-=0
         JNE ComRxRet2
         R1=[_CardMode]
         CMP R1,AdjustMode
         JNE ComRxErr2_
         PC=ComRxOk
ComRxErr2_:
         R1=2
         RETF

ComRxBase:
         R1=67
         [RxLen]=R1
         CALL ComRxStr
         R1-=0
         JNE ComRxRet2
         R1=[_SysFlagA]
         R1|=BaseDataBit
         [_SysFlagA]=R1
         R1=[_CardMode]
         CMP R1,TestMode
         JNE ComRxErr2_
         PC=ComRxOk

ComRxRet2:
         RETF

ComRxStr:
         R1=0
         [RxNum]=R1
ComRxStr0:
         CALL ComRxByte
         R1-=0
         JNE ComRxRet2                 
         R1=[RxNum]
         R1+=_CommBuf
         [R1]=R3
         R1=[RxNum]
         R1+=1
         [RxNum]=R1
         CMP R1, [RxLen]
         JNE ComRxStr0
ComChecksum:
         R1=R4&0x0f
         [RxCSBak]=R1
         CALL ComRxNibble
         R1-=0
         JNE ComRxRet2
         R3-=[RxCSBak]
         JNE ComChecksumErr3
         R1=0
         RETF
ComChecksumErr3:
         R1=3
         RETF

ComRxByte:
         R1=[_SysFlagA]
         R1&=TmpBit_
         JMP ComRxNibble_
ComRxNibble:
         R1=[_SysFlagA]
         R1|=TmpBit

ComRxNibble_:
         [_SysFlagA]=R1
         R3=0
ComRxNibble0:
         R3=R3 LSL 1
         R1= RxDly
ComRxNibble1:
         R1-=1
         JNE ComRxNibble1_
         R1=dRxWaitLowClkErr
         RETF
ComRxNibble1_:
         R2=[P_IOA_Data]
         TEST R2, PClkB                 //  Clk=0
         JNE ComRxNibble1
         R2=[P_IOA_Data]
         TEST R2, PDatB
         JNE ComRxNibbleHi
ComRxNibbleLo:
         R3&=Bit0_
         JMP ComRxNibble2
ComRxNibbleHi:
         R3|=Bit0
ComRxNibble2:
         R2=[P_IOA_Buffer]
         R2&=PAckB_                     //  Ack=0
         [P_IOA_Buffer]=R2
         R1= RxDly
ComRxNibble3:
         R1-=1
         JNE ComRxNibble4
         CALL SetAck
         R1=dRxWaitHighClkErr
         RETF

ComRxNibble4:
         R2=[P_IOA_Data]
         TEST R2, PClkB                 //  Clk=1
         JE ComRxNibble3
         CALL SetAck
         R3|=Bit8
         TEST R3, BitB
         JE ComRxNibble0
         R1=[_SysFlagA]
         TEST R1, TmpBit
         JNE ComRxNibbleNibbleOk
         TEST R3, BitC
         JNE ComRxNibble5
         R3=R3^0x06
         R1=R3&0x0f
         R4+=R1
ComRxNibble5:
         TEST R3, BitF
         JE ComRxNibble0
ComRxNibbleByteOk:
         R3=R3^0x06
         R1=R3&0x0f
         R4+=R1
         R3&=0xff
         R1=dRxOk
         RETF

ComRxNibbleNibbleOk:
         R3=R3^0x06
         R3&=0x0f
         R4+=R3
         R1=dRxOk
         RETF

ComandTab:
         .DW  ComNo
         .DW  ComC1Err
         .DW  ComC2Err
         .DW  ComAdjPErr
         .DW  ComRxKey
         .DW  ComRxVer
         .DW  ComRxRes
         .DW  ComRxAdj1
         .DW  ComRxBase

ClrAck:
         R1=[P_IOA_Buffer]
         R1&=PAckB_
         [P_IOA_Buffer]=R1
         RETF

SetAck:
         R2=[P_IOA_Buffer]
         R2|=PAckB
         [P_IOA_Buffer]=R2
         RETF

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -