2016.10.26
前へ

ホームページトップへ戻る

マイコン独立大作戦
キーボードインターフェースの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
独立大作戦の作戦その1はCRTインターフェースボードの製作です。
そして作戦その2は、やっぱりキーボードインターフェースしかありませんでしょう。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第16回]


●ND80Z3.5のキー入力プログラム(4)

前回はおかしな現象の原因がわかって、そのための対策をCPU側のプログラムで行なったことで、問題をクリアすることができました。
が。

落ち着いて考えてみますと、それって面白くないのですよね。
だって、PIC16F87から出力される8ビットのデータが揃っていなくて、ビット0だけが少し遅れて出力されるなんて、みっともないじゃありませんか。
しかし。
そういうことになりますと。
やっぱり出力データはRB7〜RB0の全部を使って8ビットを揃えて出すしかありません。

RB0を出力に使うということは。
INT入力ができない(割込みが使えない)ということになります。
PIC16F87のINT入力はRB0と端子を共有していて、どちらか一方の機能しか使えないのです。
せっかく作ってうまく動作している割込みプログラムですけれど、やむを得ません。
割込みを使わないプログラムに書き換えることにしました。
ジャノ目基板に組んだテスト回路も一部変更をします。

下図のように変更しました。

せっかく作った割込みプログラムです。
それに割込みを使わないように変更したプログラムがうまく動かないかもしれません。
そういう場合の用心のために、どちらでも使えるようにジャンパーピンで配線を切り替えるようにしました。

こちらがそのように回路を変更したテスト基板です。


下が割込みを使わないように書き換えたPIC16F87のプログラムです。

;;;PIC 16F87  keyboard interface
;
;16/10/4 10/7 10/8 10/22 10/23
;internal clock 8mhz
;
        #include <p16f87.inc>        ; processor specific variable definitions  
;
;Program Configuration Register 1
        __CONFIG _CONFIG1,_CP_OFF & _LVP_OFF & _MCLR_ON & _PWRTE_ON & _WDT_ON & _INTRC_CLKOUT
;Program Configuration Register 2
        __CONFIG _CONFIG2,
;
cf=0
zf=2
f=1
w=0
;
bitcntr11 equ 20
bitcntr8 equ 21
keycode equ 22
outdata equ 23
keyoffmk equ 24
;
     org 00
start
     bsf STATUS,5 ;bank 1
        movlw 7c;=8MHz
        movwf OSCCON
     movlw 0
     movwf TRISB
         movlw 11;a0=in CLK,a4=in DT
        movwf TRISA
        bcf STATUS,5 ;bank 0
;

        clrf keycode
        clrf outdata
        clrf keyoffmk
        clrf PORTB
        clrf PORTA      
;       
;start
;
loop
        movlw 0b;=11
        movwf bitcntr11
        movlw 8
        movwf bitcntr8
loop1
        clrwdt
        btfsc PORTA,0
        goto loop1
;
        movlw 80
        xorwf PORTA,f;for test
        movlw 0b
        subwf bitcntr11,w
        btfsc STATUS,zf
        goto skipbit
        movf bitcntr8,w
        btfsc STATUS,zf
        goto skipbit
        btfsc PORTA,4;DT
        bsf STATUS,cf
        btfss PORTA,4;DT
        bcf STATUS,cf
        rrf keycode,f
        decf bitcntr8,f
skipbit
        decfsz bitcntr11,f
        goto loop2
        goto f0check
loop2
        clrwdt
        btfss PORTA,0
        goto loop2
        goto loop1
;
;F0(keyoff) ckeck
f0check
        movlw 0f0
        subwf keycode,w
        btfsc STATUS,zf
        goto keyoffmkset
;
        btfsc keyoffmk,0;keyoff?
        goto keyoff
;
;if shift,ctrl,alt
        movlw 12;left shift
        subwf keycode,w
        btfsc STATUS,zf
        goto shiftset
        movlw 14;left ctrl
        subwf keycode,w
        btfsc STATUS,zf
        goto ctrlset
        movlw 11;left alt
        subwf keycode,w
        btfsc STATUS,zf
        goto altset
