Matrix schakelaar in IC

Op 6 juni 2022 22:05:51 schreef Arco:
Wat ik heb gelezen is dat je die shifts ook beide tegelijk moet kunnen gebruiken voor sommige functionaliteit...

Ja, klopt, heel handig met die rubbertoetsjes! Shift, Caps Shift, Extended Mode, Graphic Mode, you name it ;-)

Hoe zou je de in te drukken toetsen willen "aanleveren"? Serieel? USB? anders?

Ik overweeg om het "schakel input X door naar output Y" toch voor een ander project te gebruiken. Misschien maak ik iets.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Op 6 juni 2022 20:32:11 schreef Arco:
Met een eprom heb je trouwens nog een extra input nodig: de ZX blijkt twee verschillende shifts te hebben. (CAPS SHIFT en SYMBOL SHIFT)
Wordt dus een 27C512...

[bijlage]

Deze eprominhoud zou moeten werken...

Ik ben bang dat de werking me toch niet geheel duidelijk is... Het keyboard is nu als een matrix van 8 (KB1) x 5 (KB2) (membraan) 'schakelaars' ingericht. Ik begrijp dat een bepaalde binary input, een combinatie van adreslijnen selecteert, maar maak je nu met deze opzet een schakelaar die KB1-lijnen met KB2-lijnen verbindt? De output van de EPROM zijn de datalijnen (verbonden met KB2); 5V out.

Daarnaast is me toch niet geheel duidelijk waarom Symbol Shift en Caps Shift aparte ingangen zijn, dat zijn het in de 8x5-matrix toch ook niet? En er zijn meer situaties waarbij er meer dan 1 toets tegelijkertijd wordt ingedrukt, bijv. al bij "Shift-e" voor de "E"...

Het zal vast werken, maar ik weet even niet hoe... :-(

EricP

mét CE

Je denkt nog steeds in schakelaars. Waarom?
De ULA set een address en kijkt wat er terug komt op z'n inputs. Dat kan door de address lijn ermee te verbinden, maar het kan ook prima uit de EPROM komen. Die ULA gaat het verschil echt niet door hebben. Schakelaars is moeilijk, onbetrouwbaar en bestaat gewoon niet (om die reden waarschijnlijk).

Die 2 inputs zijn voor combinaties. Anders kun je geen 2 toetsen tegelijk emuleren. De enige combinaties die voor lijken te komen, zijn de 2 shifts.

Arco

Special Member

De binaire input is 1...0, A...Z, Space, Enter (totaal dus 1 t/m 38), en de twee losse shift key ingangen.
(hoe precies staat boven de onderstaande sourcecode waar de epromfile mee gemaakt is)

pic basic code:


'========================================================================================
' PowerBasic - Generating ZX spectrum keyboard encoder
' Bit A8...A15 is addressbus input, D0...D4 is KB0/4 output, A0...A5 is character input
' Bit A6 is Caps shift, A7 is Symbol shift
' Character input (bits A0...A5):
'                  1  = '1', 2  = '2', 3  = '3',..., 10 = '0'
'                  11 = 'A', 12 = 'B', 13 = 'C',..., 36 = 'Z'
'                  37 = 'Space', 38 = 'Enter'
'========================================================================================
#Compile Exe

%D0 =&hFE : %D1 =&hFD : %D2= &hFB : %D3 =&hF7                    'Data masks
%D4 =&hEF : %D5 =&hDF : %D6= &hBF : %D7 =&h7F                    '
%A8 =&hFE : %A9 =&hFD : %A10=&hFB : %A11=&hF7                   'Address masks
%A12=&hEF : %A13=&hDF : %A14=&hBF : %A15=&h7F                   '
%SYMBOLSHIFT = 7                                                'Symbol shuft = A7
%CAPSSHIFT   = 6                                                'Caps shift = A6

'========================================================================================
Function PBMain () As Long
'========================================================================================
  Local Cnt, lVal As dWord, dat As Byte, hFile As Long, Buff As String
  '--------------------------------------------------------------------------------------
  Buff = String$(&h10000,&hFF)                                  'Prefill buffer with 0xFF
  hFile = FreeFile                                              '
  Open "ZXcode.bin" For Binary As #hFile                        'Open .bin file
  For Cnt = 0 To &h0FFFF                                        '65536 bytes: 512k eprom
    Dat = &hFF                                                  '
    lVal = Cnt And &h0000003F                                   '
    If (lVal > 0) And (lVal < 39) Then                          '
      If Hi(Byte,Cnt) = Choose(lVal,%A11,%A11,%A11,%A11,%A11, _ 'Choose address mask
                                    %A12,%A12,%A12,%A12,%A12, _ '
                                    %A9 ,%A15,%A8 ,%A9 ,%A10, _ '
                                    %A9 ,%A9 ,%A14,%A13,%A14, _ '
                                    %A14,%A14,%A15,%A15,%A13, _ '
                                    %A13,%A10,%A10,%A9 ,%A10, _ '
                                    %A13,%A8 ,%A10,%A8 ,%A13, _ '
                                    %A8 ,%A15,%A14) Then        '
                                                                '
        Dat = Choose(lVal, %D0,%D1,%D2,%D3,%D4, _               'Choose data mask
                           %D4,%D3,%D2,%D1,%D0, _               '
                           %D0,%D4,%D3,%D2,%D2, _               '
                           %D3,%D4,%D4,%D2,%D3, _               '
                           %D2,%D1,%D2,%D3,%D1, _               '
                           %D0,%D0,%D3,%D1,%D4, _               '
                           %D3,%D4,%D1,%D2,%D4, _               '
                           %D1,%D0,%D0)                         '
      End If                                                    '
    End If                                                      '           
    If (Bit(Cnt,%CAPSSHIFT)=1) And (Hi(Byte,Cnt) = %A8 ) Then   'Add caps shift if
      Bit Reset Dat,0                                           'needed.
    End If                                                      '
    If (Bit(Cnt,%SYMBOLSHIFT)=1) And (Hi(Byte,Cnt) = %A15) Then 'Add symbol shift if
      Bit Reset Dat,1                                           'needed.
    End If                                                      '
    Mid$(Buff,Cnt+1,1) = Chr$(Dat)                              'Write byte to buffer
  Next Cnt                                                         '
  Put #hFile,, Buff                                             'Write file to disk
  Close #hFile                                                  '
End Function                                                    '

'==================================================================================================
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
bprosman

Golden Member

Elektuur heeft ooit zo iets gemaakt voor een elektronische typemachine.
Met een modernere (Grotere) EPROM kan zo iets een stuk compacter, met een microcontroller nog meer.
Overigens kun je een toetsenbord matrix prima maken met een handvol 4066's.

interface voor elektronische typemachine.pdf

De jongere generatie loopt veel te vaak zijn PIC achterna.
Arco

Special Member

Met een modernere (Grotere) EPROM kan zo iets een stuk compacter

Een 27512 lijkt me al groot genoeg... :) (is voor 99.77% nog leeg...)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com