; PPI_Synced_LED-LCD_Test.asm ; Z80 v1.1 Double-Time Synced LED/LCD Test ; Port A ($08) = LCD Data ; Port B ($09) = LED Bar Graph ; Port C High ($0A) = LCD Control: PC5=RS, PC6=R/W, PC7=E .ORG $0000 DI ; 1. Initialize PPI (All Ports Output - $80) LD A, $80 OUT ($0B), A ; 2. LCD Init Sequence CALL LONG_DELAY LD A, $38 ; 8-bit, 2-line mode CALL LCD_CMD ; Line 60. LD A, $0C ; Display ON, No Cursor CALL LCD_CMD LD A, $01 ; Clear Display CALL LCD_CMD CALL LONG_DELAY ; Line 81. RESTART_ALL: LD HL, MESSAGE ; Point to start of string LD C, 13 ; String length ("Z80 SYSTEM OK") LD B, $01 ; Initialize LED pattern (Bit 0) SYNC_LOOP: ; --- Part A: Update LED Bar --- LD A, B OUT ($09), A ; Update LED Bar (Port B) ; --- Part B: Print One Character --- LD A, (HL) ; Get current character from HL CALL LCD_DATA ; Print to LCD (Port A + Port C). line 66. ; --- Part C: Update Iterators --- INC HL ; Move to next character ; Rotate LED pattern LD A, B RLC A ; Rotate Accumulator Left LD B, A ; Save new pattern for next loop ; --- Part D: Double-Time Delay --- CALL FAST_SYNC_DELAY ; Reduced delay for double speed DEC C ; Decrement character count JR NZ, SYNC_LOOP ; Loop until string is done ; 3. End of string: Clear and start over LD A, $01 ; Clear Display command CALL LCD_CMD CALL LONG_DELAY JP RESTART_ALL ; --- LCD Subroutines (Hardware Verified: PC5=RS, PC6=RW, PC7=E) --- LCD_CMD: OUT ($08), A ; Cmd to Port A LD A, $00 ; RS=0, RW=0, E=0 OUT ($0A), A ; Port C. JR LCD_PULSE ; Line 71. LCD_DATA: OUT ($08), A ; Data to Port A LD A, $20 ; RS=1 (PC5 High), RW=0, E=0 OUT ($0A), A LCD_PULSE: OR $80 ; E=1 (PC7 High) OUT ($0A), A PUSH AF ; Settle time for breadboard capacitance POP AF AND $7F ; E=0 (PC7 Low) OUT ($0A), A RET ; --- Delays --- LONG_DELAY: ; Used for Init and Clear LD DE, $8000 JR D_LOOP FAST_SYNC_DELAY: ; ~50ms delay for double-time speed LD DE, $4000 D_LOOP: DEC DE LD A, D OR E JR NZ, D_LOOP RET MESSAGE: .DB "Z80 SYSTEM OK" .END