Hi all 8051 Gurus, I am new to this group and to 8051 as well. I tried to connect a ps/2 keyboard to my 8051 board with lcd(hd44780, 2x16) and wrote a program to print the ascii character of the key pressed on lcd. I could detect the make code and getting the key pressed but the break codes or some other stuff adds some funny character after the real one. How to avoid that ? and what should be the logic to detect the key ascii? pls. help. the code is : ; KBD1.ASM ;=============================================================== ; AA (hex) i.e. 170 dec is power on test successfull
; ; H/W CONNECTIONS : KBD CLOCK connected to P3.2(INT0) ; KBD DATA connected to P3.4 ; ; pc-kbd, 89C52, ; assembler : asm51 ;===============================================================
$MOD51 ; ASSEMBLER DIRECTIVE FOR ASM51 ASSEMBLER
BYTE_IDX EQU 30H
CR EQU 0 L_SHIFT EQU 0 R_SHIFT EQU 0 CAPS_LOCK EQU 0 NUM_LOCK EQU 0 BACK_SPACE EQU 0 ESC EQU 0 L_CTRL EQU 0
ORG 0000H JMP START ORG 0003H JMP EXT_INT0
START: CLR BYTE_IDX ;1ST BYTE IS MAKE CODE, THEN COMES TWO BYTES OF BREAK CODE
MOV P3,#0FFH ;Port 3 set for second function MOV IE,#81H ;ExtInt0 ENABLED SETB IT0 ;EDGE TRIGGERED INT 0 MOV DPTR, #COMMANDS SEND_CMD: CLR A MOVC A,@A+DPTR JZ SEND_DATA ACALL control_word ACALL ddelay INC DPTR SJMP SEND_CMD
SEND_DATA: AGAIN: mov a,#08Fh ; 1st row 16TH COL acall control_word acall ddelay
MOV DPTR, #MSG NXT: CLR A MOVC A,@A+DPTR JZ DISP1 ACALL data_word ACALL ddelay INC DPTR SJMP NXT DISP1: SJMP AGAIN
WAIT: SETB P2.2 JMP WAIT ;-------------------------------------------- control_word:
mov r0,a anl a,#0F0h swap a orl a,#0e0h mov P2, A anl a,#0cfh mov P2, A mov a,r0 anl a,#0fh orl a,#0e0h mov P2, A anl a,#0cfh mov P2, A ret
data_word: mov r0,a anl a,#0F0h swap a orl a,#0f0h mov P2, A anl a,#0dfh mov P2, A mov a,r0 anl a,#0fh orl a,#0f0h mov P2, A anl a,#0dfh mov P2, A ret
;***************************** isr EXT_INT0: ; MOV A, BYTE_IDX ; CJNE A, #10,EXIT_ISR KBD: MOV R3,#8 MOV R7,#0 KP1: MOV C,P3.2 JC KP1 K4: MOV C,P3.2 JNC K4 K5: MOV C,P3.2 JC K5 MOV C,P3.4 MOV A,R7 RRC A MOV R7,A K6: MOV C,P3.2 JNC K6 DJNZ R3,K5 ACALL DELAY1 MOV R5,A ;acc contains the key-scan code **/*/*/*/*/*/*
MOV DPTR,#SCAN2ASCII_LOOK_UP MOVC A,@A+DPTR
ACALL data_word ACALL ddelay INC BYTE_IDX SEC_INT: EXIT_ISR: RETI
;************************************* DELAY1: MOV R4,#80H DJNZ R4,$ RET
;************************************************* dDELAY: MOV R3,#250 ;50 HERE: MOV R4,#255 DJNZ R4, $ DJNZ R3, HERE RET
DELAY: MOV R1,#0FFH MOV R2,#0FFH LP: NOP NOP DJNZ R1,$ DJNZ R2,LP RET
L_DELAY: MOV R1,#0FFH MOV R2,#0FFH MOV R3,#04h LP1: NOP NOP DJNZ R1,LP1 DJNZ R2,LP1 DJNZ R3,LP1 RET
;########################################################################## ;BIN2BCD ; CONVERTS 8-BIT BINARY VARIABLE IN ACC TO 3-DIGIT PACKED BCD FORMAT. ; HUNDRED'S PLACE LEFT IN VARIABLE 'HUND', ; TEN'S AND ONE'S PLACES IN 'TENONE'. ; USES/AFFECTS : ACC, B
HUND DATA 21H TENS DATA 22H ONES DATA 23H BIN2BCD: MOV B,#100 DIV AB MOV HUND,A MOV A,#10 XCH A,B DIV AB MOV TENS,A MOV ONES,B ; SWAP A ; ADD A,B ; MOV TENONE,A RET ;##########################################################################
COMMANDS: DB 028H, 028H ; DB 0EH DB 01H DB 06H DB 07H DB 0
MSG: DB 'KBD ', 0 SCAN2ASCII_LOOK_UP: DB 0 ;FOR SCAN-CODE 0 WHICH DOES NOT EXIST, I SUPPOSE DB 0,0,0,0,0,0,0,0,0,0 ; scan code 001 to 010 DB 0,0,0,0,0,0,0,0,L_SHIFT,L_CTRL ; scan code 011 to
020 DB 'Q','!',0,0,0,'Z','S','A','W','@' ; scan code 021 to 030 DB 0,0,'C','X','D','E','$','#',0,0 ; scan code 031 to 040 DB SP,'V','F','T','R','%',0,0,'N','B' ; scan code 041 to 050 DB 'H','G','Y','^',0,0,0,'M','J','U' ; scan code 051 to 060 DB '&','*',0,0,'','?','L',':','P','_',0,0 ; scan code 071 to 080 DB 0,'"',0,'{','+',0,0,CAPS_LOCK,R_SHIFT,CR ; scan code 081 to 090 DB '}',0,'|',0,0,0,0,0,0,0 ; scan code 091 to 100 DB 0,BACK_SPACE,0,0,0,0,0,0,0,0 ; scan code 101 to 110 DB 0,0,0,0,0,0,0,ESC,NUM_LOCK,0 ; scan code 111 to 120 DB 0,0,0,0,0,0,0,0,0,0 ; scan code 121 to 130 DB 0,0,0,0,0,0,0,0,0,0 ; scan code 131 to 140 DB 0,0,0,0,0,0,0,0,0,0 ; scan code 141 to 150 DB 0,0,0,0,0,0,0,0,0,0 ; scan code 151 to 160 DB 0,0,0,0,0,0,0,0,0,0 ; scan code 161 to 170 DB 0,0,0,0,0,0,0,0,0,0 ; scan code 171 to 180 DB 0,0,0,0,0,0,0,0,0,0 ; scan code 181 to 190 DB 0,0,0,0,0,0,0,0,0,0 ; scan code 191 to 200 DB 0,0,0,0,0,0,0,0,0,0 ; scan code 201 to 210 DB 0,0,0,0,0,0,0,0,0,0 ; scan code 211 to 220 DB 0,0,0,0,0,0,0,0,0,0 ; scan code 221 to 230 DB 0,0,0,0,0,0,0,0,0,0 ; scan code 231 to 240 DB 0,0,0,0,0,0,0,0,0,0 ; scan code 241 to 250 DB 0,0,0,0,0,0,0,0,0,0 ; scan code 251 to 260;=========================================================================
END
thanks in anticipation.
Rajesh Bij