;else 
        movf keycode,w
        call dataout
loop3
        clrwdt
        btfss PORTA,0
        goto loop3
        goto loop
;
shiftset
        bsf PORTA,1
        goto loop3
ctrlset
        bsf PORTA,2
        goto loop3
altset
        bsf PORTA,3
        goto loop3
;
keyoffmkset
        bsf keyoffmk,0
        goto loop3
;
keyoff
;shift,ctrl,alt check
        movlw 12;left shift
        subwf keycode,w
        btfsc STATUS,zf
        goto shiftoff
        movlw 14;left ctrl
        subwf keycode,w
        btfsc STATUS,zf
        goto ctrloff
        movlw 11;left alt
        subwf keycode,w
        btfsc STATUS,zf
        goto altoff
;else
        movf keycode,w
        subwf outdata,w
        btfss STATUS,zf;equal?
        goto keyoffmkclr
        movlw 0
        call dataout
keyoffmkclr
        bcf keyoffmk,0
        goto loop3
;
shiftoff
        bcf PORTA,1
        goto keyoffmkclr
ctrloff
        bcf PORTA,2
        goto keyoffmkclr
altoff
        bcf PORTA,3
        goto keyoffmkclr        
;
; subroutine
;
dataout
        movwf outdata
        movwf PORTB
        return
;
     end
;


割込みを使っても使わなくても、やっていることは同じなのですけれど、割込みを使わない今回のプログラムはかえってわかりにくいものになってしまいました。

こちらはCPU側のキー入力プログラムです。
PIC16F87から2回読み込んで比較していたところをもとのプログラムのように1回読み込むように変更しました。

2016/10/23  17:54  keypic1f.txt
END=8177
              ;;; keyboard test program from pic16f87
              ;16.10.8 10.20 10.23
              ;
                ORG $8100
              ;
                ADISP=$1015
                HXDP2=$104B
              ;
8100 C30481     JP START0
8103 00       SHFTMK:DB 00
8104 3E8A     START0:LD A,8A
8106 D383       OUT (83),A
8108 3EFF       LD A,FF
810A D382       OUT (82),A
810C 0600     START1:LD B,00
810E DB81     START2:IN A,(81);keycode
8110 B7         OR A
8111 CA0C81     JP Z,START1
8114 4F         LD C,A
8115 CD5081     CALL HEXDP
8118 79         LD A,C
8119 FE1A       CP 1A;=Z
811B C8         RET Z
811C B8         CP B
811D CA3C81     JP Z,SHFTCK;already disp,but shift?
8120 41         LD B,C
8121 DB82       IN A,(82);shift check
8123 320381     LD (SHFTMK),A
8126 B7         OR A
8127 FA3381     JP M,SHFTIN
812A 110092   NOSHFT:LD DE,$9200
812D CD5F81   ASCDP:CALL ASCDPS
8130 C30E81     JP START2
8133 320381   SHFTIN:LD (SHFTMK),A
8136 110093     LD DE,$9300
8139 C32D81     JP ASCDP
              ;
813C DB82     SHFTCK:IN A,(82)
813E B7         OR A
813F FA0E81     JP M,START2
8142 3A0381     LD A,(SHFTMK)
8145 B7         OR A
8146 F20E81     JP P,START2
8149 AF         XOR A
814A 320381     LD (SHFTMK),A
814D C32A81     JP NOSHFT
              ;
8150 3E5B     HEXDP:LD A,5B;[
8152 CD1510     CALL ADISP
8155 61         LD H,C
8156 CD4B10     CALL HXDP2
8159 3E5D       LD A,5D;]
815B CD1510     CALL ADISP
815E C9         RET
              ;
