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

📄 t6620.asm

📁 基于NT69P20的遥控PS2键盘处理程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;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 + -