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

📄 henhao.asm

📁 此代码是一个键盘程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:

bitACK				BIT		P3.0
bitDAT				BIT		P3.1
bitOVERFLOW			BIT		P3.3
bitDECODE			BIT		P3.4
bitD74				BIT		P3.5
bitCLK74			BIT		P3.7



bitStrollLockKey		BIT 		00H
bitParityBak			BIT 		08H
blnNumLockKey			BIT		01H
blnCapsLockKey			BIT		02H
blnShiftKeyDown			BIT		03H
blnHaveKey			BIT		04H
blnDataValid			BIT		05H
blnTimer0Overflow		BIT		06H
blnChoose			BIT		09H
blnFifoFull			BIT		0AH
blnFifoNull			BIT		0BH
blnOddByte			BIT		0CH





gBitCounter			DATA		30H
gByteCounter			DATA		31H
CodeReg_1			DATA		32H
CodeReg_2			DATA		33H
FifoBufferBegin			EQU		34H
FifoBufferEnd			EQU		35H
TmpOddByte			DATA		36H
FifoBuffer			EQU		60H
FifoBufferLength		EQU		20H
ReceiveBuffer			EQU		40H
RestoreBuffer			EQU		50H
Init_TL0			EQU		48H
Init_TH0			EQU 		0F4H         
	
	
	ORG 0
	LJMP START
	ORG 03H
	LJMP INT0_SERVE
	ORG 0BH	
T0_SERVE:
  	CLR		TR0                                ;Counter stop
  	SETB 	bitDECODE                          ;Illume the yellow light
	SETB 	blnTimer0Overflow                  ;Setting the timer overflow symbol
  	JNB		blnHaveKey,T0_SERVE1               ;Have key?               
  	SETB 	blnDataValid                       ;Seting the data valid symbol
  	CLR		blnHaveKey                         ;Clean the have key symbol
T0_SERVE1:
  	MOV 	TL0,#Init_TL0                      ;Setting the timer
  	MOV 	TH0,#Init_TH0
  	SETB 	TR0                                ;Startup the timer
  	RETI
;*********************************************		
INT0_SERVE:
   	CLR		TR0                                ;Stop count
    JB 		blnDataValid,EXIT1                 ;data valid?
  	PUSH 	ACC                       	       ;Protect the spot
  	PUSH 	PSW
  	PUSH	07H
  	CLR 	bitDECODE                          ;Put out the yellow light                   
  	JNB 	blnTimer0Overflow,NOT_NEWRECEIVE   ;New receive?
 	SETB	blnHaveKey
  	MOV 	gBitCounter,#0
NOT_NEWRECEIVE:                                ;new receive
	INC 	gBitCounter
 	MOV 	C,bitDAT
	LCALL	RLC_STORE                          ;Store a bit
	CLR 	blnTimer0Overflow                  ;Clean the timer overflow symbol
  	MOV 	TL0,#Init_TL0                      ;Setting the timer
  	MOV 	TH0,#Init_TH0
  	POP		07H                      			;Resume the spot
  	POP 	PSW                                
  	POP 	ACC
  	SETB 	TR0                 				;Startup the timer
  	RETI
EXIT1:
  	MOV 	TL0,#Init_TL0                       ;Setting the timer
  	MOV 	TH0,#Init_TH0        
  	SETB 	TR0                                 ;Startup the timer          
  	RETI
;Main progress begin
START:
	MOV		A,#0FFH								;Keyboard replacement 
	LCALL	COMMAND
	MOV		R5,#0FFH
DELAY:
	MOV		R6,#0FFH
	DJNZ	R6,$
	DJNZ	R5,DELAY
	MOV 	gBitCounter,#0                        ;Clean the bit count symbol
  	MOV 	TMOD,#01H                          ;Setting the counter
  	MOV 	TL0,#Init_TL0                     
  	MOV 	TH0,#Init_TH0
  	MOV 	R1,#ReceiveBuffer
  	LCALL 	CLR_BUFFER 						;Clean the receive buffer
  	CLR		blnFifoFull						;Clean the FIFO full symbol
  	SETB	blnFifoNull                      ;CLean the FIFO empty symbol			
  	CLR 	blnDataValid                     ;Clean the data valid symbol
  	CLR 	blnShiftKeyDown                  ;Place the special key symbol
  	CLR 	blnCapsLockKey					
  	CLR		bitStrollLockKey
  	CLR		blnOddByte
  	SETB 	blnNumLockKey
  	SETB		blnChoose					;Choose the kind of  key code 
  	CLR		bitD74							;put out the green light
  	CLR		bitCLK74
  	SETB	bitCLK74
  	MOV		FifoBufferBegin,#FifoBuffer		;initialize FIFO
  	MOV		FifoBufferEnd,#FifoBuffer
  	SETB 	TR0                                ;Startup the counter
  	SETB 	IT0                                ;Place to symbol bit
  	SETB 	EX0
	SETB 	ET0
  	SETB 	EA
  	LCALL	LEDCTRL								;lighten the NumLock key light
