; Nixie-Uhr-Programm mit Bitbanging für I2C ; Register-Definitionen HOUR EQU R0 MINUTE EQU R1 SECOND EQU R2 MODE EQU R3 ; Tasten-Definitionen HOUR_INC EQU P1.2 HOUR_DEC EQU P1.3 MIN_INC EQU P1.4 MIN_DEC EQU P1.5 ; 8255-Definitionen PORTA EQU 0FFH ; Stunden PORTB EQU 0FEH ; Minuten ; 74141-Definitionen IC1 EQU PORTA ; Stunden IC2 EQU PORTB ; Minuten ; PCF8563-Definitionen PCF8563_ADDR EQU 0A2H ; I2C-Adresse PCF8563_SEC EQU 2 ; Sekunden-Register PCF8563_MIN EQU 3 ; Minuten-Register PCF8563_HOUR EQU 4 ; Stunden-Register ; I2C-Pins SCL EQU P1.0 SDA EQU P1.1 ; Bitbanging-Funktionen für I2C I2C_START: SETB SDA SETB SCL CLR SDA CLR SCL RET I2C_STOP: CLR SDA SETB SCL SETB SDA RET I2C_WRITE_BYTE: MOV R4, #8 I2C_WRITE_LOOP: RLC A MOV SDA, C SETB SCL CLR SCL DJNZ R4, I2C_WRITE_LOOP RET I2C_READ_BYTE: MOV R4, #8 I2C_READ_LOOP: SETB SCL MOV C, SDA RLC A CLR SCL DJNZ R4, I2C_READ_LOOP RET ; Programm-Start ORG 0 MOV HOUR, #12 ; Start-Stunde MOV MINUTE, #0 ; Start-Minute MOV SECOND, #0 ; Start-Sekunde MOV MODE, #0 ; Start-Modus ; Hauptschleife LOOP: ; Tasten abfragen JB HOUR_INC, HOUR_INC_PRESSED JB HOUR_DEC, HOUR_DEC_PRESSED JB MIN_INC, MIN_INC_PRESSED JB MIN_DEC, MIN_DEC_PRESSED ; Zeit von PCF8563 lesen CALL I2C_START MOV A, #PCF8563_ADDR CALL I2C_WRITE_BYTE MOV A, #PCF8563_SEC CALL I2C_WRITE_BYTE CALL I2C_START MOV A, #PCF8563_ADDR + 1 CALL I2C_WRITE_BYTE CALL I2C_READ_BYTE MOV SECOND, A CALL I2C_READ_BYTE MOV MINUTE, A CALL I2C_READ_BYTE MOV HOUR, A CALL I2C_STOP ; Anzeige aktualisieren MOV A, HOUR ANL A, #0FH MOV IC1, A MOV A, HOUR SWAP A ANL A, #0FH MOV IC1, A MOV A, MINUTE ANL A, #0FH MOV IC2, A MOV A, MINUTE SWAP A ANL A, #0FH MOV IC2, A ; Zurück zur Hauptschleife JMP LOOP ; Tasten-Handler HOUR_INC_PRESSED: INC HOUR CJNE HOUR, #24, HOUR_INC_DONE MOV HOUR, #0 CALL I2C_START MOV A, #PCF8563_ADDR CALL I2C_WRITE_BYTE MOV A, #PCF8563_HOUR CALL I2C_WRITE_BYTE MOV A, HOUR CALL I2C_WRITE_BYTE CALL I2C_STOP HOUR_INC_DONE: JMP LOOP HOUR_DEC_PRESSED: DEC HOUR CJNE HOUR, #255, HOUR_DEC_DONE MOV HOUR, #23 CALL I2C_START MOV A, #PCF8563_ADDR CALL I2C_WRITE_BYTE MOV A, #PCF8563_HOUR CALL I2C_WRITE_BYTE MOV A, HOUR CALL I2C_WRITE_BYTE CALL I2C_STOP HOUR_DEC_DONE: JMP LOOP MIN_INC_PRESSED: INC MINUTE CJNE MINUTE, #60, MIN_INC_DONE MOV MINUTE, #0 CALL I2C_START MOV A, #PCF8563_ADDR CALL I2C_WRITE_BYTE MOV A, #PCF8563_MIN CALL I2C_WRITE_BYTE MOV A, MINUTE CALL I2C_WRITE_BYTE CALL I2C_STOP MIN_INC_DONE: JMP LOOP MIN_DEC_PRESSED: DEC MINUTE CJNE MINUTE, #255, MIN_DEC_DONE MOV MINUTE, #59 CALL I2C_START MOV A, #PCF8563_ADDR CALL I2C_WRITE_BYTE MOV A, #PCF8563_MIN CALL I2C_WRITE_BYTE MOV A, MINUTE CALL I2C_WRITE_BYTE CALL I2C_STOP MIN_DEC_DONE: JMP LOOP END