Hi guys,

I was wondering if someone can help me out here on a simple task.
I've been learning a lot by reading about sending data to a keyboard's PS/2 port, but I am unable to send a simple letter and have it show up in notepad.exe on the host computer.

I know the following: data sent must have Start Bit = 0, Scancode (LSB First), Odd Parity, Stop Bit = 1.

Now, I don't care about keyboard initialization, because I will be booting up the PC with a normal keyboard attached, then swapping out the keyboard with my device.

All I want to do is send the letter 'q' ($15).

I am doing so by sending q (0+$51+0+1), then the release code (0+$0F+1+1), then q again (0+$51+0+1).

However, I am not getting anything on the host side of things.

Here is my code:




Code:
; PS2SendCode          
;               
;                                     PIC16F648A                 
;                         _________________  _______________          
;                       1|RA2/AN2/VREF               RA1/AN1|18
;                       2|RA3/AN3/CMP1               RA0/AN0|17 
;                       3|RA4/TOCKI/CMP2      RA7/OSC1/CLKIN|16     
;              VPP ---> 4|RA5/MCLR/VPP       RA6/OSC2/CLKOUT|15                            
;                   Gnd 5|Vss                            Vdd|14 +5                            
;                       6|RB0/INT              RB7/T1OSI/PGD|13 <--- PGD            
;                       7|RB1/RX/DT      RB6/T1OSO/T1CKI/PGC|12 <--- PGC                    
;                       8|RB2/TX/CK                      RB5|11 <--> PS2DATA
;      PUSH BUTTON ---> 9|RB3/CCP1                   RB4/PGM|10 <--- PS2CLK _|¯|_|¯|_|¯|_|¯|_ 
;                         ----------------------------------           
;                       
;===============================================================================
;                             Keyboard to Host Protocol
;             ___    _   _   _   _   _   _   _   _   _   _   _   _   ___
;       CLOCK    |__| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_|
;
;       DATA       |  S | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | P | E |
;
;          S = start bit = 0    P = odd parity   E = stop bit = 1
;                      data valid on falling edge of clock
;===============================================================================


@                 errorlevel  -223,-207,-306               ; Suppress useless messages
@                 LIST   P=PIC16F648A
@                 __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _CP_OFF & _BODEN_OFF & _PWRTE_OFF & _LVP_OFF

;Using 4MHz oscillator
define          OSC 4
;DEFINE SHIFT_PAUSEUS 43

                PortB = 0            'Clear Port B
                INTCON = 0           'Interrupts Off
                CMCON = %00000111    'Disable Comparators
                OPTION_REG.7 = 0     'Enable Port B Weak Pull-Ups

BitCnt          VAR BYTE
KBTimeout       VAR BYTE
ScanCode        VAR Word
Parity          Var BYTE
StartButton     Var PortB.3
PS2Clk          var PortB.4          '0
PS2Dat          var PortB.5          '0
                TRISB = %11111111    'Set PORTB pins direction to input

Start:          pause 500
                                
                if startbutton = 0 then: goSUB StartSend

                goto start

StartSend:                                       
                'SEND Q ($15 LSB FIRST)
                Parity = 1                          'Odd parity
                scancode.0 = 0
                Gosub sendbit                       'send START BIT
                scancode = %00010101                'send 'q'
                For bitcnt = 1 To 8                 'set for 8 data bits
                    Gosub sendbit                   'send DATA BIT
                    If scancode.0 = 1 Then: parity = parity + 1
                scancode = scancode >> 1            'shift out next bit
                Next bitcnt
                scancode.0 = parity.0
                Gosub sendbit                       'send PARITY BIT
                scancode.0 = 1
                Gosub sendbit                       'send STOP BIT

                'SEND RELEASE ($F0 LSB FIRST)
                Parity = 1                          'Odd parity
                scancode.0 = 0
                Gosub sendbit                       'send START BIT
                scancode = %11110000                'send '$F0'
                For bitcnt = 1 To 8                 'set for 8 data bits
                    Gosub sendbit                   'send DATA BIT
                    If scancode.0 = 1 Then: parity = parity + 1
                    scancode = scancode >> 1        'shift out next bit
                Next bitcnt
                scancode.0 = parity.0
                Gosub sendbit                       'send PARITY BIT
                scancode.0 = 1
                Gosub sendbit                       'send STOP BIT

                'SEND Q ($15 LSB FIRST)
                Parity = 1                          'Odd parity
                scancode.0 = 0
                Gosub sendbit                       'send START BIT
                scancode = %00010101                'send 'q'
                For bitcnt = 1 To 8                 'set for 8 data bits
                    Gosub sendbit                   'send DATA BIT
                    If scancode.0 = 1 Then: parity = parity + 1
                    scancode = scancode >> 1        'shift out next bit
                Next bitcnt
                scancode.0 = parity.0
                Gosub sendbit                       'send PARITY BIT
                scancode.0 = 1
                Gosub sendbit                       'send STOP BIT
        
                Return
     
SendBit:
        'Looking for keyboard clock and data line to go high, then send data bit to it!
        ;If NOT(PS2Clk = 1 AND PS2Dat = 1) Then sendbit  'loop until clock line goes low
        PS2Dat = scancode.0                             'send data bit
        return
Any advice appreciated.