;***************************************  		
MAINLOOP:
	JNB		blnDataValid,ASKFORSEND              ;Is the data valid?
	LCALL 	RESUME								;Yes,restore the data
	CLR 	blnDataValid 						;Clean the datavalid symbol
	XRL		A,#0FFH                              ;Is the data 0FFH?
	JZ		MAINLOOP                             ;Yes,return
	JB		blnChoose,CODE_1                      ;The kind of key code
	LCALL	FINDVIKEYCODE 						;Find the virtual key code
	MOV		CodeReg_2,A  						;store the virtual key code         
	XRL 	A,#0FFH      						;Is the code 0FFH?
	JZ 		MAINLOOP                             ;Yes,return
	LJMP	FIFO                                 ;No,send the code to FIFO
CODE_1:
	LCALL	FINDSCAN							;Find the scan code
	MOV		B,A
	XRL		A,#0FFH                              ;Is the data 0FFH in ACC?
	JZ		MAINLOOP							  ;Yes,return
	MOV 	A,B
	XRL		A,#0FEH								;Is the data 0FEH in ACC?
	JZ		FIFO								;Yes,send the code to FIFO 
	LCALL 	ChangeASCII                         ;Find the ASCII code 
FIFO:
	LCALL   FIFO_STORE							;Store the code in FIFO
	LCALL	LEDCTRL                             ;Setting the pilot lamp on keyboard
ASKFORSEND:
	JNB		bitACK,RETURN                        ;Get ready incept ?
	LCALL	READFIFO							;Break out the code from FIFO and send
RETURN:	
	LJMP	MAINLOOP							;Return
;**********************************************************	
FINDSCAN:	
	MOV		A,gByteCounter
	CJNE	A,#01H,JUDGE_1                    ;One byte?
	LCALL 	PROCESS_ONEBYTE					  ;Yes,FInd the scan code 
	LJMP	JUDGE_7
JUDGE_1:
	MOV		A,gByteCounter
	XRL		A,#02H								;Two byte?
	JNZ		JUDGE_2
	LCALL	PROCESS_TWOBYTE						;Yes,return

	LJMP	JUDGE_7
JUDGE_2:
	MOV		A,gByteCounter
	XRL		A,#03H								;Three byte?
	JZ		JUDGE_6								;Yes,return
JUDGE_3:
	MOV		A,gByteCounter
	XRL		A,#04H								;Four byte?
	JNZ		JUDGE_4
	LCALL	PROCESS_FOURBYTE                     ;Yes,find the scan code 
	LJMP	JUDGE_7
JUDGE_4:
	MOV		A,gByteCounter
	XRL		A,#06H								;Six byte?
	JZ		JUDGE_6								;Yes,return
JUDGE_5:
	MOV		A,gByteCounter
	XRL		A,#08H								;Eight byte?
	JNZ		JUDGE_6								;No,return
	LCALL	PROCESS_EIGHTBYTE					;Yes,find the scan code
	LJMP	JUDGE_7
JUDGE_6:
	MOV		A,#0FFH
JUDGE_7:	
	RET
;*****************************************
PROCESS_ONEBYTE:
	MOV 	A,RestoreBuffer   
	XRL 	A,#77H                      ;Is the key NumLock key?		 	
	JNZ 	LED_1
	CPL 	blnNumLockKey				;Yes,setting the symbol of NumLock key
LED_1:
	MOV 	A,RestoreBuffer   
	XRL 	A,#58H                       ;Is the key CapsLock Key		
	JNZ 	LED_2
	CPL 	blnCapsLockKey				;Yes,setting the symbol of CapLock key