815F 210091   ASCDPS:LD HL,$9100
8162 C5         PUSH BC
8163 79         LD A,C
8164 0630       LD B,30
8166 BE       ASCDPS2:CP (HL)
8167 CA7181     JP Z,ASCDPS3
816A 23         INC HL
816B 05         DEC B
816C C26681     JP NZ,ASCDPS2
816F C1         POP BC
8170 C9         RET
8171 62       ASCDPS3:LD H,D
8172 7E         LD A,(HL)
8173 CD1510     CALL ADISP
8176 C1         POP BC
8177 C9         RET
              ;
              ;END
ADISP        =1015  ASCDP        =812D  ASCDPS       =815F  
ASCDPS2      =8166  ASCDPS3      =8171  HEXDP        =8150  
HXDP2        =104B  NOSHFT       =812A  SHFTCK       =813C  
SHFTIN       =8133  SHFTMK       =8103  START0       =8104  
START1       =810C  START2       =810E  

下が実行結果です。

logfile nd80zlog\10231755.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
ndwr2h.bin loaded,from E23F to E535
>/ld keypic1f.bin,8100
loading KEYPIC1F.BIN ...0078(120)bytes loaded,from 8100 to 8177
>usr($8100)
[FF][16]1[16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16
][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16
][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16
][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16
][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16
][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16
][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16
][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16
][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16
][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16
][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16
][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16
][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16
][1E]2[1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1
E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1
E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1
E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1
E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1
E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1
E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1
E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1
E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1
E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1
E][1E][26]3[26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][
26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][
26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][
26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][
26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][
26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][
26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][
26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][
26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][
26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][
26][26][26][1C]a[1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C]
[1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C]
[1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C]
[1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C]
[1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C]
[1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C]
[1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C]
[1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C]
[1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C]
[1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C]
[1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C]
[1C][1C][1C][1C][1C][32]b[32][32][32][32][32][32][32][32][32][32][32][32][32][32
][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32
][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32
][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32
][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32
][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32
][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32
][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32
][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32
][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32
][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32
][32][32][32][32][32][32][32][1C]A[1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1
C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1
C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1
C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1
C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1
C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1
C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1
C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1
C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1
C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1
C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1
C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1
C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1
C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][32]B[32][32][32][32][32][32][
32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][
32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][
32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][
32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][
32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][
32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][
32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][
32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][
32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][
32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][
32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][
32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][
32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][
32][32][32][32][32][21]C[21][21][21][21][21][21][21][21][21][21][21][21][21][21]
[21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21]
[21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21]
[21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21]
[21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21]
[21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21]
[21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21]
[21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21]
[21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21]
[21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21]
[21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21]
[21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21]
[21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21]
[21][21][21][21][21][21][21][21][21][21][23]d[23][23][23][23][23][23][23][23][23
][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23
][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23
][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23
][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23
][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23
][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23
][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23
][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23
][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23
][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23
][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23
][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23
][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23
][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][1A]
>cm 8115
8115 CD-00
8116 50-00
8117 81-00
8118 79-
>usr($8100)
12345!"#$%abcdeABCDEXYy
>/exit
0000 00C3 - 
リモート接続を終了しました
logfile closed at Sun Oct 23 17:58:41 2016

問題なく動作しているようです。
ここまではうまくできたように思います。

というところまでできたところで、このあたりで一区切りつけたいと思います。
今回でひとまずキーボードインターフェースについては一旦お休みということにいたします。
まだ[Ctrl]や[Alt]については作業していませんし、また2バイトコードの処理やカナ入力についてなどもまだ手をつけていませんが、それはもう少し後になってから作業にかかることにします。

マイコン独立大作戦はその名のごとく「大作戦」なのです。
現在第1作戦の「CRTインターフェースボードの製作」も休止中ですが、こちらは近日中に作戦再開の予定です。
この「キーボードインターフェースの製作」が第2作戦です。
実はもうひとつ第3の作戦があるのです。
明日からはその第3作戦を開始いたします。
何が始まるか(おそらくはおおよその見当はついていらっしゃるとは思いますが)。
乞う、ご期待。
です。

キーボードインターフェースの製作[第16回]
2016.10.26upload

前へ

ホームページトップへ戻る