Ok...bis jetzt soll das Programm folgendes machen: Wenn auf der angeschlossenen Folientastaur der Knopf 1 gedrückt wird, soll auf einer Smartcard über den I2C Bus eine 5 gespeichert werden.
Die Tastaturabfrage funktioniert wunderbar, die hab ich schon durch LEDs getestet.
Code:
list p=16f876a
;**********************************************************
;* Pinbelegung
;* ----------------------------------
;* PORTA: 0 LED
;* 1 LED
;* 2 LED
;* PORTB: 0
;* 1 Keyboard 1 4 7 *
;* 2 Keyboard 2 5 8 0
;* 3 Keyboard 3 6 9 #
;* 4 ---------I I I I
;* 5 -----------+ I I
;* 6 -------------+ I
;* 7 ---------------+
; PORTC: 3 SCL
; 4 SDA
;*
;**********************************************************
;
;**********************************************************
; Includedatei für den 16F876a einbinden
#include <P16f876a.INC>
; Configuration festlegen
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
;**************************************************************
Init bsf STATUS, RP0 ; Bank 1
movlw 0x06 ; Digitalumschaltung
movwf ADCON1
movlw D'11010111' ; pull-up Widerstände ein ?
movwf OPTION_REG
movlw D'00000000'
movwf INTCON ;Interupts disable
movlw B'00000000'
movwf TRISA ; RA0 .. RA7 output
movlw B'11110000' ; RB1 .. RB3 output
movwf TRISB
movlw B'00011000' ;RC3,4 inputs
iorwf TRISC,f ;
movlw d'2' ; Busgeschwindigkeit
movwf SSPADD
bcf STATUS, RP0 ; Bank 0
movlw B'00001000' ;Mastermode
movwf SSPCON
bsf SSPCON,SSPEN ;I2C enable
clrf PORTA ;
clrf PORTB ;
clrf PORTC
Main
call Tastatur ; Tastatur abfragen
goto Main ;
;**********************************************************
;
;Abfrage der 3x4-Tastatur
;
;**********************************************************
; Festlegung der Spaltennummern
Row1 equ 1 ;Keyboard 1 4 7 *
Row2 equ 2 ;Keyboard 2 5 8 0
Row3 equ 0 ;Keyboard 3 6 9 #
; ist eine Taste gedrückt? und welche?
Tastatur ; Tastencode nach Taste
; wenn keine Taste gedrückt dann Taste=0
; movlw 0 ; W=0
bsf PORTB, Row2
bsf PORTB, Row3
bcf PORTB, Row1
call col1 ; 1. Spalte abfragen
bsf PORTB, Row1
bcf PORTB, Row2
call col2 ; 2. Spalte
bsf PORTB, Row2
bcf PORTB, Row3
call col3 ; 3. Spalte
return
col1
btfss PORTB, 7
call Knopf1
btfss PORTB, 6
call Knopf4
btfss PORTB, 5
call Knopf7
btfss PORTB, 4
call Knopf11
return
col2
btfss PORTB, 7
call Knopf2
btfss PORTB, 6
call Knopf5
btfss PORTB, 5
call Knopf8
btfss PORTB, 4
call Knopf0
return
col3
btfss PORTB, 7
call Knopf3
btfss PORTB, 6
call Knopf6
btfss PORTB, 5
call Knopf9
btfss PORTB, 4
call Knopf12
return
Knopf1
movlw B'00000001'
movwf PORTA
call i2c_on
movlw B'10100000' ;EEPROM Adresse
call i2c_tx
movlw 0x00 ;high Teil der Speicheradresse
call i2c_tx
movlw 0x03 ;low Teil der Speicheradresse
call i2c_tx
movlw 0x05 ;5 soll gespeichert werden
call i2c_tx
call i2c_off ;Bus freigabe
return
Knopf2
return
Knopf3
return
Knopf4
return
Knopf5
return
Knopf6
return
Knopf7
return
Knopf8
return
Knopf9
return
Knopf11
return
Knopf0
return
Knopf12
return
;*************I2C Unterprogramme**********************************************
i2c_on
bcf PIR1,SSPIF ;SSPIF Bit löschen
bsf STATUS,RP0
bsf SSPCON2,SEN ;Bus Übernahme
bcf STATUS,RP0
goto i2c_warte
i2c_tx
movwf SSPBUF ;zum I2C-Slave übertragen
goto i2c_warte
i2c_off
bsf STATUS,RP0
bsf SSPCON,PEN ;Bus-Freigabe
bcf STATUS,RP0
goto i2c_warte
i2c_rx
bsf STATUS,RP0
bsf SSPCON2,RCEN ;Receive enable
bcf STATUS,RP0
goto i2c_warte
i2c_warte
btfss PIR1,SSPIF
goto i2c_warte
bcf PIR1,SSPIF
zurücksetzen
return
end
Lesezeichen