📄 t6620.asm
字号:
;Program TEST for SH66P20
; Date 2003.11.29
; Author William Guo
LIST P=69P20
TITLE T6620
; Define Symbols
; 00h->1fh System RAM for Register 32*4bit
IE EQU 0
IRQ EQU 1
TM0MOD EQU 2
T0L EQU 4
T0H EQU 5
PORTA EQU 8
PORTB EQU PORTA+1
PORTC EQU PORTA+2
TBR EQU PORTA+6
INX EQU PORTA+7
DPTRL EQU 10H
DPTRM EQU DPTRL+1
DPTRH EQU DPTRL+2
PAOUT EQU 16H
PBOUT EQU PAOUT+1
PCOUT EQU PAOUT+2
PLCTL EQU 19H
WDT EQU 1EH
;20h->5Fh USER RAM 64*4 Bit
ACCBUF EQU 20H
CT0 EQU 21H
CT1 EQU 22H
CT2 EQU 23H
PARM EQU 24H
IRCNTH EQU 25H
IRCNTL EQU 26H
IRTEMP EQU 27H
IRRES EQU 28H
IRC0 EQU 30H
IRC1 EQU IRC0+1
IRC2 EQU IRC0+2
IRC3 EQU IRC0+3 ;4*4=16BIT Custom CODE
IRD0H EQU IRC0+4
IRD0L EQU IRC0+5 ;2*4=8BIT IR Data CODE
IRD1H EQU IRC0+6
IRD1L EQU IRC0+7 ;2*4=8BIT IR Invert Data CODE
PS2INH EQU 40H
PS2INL EQU PS2INH+1
PS2CNTL EQU 42H
PS2SNDH EQU 43H
PS2SNDL EQU 44H
PS2RET EQU 47H
PS2TEMP EQU 48H
PS2BUF EQU 49H
CMP0H EQU 3AH
CMP0L EQU 3BH
CMP1H EQU 3CH
CMP1L EQU 3DH
KEYCNT EQU 3EH
;MARSK
MPS2CLK0 EQU 1101B
MPS2CLK1 EQU 0010B
MPS2D0 EQU 1011B
MPS2D1 EQU 0100B
KEYTHRS EQU 05H
TABCH EQU 0300H
TABFN EQU 0370H
FNOFF EQU 07H
; Port Assign
; Program Begins
ORG 0
JMP INI
RTNI
RTNI
RTNI
RTNI
ORG 10h
INI:
NOP
NOP
NOP
CALL INITMCU
;CALL INITWDT
;LDI PARM,0AH ;上电延时100mS之后启动
;CALL DELAY_N_10mS
MAIN_SELFTEST:
LDI PS2SNDH,0AH
LDI PS2SNDL,0AH
CALL PS2OUTB ;发送自检Pass指令
LDA PS2RET
BNZ MAIN_SELFTEST
MAIN_LOOP:
CALL RSTWDT
CALL PS2INB
LDA PS2RET
BNZ MAIN_LOOP_YAOKONG
LDI PARM,1
CALL DELAY_N_mS
LDA PS2INH
STA CMP0H
LDA PS2INL
STA CMP0L
LDI CMP1H,0EH
LDI CMP1L,0EH
CALL BYTECMP
BNZ MAIN_LOOP_CMD_1
;EE指令 ECHO
LDI PS2SNDH,0EH
LDI PS2SNDL,0EH
CALL PS2OUTB ;发送响应指令
NOP
JMP MAIN_LOOP
MAIN_LOOP_CMD_1:
LDI CMP1H,0FH
LDI CMP1L,02H
CALL BYTECMP
BNZ MAIN_LOOP_CMD_2
;F2指令 ID
LDI PS2SNDH,0FH
LDI PS2SNDL,0AH
CALL PS2OUTB ;发送响应指令
LDI PARM,1
CALL DELAY_N_mS
LDI PS2SNDH,0AH
LDI PS2SNDL,0BH
CALL PS2OUTB ;ID BYTE1
LDI PARM,1
CALL DELAY_N_mS
LDI PS2SNDH,08H
LDI PS2SNDL,03H
CALL PS2OUTB ;ID BYTE2
NOP
JMP MAIN_LOOP
MAIN_LOOP_CMD_2:
LDI CMP1H,0FH
LDI CMP1L,0FH
CALL BYTECMP
BNZ MAIN_LOOP_CMD_3
LDI PARM,1
CALL DELAY_N_mS
LDI PS2SNDH,0FH
LDI PS2SNDL,0AH
CALL PS2OUTB ;发送响应指令
LDI PARM,1
CALL DELAY_N_mS
LDI PS2SNDH,0AH
LDI PS2SNDL,0AH
CALL PS2OUTB
NOP
JMP MAIN_LOOP
MAIN_LOOP_CMD_3:
LDI CMP1H,0FH
LDI CMP1L,03H
CALL BYTECMP
BNZ MAIN_LOOP_CMD_ALL
LDI PARM,1
CALL DELAY_N_mS
LDI PS2SNDH,0FH
LDI PS2SNDL,0AH
CALL PS2OUTB ;发送响应指令
NOP
JMP MAIN_LOOP
MAIN_LOOP_CMD_ALL:
;不解释的指令全部返回FA
LDI PS2SNDH,0FH
LDI PS2SNDL,0AH
CALL PS2OUTB ;发送响应指令
NOP
JMP MAIN_LOOP
MAIN_LOOP_YAOKONG:
CALL YAOKONG
LDA IRRES,00H
BAZ MAIN_LOOP
SBI IRRES,01H
BNZ MAIN_LOOP
LDA IRD0H,00H
STA TBR,00H
LDA IRD0L,00H
CALL TABCH-1
STA PS2SNDL,00H
LDA TBR,00H
STA PS2SNDH,00H
MAIN_LOOP_YK_1:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_YK_1 ;发送第一字节
LDI PARM,1
CALL DELAY_N_mS
SBI PS2SNDH,0EH
BNC MAIN_LOOP_YK_3
LDA IRD0H,00H
STA TBR,00H
ADIM TBR,FNOFF
LDA IRD0L,00H
CALL TABFN-1
STA PS2SNDL,00H
LDA TBR,00H
STA PS2SNDH,00H
MAIN_LOOP_YK_2:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_YK_2
LDI PARM,1
CALL DELAY_N_mS
MAIN_LOOP_YK_3:
LDI PARM,0FH
CALL DELAY_N_mS
LDI PARM,05H
CALL DELAY_N_mS
LDI PARM,0FH
CALL DELAY_N_mS
LDA IRD0H,00H
STA TBR,00H
LDA IRD0L,00H
CALL TABCH-1
STA PS2SNDL,00H
LDA TBR,00H
STA PS2SNDH,00H
SBI PS2SNDH,0EH
BNZ MAIN_LOOP_YK_7
SBI PS2SNDL,00H
BNZ MAIN_LOOP_YK_7
;若发送码为E0H,这样发送
LDI PS2SNDH,0EH
LDI PS2SNDL,00H
MAIN_LOOP_YK_4_1:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_YK_4_1
LDI PARM,01H
CALL DELAY_N_mS
MAIN_LOOP_YK_5:
LDI PS2SNDH,0FH
LDI PS2SNDL,00H
MAIN_LOOP_YK_5_1:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_YK_5_1
LDI PARM,1
CALL DELAY_N_mS
LDA IRD0H,00H
STA TBR,00H
ADIM TBR,FNOFF
LDA IRD0L,00H
CALL TABFN-1
STA PS2SNDL,00H
LDA TBR,00H
STA PS2SNDH,00H
MAIN_LOOP_YK_6:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_YK_6
LDI PARM,0AH
CALL DELAY_N_10mS
JMP MAIN_LOOP
MAIN_LOOP_YK_7:
LDI PS2SNDH,0FH
LDI PS2SNDL,00H
MAIN_LOOP_YK_7_1:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_YK_7_1
LDI PARM,1
CALL DELAY_N_mS
LDA IRD0H,00H
STA TBR,00H
LDA IRD0L,00H
CALL TABCH-1
STA PS2SNDL,00H
LDA TBR,00H
STA PS2SNDH,00H
MAIN_LOOP_YK_8:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_YK_8
LDI PARM,1
CALL DELAY_N_mS
LDI PARM,0AH
CALL DELAY_N_10mS
JMP MAIN_LOOP
MAIN_LOOP_KEYPLAY:
SBI PS2SNDH,05H
BNZ MAIN_LOOP
SBI PS2SNDL,0AH
BNZ MAIN_LOOP
ADIM KEYCNT,01H
SBI KEYCNT,KEYTHRS
BNZ MAIN_LOOP
LDI KEYCNT,00H
LDI PS2SNDH,01H ;CTRL
LDI PS2SNDL,04H
MAIN_LOOP_KEYPLAY_1:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_KEYPLAY_1
LDI PARM,0FH
CALL DELAY_N_mS
LDI PS2SNDH,01H ;ALT
LDI PS2SNDL,01H
MAIN_LOOP_KEYPLAY_2:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_KEYPLAY_2
LDI PARM,0FH
CALL DELAY_N_mS
LDI PS2SNDH,0EH ;DEL
LDI PS2SNDL,00H
MAIN_LOOP_KEYPLAY_3:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_KEYPLAY_3
LDI PARM,2
CALL DELAY_N_mS
LDI PS2SNDH,07H ;DEL
LDI PS2SNDL,01H
MAIN_LOOP_KEYPLAY_4:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_KEYPLAY_4
LDI PARM,0FH
CALL DELAY_N_mS
LDI PARM,0FH
CALL DELAY_N_mS
LDI PARM,0FH
CALL DELAY_N_mS
LDI PARM,0FH
CALL DELAY_N_mS
LDI PARM,0FH
CALL DELAY_N_mS
LDI PARM,0FH
CALL DELAY_N_mS
LDI PARM,0FH
CALL DELAY_N_mS
LDI PARM,0FH
CALL DELAY_N_mS
LDI PS2SNDH,0FH ;RELEASE
LDI PS2SNDL,00H
MAIN_LOOP_KEYPLAY_5:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_KEYPLAY_5
LDI PARM,2
CALL DELAY_N_mS
LDI PS2SNDH,01H ;CTRL
LDI PS2SNDL,04H
MAIN_LOOP_KEYPLAY_6:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_KEYPLAY_6
LDI PARM,0FH
CALL DELAY_N_mS
LDI PARM,0FH
CALL DELAY_N_mS
LDI PS2SNDH,0FH ;RELEASE
LDI PS2SNDL,00H
MAIN_LOOP_KEYPLAY_7:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_KEYPLAY_7
LDI PARM,2
CALL DELAY_N_mS
LDI PS2SNDH,01H ;ALT
LDI PS2SNDL,01H
MAIN_LOOP_KEYPLAY_8:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_KEYPLAY_8
LDI PARM,0FH
CALL DELAY_N_mS
LDI PARM,0FH
CALL DELAY_N_mS
LDI PS2SNDH,0EH ;DEL
LDI PS2SNDL,00H
MAIN_LOOP_KEYPLAY_9:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_KEYPLAY_9
LDI PARM,2
CALL DELAY_N_mS
LDI PS2SNDH,0FH ;RELEASE
LDI PS2SNDL,00H
MAIN_LOOP_KEYPLAY_10:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_KEYPLAY_10
LDI PARM,2
CALL DELAY_N_mS
LDI PS2SNDH,07H ;DEL
LDI PS2SNDL,01H
MAIN_LOOP_KEYPLAY_11:
CALL PS2OUTB
LDA PS2RET
BNZ MAIN_LOOP_KEYPLAY_11
JMP MAIN_LOOP
RTNI
INITMCU:
LDI PAOUT,0FH ;配置PORTB为输出端口
LDI PBOUT,0FH
LDI PORTA,0FH
LDI PORTB,0FH
LDI PORTC,0FH
NOP
LDI PLCTL,0100B
LDI PBOUT,00H
LDI IRQ,0
LDI TM0MOD,0
LDI IE,0000B ;开启PORT中断
RTNI
INITWDT:
LDI TM0MOD,01H
LDI WDT,1000B
RTNI
RSTWDT:
LDI WDT,1000B
NOP
NOP
RTNI
BYTECMP:
LDA CMP0H
SUB CMP1H,00H
BNZ BYTECMP_E
LDA CMP0L
SUB CMP1L,00H
BYTECMP_E
RTNI
;*************************************************************************
;File name: DELAY.ASM
;Description: This program is to delay a long time ,you can use parmeter to
; decide how long to delay.
;Input Arguments: CT1,CT0,PARM
;Instruction Time : ITime = 1 / (OSC / 4)
;MainDelayTime = CT1*(CT0(ITime*4)+2*ITime)+4*ITime=994uS
;I assume to use 4MHz Clock , so ITime=1uS
;*************************************************************************
; DELAY 1 x PARM ms
;*************************************************************************
DELAY_N_mS:
LDI CT0,0DH ;配置计数器低位 CT0=16
LDI CT1,0EH ;配置计数器高位 CT1=15
SBIM PARM,01H ;judge parmater is >0
BC DELAY_N_mS_1
JMP DELAY_N_mS_E
DELAY_N_mS_1:
NOP
NOP ;2 ITIME
SBIM CT0,01H ;1 ITIME
BC DELAY_N_mS_1 ;1 ITIME
SBIM CT1,01H
BC DELAY_N_mS_1 ;2 ITIME
JMP DELAY_N_mS
DELAY_N_mS_E:
RTNI
;*************************************************************************
;File name: DELAY.ASM
;Description: This program is to delay a long time ,you can use parmeter to
; decide how long to delay.
;Input Arguments: CT1,CT0,PARM
;Instruction Time : ITime = 1 / (OSC / 4)
;MainDelayTime = CT2*((CT1*(CT0(ITime*4)+2*ITime)+9ITIME)+4*ITime=9994uS
;I assume to use 4MHz Clock , so ITime=1uS
;*************************************************************************
; DELAY PARM * 10ms
;*************************************************************************
DELAY_N_10mS:
LDI CT0,0FH ;配置计数器低位 CT0=16
LDI CT1,0EH ;配置计数器高位 CT1=15
LDI CT2,0AH
SBIM PARM,01H ;judge parmater is >0
BC DELAY_N_10mS_1
JMP DELAY_N_10mS_E
DELAY_N_10mS_1:
NOP
NOP ;2 ITIME
SBIM CT0,01H ;1 ITIME
BC DELAY_N_10mS_1 ;1 ITIME
SBIM CT1,01H
BC DELAY_N_10mS_1 ;2 ITIME
LDI CT1,0EH
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SBIM CT2,01H
BC DELAY_N_10mS_1
JMP DELAY_N_10mS
DELAY_N_10mS_E:
RTNI
DELAY_N_10uS:
SBIM PARM,01H ;judge parmater is >0
BNC DELAY_N_10uS_E
NOP
NOP
NOP
NOP
NOP
NOP
JMP DELAY_N_10uS
DELAY_N_10uS_E:
RTNI
DELAY_N_100uS:
LDI CT0,0AH
SBIM PARM,01H ;judge parmater is >0
BNC DELAY_N_100uS_E
DELAY_N_100uS_1:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SBIM CT0,01H
BC DELAY_N_100uS_1
JMP DELAY_N_100uS
DELAY_N_100uS_E:
RTNI
;
;*************************************************************************
YAOKONG:
LDI IE,0000B ;关闭中断
LDI IRQ,0000B
LDI IRRES,00H
LDI PORTA,0FH
LDI PORTB,1111B
LDI PARM,1
CALL DELAY_N_mS
LDA PORTB
BA0 YK_EX_1
LDI IRCNTH,07H
YK_ST_1: ;9ms起始码检测
LDI PORTB,1111B
NOP
NOP
LDA PORTB
NOP
BA0 YK_REC_1 ;若接收端为高电平,同步起始码高电平部分
JMP YK_ST_1 ;若接收端为低电平,同步9ms起始码低电平部分
;
; YK_ST_2:
; NOP
; NOP
; LDA PORTB
; NOP
; BA0 YK_ST_2 ;当接收端为高电平时,继续9ms起始码高电平同步
; ;当接收端为低电平时,退出9ms起始码高电平同步
YK_REC_1:
CALL YK4BIT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -