|
/*
/* 32 key + LED pad controller - Hardware test -
/*
/* design is PIC16f84
/*
/* main PROGRAM
/*
/* ID情報とコンフィグレーション・ヒューズの設定
/* NOT Assigned (disable)
/* ファイル・レジスタの定義------------------------------------------
/* PAGE 0
#DEF IND0 00
#DEF TMR0 01
#DEF PCL 02
#DEF STATUS 03
#DEF FSR 04
#DEF PORTA 05
#DEF PORTB 06
#DEF EEDATA 08
#DEF EEADR 09
#DEF PCLATH 0A
#DEF INTCON 0B
/* PAGE 1
#DEF OPTION 01
#DEF TRISA 05
#DEF TRISB 06
#DEF EECON1 08
#DEF EECON2 09
/* ビット・アドレスの定義
/* PORTA AND TRISA BITS
#DEF SLA 0
#DEF SLB 1
#DEF SLC 2 ; for 74ls238 (3B->8)
#DEF BEEP 3 ; reserved (beep or I2C)
#DEF /SW 4 ; reserved (config or I2C)
/* PORTB AND TRISB BITS
#DEF ROW0 0
#DEF ROW1 1
#DEF ROW2 2
#DEF ROW3 3
#DEF ROW4 4
#DEF ROW5 5
#DEF ROW6 6
#DEF ROW7 7
/* STATUS BITS
#DEF CARRY 0
#DEF RP0 5
#DEF ZERO 2
/* INTCON BITS
#DEF GIE 7
#DEF TOIE 5
#DEF TOIF 2
/* OPTION BITS
#DEF PS0 0
#DEF PS1 1
#DEF PS2 2
#DEF PSA 3
#DEF RTS 5
/* EECON1 BITS
#DEF RD 0
#DEF WR 1
#DEF WREN 2
#DEF WRERR 3
#DEF EEIF 4
/* ユーザー用ファイル・レジスタの定義--------------------------------
#DEF WAITBUF 0C
#DEF WWBUF 0D
#DEF DATA 0E
#DEF LEDF1 10
#DEF LEDF2 11
#DEF LEDF3 12
#DEF LEDF4 13
#DEF INDA 14
#DEF INDB 15
#DEF DATABUF 16
#DEF INSTOCK 17
#DEF KEYF1 18
#DEF KEYF2 19
#DEF KEYF3 1A
#DEF KEYF4 1B
/* 宛先指定子の定義-------------------------------------------------
#DEF WREG 0
#DEF BACK 1
/* パワーオン・リセット・ベクタ-------------------------------------
#ORG 0
GOTO MAIN
/* -----------------------------------------------------------------
/* MAIN PROGRAM ----------------------------------------------------
/* -----------------------------------------------------------------
#LBL MAIN
BSF STATUS,RP0 ;BANK 1
MOVLW #20
MOVWF INTCON ;INTCON 00100000
MOVLW #CF
MOVWF OPTION ;OPTION 110X1XXX
MOVLW #F0
MOVWF TRISA ;TRISA XXX10000
MOVLW #11
MOVWF TRISB ;TRISB 11111111 ;input
BCF STATUS,RP0 ;BANK 0
NOP
#LBL INIT
MOVLW #03
MOVWF PORTA ;ADD INKEY4 SET(default)
CLRF LEDF1
CLRF LEDF2
CLRF LEDF3
CLRF LEDF4
CALL LEDINDI ;All LED turn off
/*----------------------------------------------
/*----------------------------------------------
MOVLW #FE
MOVWF LEDF1
MOVWF LEDF2
MOVWF LEDF3
MOVWF LEDF4
CALL LEDINDI
MOVLW #F0
MOVWF WWBUF
CALL WWAITR
MOVLW #EF
MOVWF LEDF1
MOVWF LEDF2
MOVWF LEDF3
MOVWF LEDF4
CALL LEDINDI
MOVLW #F0
MOVWF WWBUF
CALL WWAITR
MOVLW #FF
MOVWF LEDF1
MOVWF LEDF2
MOVWF LEDF3
MOVWF LEDF4
CALL LEDINDI
#LBL INF
MOVLW #F0
MOVWF WWBUF
CALL WWAITR
MOVLW #FF
CLRF LEDF1
MOVWF LEDF2
MOVWF LEDF3
MOVWF LEDF4
CALL LEDINDI
MOVLW #F0
MOVWF WWBUF
CALL WWAITR
MOVLW #FF
MOVWF LEDF1
CLRF LEDF2
MOVWF LEDF3
MOVWF LEDF4
CALL LEDINDI
MOVLW #F0
MOVWF WWBUF
CALL WWAITR
MOVLW #FF
MOVWF LEDF1
MOVWF LEDF2
CLRF LEDF3
MOVWF LEDF4
CALL LEDINDI
MOVLW #F0
MOVWF WWBUF
CALL WWAITR
MOVLW #FF
MOVWF LEDF1
MOVWF LEDF2
MOVWF LEDF3
CLRF LEDF4
CALL LEDINDI
#LBL MT1
CALL GETKEYST
CALL CONSWAIT
MOVLW #FF
XORWF KEYF1,WREG
MOVWF LEDF1
MOVLW #FF
XORWF KEYF2,WREG
MOVWF LEDF2
MOVLW #FF
XORWF KEYF3,WREG
MOVWF LEDF3
MOVLW #FF
XORWF KEYF4,WREG
MOVWF LEDF4
CALL LEDINDI
GOTO MT1
/*-----------------------------------------------
/* STAND-BY MOTION -routine-
/* "Power-ON" KEY NO.'31' (preliminary!!)
/*-----------------------------------------------
#LBL STANDBY1
CLRF LEDF1
CLRF LEDF2
CLRF LEDF3
#LBL STBY1LP1
MOVLW #80
MOVWF LEDF4 ;NO.31 turn ON
CALL LEDINDI
MOVLW #0C
MOVWF DATABUF
#LBL STBY1LP2
CALL GETKEYNO
XORLW #1F
BTFSC STATUS,ZERO
RETURN
DECFSZ DATABUF,BACK
GOTO STBY1LP2
CLRF LEDF4 ;NO.31 turn OFF
CALL LEDINDI
MOVLW #0C
MOVWF DATABUF
#LBL STBY1LP3
CALL GETKEYNO
XORLW #1F
BTFSC STATUS,ZERO
RETURN
DECFSZ DATABUF,BACK
GOTO STBY1LP3
GOTO STBY1LP1
/*-----------------------------------------------
/* LED INDICATE
/* ----------------------------------------------
#LBL LEDINDI
BSF STATUS,RP0 ;BANK 1
MOVLW #00
MOVWF TRISB ;TRISB 00000000 ;output
BCF STATUS,RP0 ;BANK 0
MOVLW #07 ;ADD LEDF1 SET
MOVWF PORTA
NOP
NOP
MOVF LEDF1,WREG
MOVWF PORTB
NOP
NOP
MOVLW #06 ;ADD LEDF2 SET
MOVWF PORTA
NOP
NOP
MOVF LEDF2,WREG
MOVWF PORTB
NOP
NOP
MOVLW #05 ;ADD LEDF3 SET
MOVWF PORTA
NOP
NOP
MOVF LEDF3,WREG
MOVWF PORTB
NOP
NOP
MOVLW #04 ;ADD LEDF4 SET
MOVWF PORTA
NOP
NOP
MOVF LEDF4,WREG
MOVWF PORTB
NOP
NOP
MOVLW #03 ;ADD INKEY4 SET (Attention!!)
MOVWF PORTA
BSF STATUS,RP0 ;BANK 1
MOVLW #FF
MOVWF TRISB ;TRISB 11111111 ;input
BCF STATUS,RP0 ;BANK 0
RETURN
/*-----------------------------------------------
/* BIT TO MATRIX
/* IN:WREG <- BINARY DATA OUT:LEDF1-4 INDI REG
/*-----------------------------------------------
#LBL BTOMATX
MOVWF DATABUF
CLRF INDA
CLRF INDB
CLRF LEDF1
CLRF LEDF2
CLRF LEDF3
CLRF LEDF4
#LBL BTOML1
MOVLW #08
SUBWF DATABUF,WREG
BTFSS STATUS,CARRY
GOTO UNDER8
INCF INDA,BACK
MOVLW #08
SUBWF DATABUF,BACK
GOTO BTOML1
#LBL UNDER8
CALL BTOMR1
MOVWF INDB
MOVF INDA,BACK
BTFSC STATUS,ZERO
GOTO BTOMF1
DECF INDA,BACK
BTFSC STATUS,ZERO
GOTO BTOMF2
DECF INDA,BACK
BTFSC STATUS,ZERO
GOTO BTOMF3
#LBL BTOMF4
MOVF INDB,WREG
MOVWF LEDF4
RETURN
#LBL BTOMF1
MOVF INDB,WREG
MOVWF LEDF1
RETURN
#LBL BTOMF2
MOVF INDB,WREG
MOVWF LEDF2
RETURN
#LBL BTOMF3
MOVF INDB,WREG
MOVWF LEDF3
RETURN
#LBL BTOMR1
MOVF DATABUF,WREG
ADDWF PCL,BACK
RETLW #01
RETLW #02
RETLW #04
RETLW #08
RETLW #10
RETLW #20
RETLW #40
RETLW #80
/*-----------------------------------------------
/*入力key NO. 検出ルーティン (MINIMAM KEY NO.)
/* reg:INSTOCK 0-31:keyNO. 32:no hit
/* ->W #FF(NO KEY HIT) #00(KEY HIT DETECT)
/*-----------------------------------------------
#LBL GETKEYNO
CLRF INSTOCK
MOVLW #03
MOVWF PORTA
CALL INCHKROW
MOVLW #02
MOVWF PORTA
CALL INCHKROW
MOVLW #01
MOVWF PORTA
CALL INCHKROW
MOVLW #00
MOVWF PORTA
CALL INCHKROW
MOVLW #32
SUBWF INSTOCK,WREG
BTFSC STATUS,ZERO
RETLW #FF ; DATA EMPTY CODE (INSTOCK=32)
RETLW #00 ; DATA VALID CODE
#LBL INCHKROW
INCF INSTOCK,BACK
BTFSC PORTB,#7
CLRF INSTOCK,BACK
INCF INSTOCK,BACK
BTFSC PORTB,#6
CLRF INSTOCK,BACK
INCF INSTOCK,BACK
BTFSC PORTB,#5
CLRF INSTOCK,BACK
INCF INSTOCK,BACK
BTFSC PORTB,#4
CLRF INSTOCK,BACK
INCF INSTOCK,BACK
BTFSC PORTB,#3
CLRF INSTOCK,BACK
INCF INSTOCK,BACK
BTFSC PORTB,#2
CLRF INSTOCK,BACK
INCF INSTOCK,BACK
BTFSC PORTB,#1
CLRF INSTOCK,BACK
INCF INSTOCK,BACK
BTFSC PORTB,#0
CLRF INSTOCK,BACK
RETURN
/*-----------------------------------------------
/*入力key 状態 検出ルーティン (ALL KEY)
/* reg:KEYF1-F4 HIT=1
/*-----------------------------------------------
#LBL GETKEYST
CLRF KEYF1
CLRF KEYF2
CLRF KEYF3
CLRF KEYF4
MOVLW #03
MOVWF PORTA
NOP
MOVF PORTB,WREG
MOVWF KEYF4
MOVLW #02
MOVWF PORTA
NOP
MOVF PORTB,WREG
MOVWF KEYF3
MOVLW #01
MOVWF PORTA
NOP
MOVF PORTB,WREG
MOVWF KEYF2
MOVLW #00
MOVWF PORTA
NOP
MOVF PORTB,WREG
MOVWF KEYF1
RETURN
/*-----------------------------------------------
#LBL CONSWAIT
MOVLW #02
MOVWF WWBUF
#LBL WWAITR
CLRF WAITBUF
CALL WAITR
DECF WWBUF,BACK
BTFSS STATUS,ZERO
GOTO WWAITR
RETURN
#LBL WAITR
DECFSZ WAITBUF,BACK
GOTO WAITR
RETURN
/* program END
/*
/* Remark: last session 1999/09/07
/* Ver. 1.0
/*
/* Designed by Mamecho-Dennki studio
/* M-Tech lab.1988-1999
/*
・ このソース・プログラムは、「トラ技95年12月号 幾島康夫氏製作のクロスアセンブラ」に合わせて記述しています。
|