LED_2:
  	MOV 	A,RestoreBuffer   
	XRL 	A,#7EH                      ;Is the key ScrollLock Key
	JNZ 	SHIFT_1
	CPL 	bitStrollLockKey				;Yes,setting the symbol of ScrollLock key
SHIFT_1:	
	MOV 	A,RestoreBuffer  
	XRL 	A,#12H                         ;Is the key left Shift key
	JZ 		SHIFT_2
	MOV 	A,RestoreBuffer  				
	XRL 	A,#59H							;Is the key right Shift key
	JNZ 	ONEBYTE_1
SHIFT_2:
	SETB 	blnShiftKeyDown					;Setting the symbol of Shift key
ONEBYTE_1:			
	MOV		R7,RestoreBuffer                         
	MOV 	A,R7									;Break out the data to A
	CLR 	C                                       ;Clean the C
	SUBB 	A,#90H                          ; Is the data                      
	JNC 	ONEBYTE_2
	LCALL   FINDSCANCODE
	MOV		CodeReg_1,A
	RET
ONEBYTE_2:
	MOV 	A,#0FFH
	RET
;**********************************
PROCESS_TWOBYTE:
	MOV		A,RestoreBuffer
	XRL		A,#0F0H                        ;Is the first byte 0F0H?
	JZ		FIRSTBYTEISF0
	MOV		A,RestoreBuffer
	XRL		A,#0E0H                        ;Is the first byte 0E0H?
	JZ		TWOBYTE_1
	MOV 	A,#0FFH
	RET
;-------------------------------------
	;The progress to find the scan code for multibyte
TWOBYTE_1:
	MOV		R1,#RestoreBuffer+1
	LCALL	MOREBYTESCAN
	RET
;-------------------------------
;The first byte is 0F0H	
FIRSTBYTEISF0:
	MOV 	A,RestoreBuffer+1  
	XRL 	A,#12H                         
	JZ 		SHIFT_3
	MOV 	A,RestoreBuffer+1  
	XRL 	A,#59H				
	JNZ 	F0_1
SHIFT_3:
 	CLR 	blnShiftKeyDown
F0_1:
	MOV 	A,#0FFH
	RET
;*****************************************
PROCESS_FOURBYTE:
	MOV		R1,#RestoreBuffer+3
	LCALL	MOREBYTESCAN
	RET
;******************************************
PROCESS_EIGHTBYTE:
	MOV		CodeReg_1,#69
	MOV		CodeReg_2,#0
	MOV		A,#0FEH
	RET
;--------------------------------------------------
MOREBYTESCAN:
	MOV		A,@R1
	MOV		DPTR,#TwoByteKeyTable
	MOV		R6,#0
	MOV 	R7,A
STMP3:	
	MOV 	A,R6
	MOVC 	A,@A+DPTR
	JZ 		STMP2
	XRL 	A,R7
	JZ 		STMP1
	INC 	R6
	SJMP 	STMP3
STMP1:
 	MOV 	A,R6
 	LCALL	FindTwoByteKeyScanCode
 	CJNE	@R1,#69H,STMP4
STMP4: 	
 	JNC		STMP5
 	MOV		CodeReg_1,A	
 	RET
STMP5:
	MOV 	CodeReg_1,A
    MOV		CodeReg_2,#0  
	MOV 	A,#0FEH
	RET
STMP2: 	
	MOV 	A,#0FFH
	RET
TwoByteKeyTable:
	DB 11H,14H,1FH,27H,2FH,4AH,5AH,69H,6BH,6CH,70H,71H,72H,74H,75H,7AH,7CH,7DH,0H	
FindTwoByteKeyScanCode:
	INC A
	MOVC A,@A+PC
	RET
	DB 38H,1DH,5BH,5CH,5DH,35H,1CH,4FH,4BH,47H,52H,53H,50H,4DH,48H,51H,37H,49H,0FFH	
;*********************************************
;The Progress of resume
RESUME:
 	MOV		R1,#RestoreBuffer
	LCALL	CLR_BUFFER                        ;Clean the restore buffer
  	MOV 	A,gBitCounter
	MOV		B,#11
  	DIV 	AB
  	MOV		R2,A
  	ADD		A,#RestoreBuffer
	MOV		R6,A
	MOV		gByteCounter,R2
RESUME_LOOP1:
	LCALL	RRC_READ
	JNC 	ERROR
	LCALL	RRC_READ
	MOV 	bitParityBak,C
	MOV		R5,#8
