Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

keyboard and LCD interfacing

Status
Not open for further replies.

siddharth123

Newbie level 2
Joined
May 7, 2011
Messages
2
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,289
i want to asm codes for converting the pressed character in PC (PS2) key board to ASCII equivalent displayed on LCD
 

i want to asm codes for converting the pressed character in PC (PS2) key board to ASCII equivalent displayed on LCD
PS2 ASM code below. Connect a serial LCD to finish the job.

Code:
;read PS2 keyboard using pic12f675

#include	p12f675.inc		;12f675 has analogue

	__CONFIG	0x0184
	errorlevel	-302		;prevent bank select warnings

#define	kbd_clock	GPIO,0	;pic pin  7 clock to PC keyboard
#define	kbd_data	GPIO,1	;pic pin  6 data to/from PC keyboard
#define	serialin	GPIO,2	;pic pin  5 serial input
#define	irout		GPIO,4	;pic pin  3 infra red output
#define	serialout	GPIO,5	;pic pin  2 serial output

;pictail pinout for PICKIT1
;pin	8pin	14pin
; 1		2 gp5	 2 ra5
; 2		3 gp4	 3 ra4
; 3		4 gp3	 4 ra3		VPP
; 4				 5 rc5
; 5				 6 rc4
; 6				 7 rc3
; 7		7 gp0	13 ra0		ICSPDAT
; 8		6 gp1	12 ra1		ICSPCLK
; 9		5 gp2	11 ra2
;10				10 rc0
;11				 9 rc1
;12				 8 rc2
;13		1 +5v	 1 +5v		VDD
;14		8 0v	14 0v		VSS

	cblock	0x20
		timer1		;shared by delay routines
		timer2		;shared by delay routines
		timer3		;shared by delay routines
		irbyte1		;IR byte in or out
		irbyte2		;IR byte in or out
		irbyte3		;IR byte in or out
		irbyte4		;IR byte in or out
		bitcount	;count bits in or out
		inchc
		outchc
		trail		;value of trail bit (happens to count messages)
		hextemp
		asciil
		asciih
		parity
	endc

	org		0		;reset vector
	goto	start

	org		4		;interrupt vector

	goto	start

;initilisation starts here
start
	bcf		STATUS,RP0		;bank 0
	clrf	GPIO			;init GPIO
	movlw	0x07			;set I/O bits
	movwf	CMCON			;digital I/O
	bsf		STATUS,RP0		;bank1
	clrf	ANSEL			;digital I/O (pic12f675 only)
;	bcf		OPTION_REG,7	;pullups enabled
;	movlw	0x20			;bit 5 only
;	movwf	WPU				;weak pull up register
	movlw	0x1f			;set I/O bits, 1=input
	movwf	TRISIO			;note GP3 pin4 can only be input

	bcf		STATUS,RP0		;bank 0
	movlw	0x20			;serial high
	movwf	GPIO

main
	call	crlf
	movlw	'P'
	call	chout
	movlw	'i'
	call	chout
	movlw	'c'
	call	chout
	movlw	'>'
	call	chout

	goto	monitor

wait_clk_low
	btfsc	kbd_clock
	goto	wait_clk_low
wait_clk_hi
	btfsc	kbd_clock
	goto	wait_clk_hi

	btfsc	kbd_data
	goto	found_1
	movlw	'0'
	call	chout
	goto	wait_clk_low
found_1
	movlw	'1'
	call	chout
	goto	wait_clk_low

monitor
	call	chin
	call	chout

	movfw	inchc
	sublw	'c'
	btfsc	STATUS,Z
	goto	cmd_c
	movfw	inchc
	sublw	'C'
	btfsc	STATUS,Z
	goto	cmd_c_u

	movfw	inchc
	sublw	'd'
	btfsc	STATUS,Z
	goto	cmd_d
	movfw	inchc
	sublw	'D'
	btfsc	STATUS,Z
	goto	cmd_d_u

	movfw	inchc
	sublw	'i'
	btfsc	STATUS,Z
	goto	cmd_i
	movfw	inchc
	sublw	'I'
	btfsc	STATUS,Z
	goto	cmd_i_u

	movfw	inchc
	sublw	'n'
	btfsc	STATUS,Z
	goto	cmd_n
	movfw	inchc
	sublw	'N'
	btfsc	STATUS,Z
	goto	cmd_n_u

	movfw	inchc
	sublw	'r'
	btfsc	STATUS,Z
	goto	start

	movlw	'?'
	call	chout
	goto	main

; command c
cmd_c
	call	clk_is_out
	bcf		kbd_clock
	goto	main

; command C
cmd_c_u
	call	clk_is_out
	bsf		kbd_clock
	goto	main

; command d
cmd_d
	call	data_is_out
	bcf		kbd_data
	goto	main

; command D
cmd_d_u
	call	data_is_out
	bsf		kbd_data
	goto	main

