マイコン独立大作戦
キーボードインターフェースの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
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
前へ
ホームページトップへ戻る