/*
/*	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月号 幾島康夫氏製作のクロスアセンブラ」に合わせて記述しています。
Back to: wep INDEX