; command i
cmd_i
cmd_i_u
	movfw	GPIO
	call	phex
	goto	main

; command k - wait for keyboard byte
cmd_k
cmd_k_u
	call	kbd_byte_in		;wait for a keyboard byte to arrive
	call	phex			;print w as hex
	goto	main

;send a keyboard byte
kbd_byte_out
	movwf	outchc			;save send value
	bsf		kbd_data		;keep high before taking control
	call	clk_is_out		;take control of bus
	call	data_is_out
	bcf		kbd_clock		;clock low for > 60us to quieten kbd
	movlw	60				;20 for about 60uS delay
	call	del_x
	bcf		kbd_data		;data line low will start kbd clock
	call	clk_is_in		;release clock for kbd to supply
	btfsc	kbd_clock		;wait for kbd to lower clock
	goto	$-1
	movlw	8				;8 bits to receive
	movwf	bitcount
	movlw	1				;initialise parity for odd
kbdoutloop
	btfss	kbd_clock		;wait for kbd to raise clock
	goto	$-1
	btfss	outchc,0		;lsb first
	goto	kbdout0
	bsf		kbd_data
	incf	parity,f		;count 1s for odd parity
	goto	kbdout1
kbdout0
	bcf		kbd_data
kbdout1
	btfsc	kbd_clock		;wait for kbd to lower clock
	goto	$-1
	decf	bitcount,f
	btfss	STATUS,Z		;8 bits done?
	goto	kbdoutloop
;send parity
	btfss	kbd_clock		;wait for kbd to raise clock
	goto	$-1

	btfss	parity,0		;lsb first
	goto	kbdpout0
	bsf		kbd_data
	goto	kbdpout1
kbdpout0
	bcf		kbd_data
kbdpout1
	btfsc	kbd_clock		;wait for kbd to lower clock
	goto	$-1
	goto	data_is_in

;wait for a keyboard byte to arrive
kbd_byte_in
	return

;set keyboard clock to be an input
clk_is_in
	bsf		STATUS,RP0		;bank1
	bsf		TRISIO,0
	bcf		STATUS,RP0		;bank0
	return
;set keyboard clock to be an output
clk_is_out
	bsf		STATUS,RP0		;bank1
	bcf		TRISIO,0
	bcf		STATUS,RP0		;bank0
	return
;set keyboard data to be an input
data_is_in
	bsf		STATUS,RP0		;bank1
	bsf		TRISIO,1
	bcf		STATUS,RP0		;bank0
	return
;set keyboard clock to be an output
data_is_out
	bsf		STATUS,RP0		;bank1
	bcf		TRISIO,1
	bcf		STATUS,RP0		;bank0
	return

; command n - turn off num lock
cmd_n
	movlw	0xff			;reset kbd
	call	kbd_byte_out

	goto	main

; command N - turn on num lock
cmd_n_u
	movlw	0xff			;reset kbd
	call	kbd_byte_out

	goto	main

;get a byte from the serial port
chin
	movlw	0x08		;8 bits
	movwf	bitcount
	btfsc	serialin	;wait for start bit
	goto	chin
	call	delay_1plus	;wait 1.5 bit times for mid bit 0
chin_loop
	bsf		STATUS,C
	btfss	serialin
	bcf		STATUS,C
	rrf		inchc,f
	call	del2400
	decf	bitcount,f
	btfss	STATUS,Z
	goto	chin_loop
	movfw	inchc
	return

;send cr, lf to serial port
crlf
	movlw	0x0d
	call	chout
	movlw	0x0a
	goto	chout

;send a byte to the serial port
chout
	movwf	irbyte1	;borrow IR memory
	movlw	d'8'	;8 bits
	movwf	bitcount
	movfw	irbyte1
	goto	s_byte_out

;serial byte to send in w
s_byte_out
	movwf	outchc
	call	s_bit_out_0		;start bit
sbo_loop
	rrf		outchc,f			;send lsb first
	call	s_bit_out_c
	decf	bitcount,f
	btfss	STATUS,Z
	goto	sbo_loop

	call	s_bit_out_1		;stop bit

	movlw	d'8'		;exit with bit count set to 8
	movwf	bitcount
	return

;output an RC6 bit according to carry bit
s_bit_out_c
	btfsc	STATUS,C
	goto	s_bit_out_1
s_bit_out_0
	bcf		serialout		
	goto	del2400
s_bit_out_1
	bsf		serialout		
	goto	del2400

;send pet DVD up command - RC6 mode 0 a=04, d=58, toggle=0
pet_test
	movlw	0x04			;address
	movwf	irbyte1
	movfw	trail			;data (trail borrowed for demo)
	goto	rc6_out

;send rc6 mode 0 message to infra-red
;put first byte in irbyte1, second byte in w reg
rc6_out
	movwf	irbyte2

	movlw	d'96'			;6t mark for leader
	call	pulse_ir_w
	movlw	d'32'			;2t space for leader
	call	wait_ir_w