RESUME_LOOP2:
	LCALL	RRC_READ
	MOV		R1,#RestoreBuffer
	MOV 	R4,gByteCounter
RLC_RESTORE_LOOP:                                          ;restore a bit                        
  	MOV 	A,@R1
  	RLC 	A
  	MOV 	@R1,A
  	INC 	R1
  	DJNZ 	R4,RLC_RESTORE_LOOP
	DJNZ	R5,RESUME_LOOP2
	;check the receive parity error
	;if (paritybit==P) go error
	MOV		A,RestoreBuffer	
	MOV		C,PSW.0
	ANL 	C,BitParityBak
	JC		ERROR
	MOV		C,PSW.0			
	ORL		C,BitParityBak
	JNC		ERROR
	LCALL	RRC_READ
	JC		ERROR
	DJNZ	R2,RESUME_LOOP1
	RET
ERROR:
	MOV		A,#0FFH
	RET
;------------------------------------------------
;The progress to break out a bit
RRC_READ:
	MOV		R1,#ReceiveBuffer+11
	MOV		R4,#12
RRC_READ_LOOP:
	MOV		A,@R1
	RRC		A
	MOV		@R1,A
	DEC		R1
	DJNZ	R4,RRC_READ_LOOP
    RET
;---------------------------------------------------
;The progress to restore a bit
RLC_STORE:
	MOV 	R7,#12
 	MOV 	R0,#ReceiveBuffer 	
RLC_STORE_LOOP:                                                      
  	MOV 	A,@R0
  	RLC 	A
  	MOV 	@R0,A
  	INC 	R0
  	DJNZ 	R7,RLC_STORE_LOOP
	RET
;---------------------------------------------------
;The progress to clean buffer
CLR_BUFFER:
	MOV 	R7,#12
	CLR 	A
CLR_BUFFER_LOOP:                                                                 
  	MOV 	@R1,A
  	INC 	R1
  	DJNZ 	R7,CLR_BUFFER_LOOP
	RET
;*******************************************
;The progress to find the scan code
FINDSCANCODE:                    
	MOV 	A,R7
	INC 	A
	MOVC 	A,@A+PC
	RET
;     0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
DB 0FFH,043H,0FFH,03FH,03DH,03BH,03CH,0FFH,0FFH,044H,042H,040H,03EH,00FH,029H,0FFH;0	
DB 0FFH,038H,02AH,0FFH,01DH,010H,002H,0FFH,0FFH,0FFH,02CH,01FH,01EH,011H,003H,0FFH;1
DB 0FFH,02EH,02DH,020H,012H,005H,004H,0FFH,0FFH,039H,02FH,021H,014H,013H,006H,0FFH;2
DB 0FFH,031H,030H,023H,022H,015H,007H,0FFH,0FFH,0FFH,032H,024H,016H,008H,009H,0FFH;3
DB 0FFH,033H,025H,017H,018H,00BH,00AH,0FFH,0FFH,034H,035H,026H,027H,019H,00CH,0FFH;4
DB 0FFH,0FFH,028H,0FFH,01AH,00DH,0FFH,0FFH,03AH,036H,01CH,01BH,0FFH,02BH,0FFH,0FFH;5
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,00EH,0FFH,0FFH,04FH,0FFH,04BH,047H,0FFH,0FFH,0FFH;6
DB 052H,053H,050H,04CH,04DH,048H,001H,045H,0FFH,04EH,051H,04AH,0FFH,049H,046H,0FFH;7
DB 0FFH,0FFH,0FFH,041H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;8
;**********************************************
;Change the scan code to ASCII code 
 CHANGEASCII:
	MOV 	A,CodeReg_1
	XRL		A,#91
	JNZ		CH1
	MOV		CodeReg_2,#0
	RET
CH1:
	MOV 	A,CodeReg_1
	XRL		A,#92
	JNZ		CH2
	MOV		CodeReg_2,#0
	RET
CH2:	
	MOV 	A,CodeReg_1
	XRL		A,#93
	JNZ		CH3
	MOV		CodeReg_2,#0
	RET	
CH3:	
	MOV 	A,CodeReg_1										
	CJNE 	A,#71,CH4  
CH4:	
	JNC 	CH6          

⌨️ 快捷键说明

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