;send start bit of one and three mode bits - put in high nibble
	movlw	d'4'				;start bit + 3 bits for mode
	movwf	bitcount
	movlw	0x80			;start bit 1 + 3 mode bits (hi nibble)
	call	ir_byte_out		;send bit 7, 6, 5, 4

;trail bit toggles between key presses and is double the size
	rrf		trail,w			;get bit 0 to carry
	call	ir_trail_out_c
	incf	trail,f

	movfw	irbyte1
	call	ir_byte_out	
	movfw	irbyte2
	call	ir_byte_out	

	movlw	d'96'			;6t space for signal free time
	goto	wait_ir_w

;output a byte (or less) to IR in RC6 mode 0 protocol
;number of bits in bitcount (this routine sets 8 on exit)
;byte to send in w
ir_byte_out
	movwf	inchc

irbo_loop
	rlf		inchc,f
	call	ir_bit_out_c
	decf	bitcount,f
	btfss	STATUS,Z
	goto	irbo_loop

	movlw	d'8'		;exit with bit count set to 8
	movwf	bitcount
	return

;output an RC6 bit according to carry bit
ir_bit_out_c
	btfsc	STATUS,C
	goto	ir_bit_out_1
ir_bit_out_0
	movlw	d'16'			;1t space
	call	wait_ir_w
	movlw	d'16'			;1t mark
	goto	pulse_ir_w
ir_bit_out_1
	movlw	d'16'			;1t mark
	call	pulse_ir_w
	movlw	d'16'			;1t space
	goto	wait_ir_w

;output an RC6 trail bit according to carry bit
ir_trail_out_c
	btfsc	STATUS,C
	goto	ir_trail_out_1
ir_trail_out_0
	movlw	d'32'			;2t space
	call	wait_ir_w
	movlw	d'32'			;2t mark
	goto	pulse_ir_w
ir_trail_out_1
	movlw	d'32'			;2t mark
	call	pulse_ir_w
	movlw	d'32'			;2t space
	goto	wait_ir_w

; send w pulses of 38 Khz to IR LED
pulse_ir_w
	movwf	timer3		;save the value
	movwf	timer2
pulse_loop
	bsf		irout		;IR on
	movlw	0x02
	movwf	timer1
pulse1
	decfsz	timer1,F	;.2us of 26ms
	goto	pulse1		;.2us
	nop
	nop
	nop
	bcf		irout		;IR off
	movlw	0x04
	movwf	timer1
pulse2
	decfsz	timer1,F
	goto	pulse2
	decfsz	timer2,F
	goto	pulse_loop	;loop w times

	movfw	timer3		;restore the value
	return

;wait w times 38 KHz - no output, but same code as above to get same timing
wait_ir_w
	movwf	timer3		;save the value
	movwf	timer2
wait_loop
	bcf		irout		;IR off
	movlw	0x02
	movwf	timer1
wait1
	decfsz	timer1,F
	goto	wait1
	nop
	nop
	nop
	nop
	bcf		irout		;IR off
	movlw	0x04
	movwf	timer1
wait2
	decfsz	timer1,F
	goto	wait2
	decfsz	timer2,F
	goto	wait_loop	;loop w times

	movfw	timer3		;restore the value
	return

;delay routine about 2 seconds
delay
	movlw   D'60'
    movwf   timer3
del_l3
	movlw   D'200'
    movwf   timer2
del_l2
	movlw   D'200'
    movwf   timer1
del_l1
    decfsz  timer1,F
    goto    del_l1
    decfsz  timer2,F
    goto    del_l2
    decfsz  timer3,F
    goto    del_l3
	return

;delay a bit more than 1 bit time to get past start bit
delay_1plus
	movlw   D'200'		;146=2400 baud
	goto	del_x

;delay routine for 2400 baud
del2400
	movlw   D'136'		;146=2400 baud
del_x
    movwf   timer1
del24_1
    decfsz  timer1,F
    goto    del24_1
	return

;convert hex to ascii
hex2asc
	movwf	hextemp     
    andlw   0x0F            ; get low nibble
    call    dechex
    movwf   asciil
    swapf   hextemp,F
    movf    hextemp,W
    andlw   0x0F            ; get high nibble
    call    dechex
    movwf   asciih
    return
    
;********************************************************************
dechex
    sublw   0x09            ; 9-WREG
    btfss   STATUS,C        ; is nibble Dec?
    goto    HexC            ; no, convert hex
Dec
    movf    hextemp,W       ; convert DEC nibble to ASCII
    andlw   0x0F
    addlw   A'0'
    return
HexC
    movf    hextemp,W       ; convert HEX nibble to ASCII
    andlw   0x0F
    addlw   0x37
    return

phex
	call	hex2asc
	movfw	asciih
	call	chout
	movfw	asciil
	goto	chout

	end
 
Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top