;################################# ;# # ;# Phillips PCF8833 Controller # ;# ----------------------------- # ;# NOKIA 6100 - Color Display # ;# # ;################################# .include "m8def.inc" ;ATmega8L @ 1MHz (interner Quarz) ;------------------------ ;*** Deffinitionen *** ;------------------------ ;Port Deffinitionen .equ disp_PORT = PORTC .equ disp_PIN = PINC .equ disp_DDRD = DDRC ;Display Hardware Deffinitionen .equ disp_reset = 0 ;Reset .equ disp_clk = 1 ;Clock .equ disp_data = 2 ;Data .equ disp_cs = 3 ;CS ;Display Software Deffinitionen .equ SW_RESET = 0x01 .equ BSTR_ON = 0x03 .equ SLEEP_OUT = 0x11 .equ DISP_ON = 0x29 .equ RGB_SET = 0x2D .equ ALL_PIXEL_ON = 0x23 ;Register Deffinitionen .def disp_daten = r16 .def disp_cmd = r17 .def disp_counter = r18 .def loop = r19 .def hreg1 = r20 ;####################################### ldi hreg1, HIGH(RAMEND) out SPH, hreg1 ldi hreg1, LOW(RAMEND) out SPL, hreg1 ;Stack initialisieren ;####################################### ;------------------------ ; *** Programmstart *** ;------------------------ ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ldi hreg1, 0xFF out disp_DDRD, hreg1 ldi hreg1, 0x00 out disp_PORT, hreg1 ;disp_PORT - Port als ausgang, alle pins auf LOW ;Führe Hardware-Reset aus: sbi disp_PORT, disp_cs cbi disp_PORT, disp_clk ;interface AUS cbi disp_PORT, disp_reset ;hardware-reset ldi loop, 0xC8 ;200ms pause rcall wait sbi disp_PORT, disp_reset ;hardware-reset fertig cbi disp_PORT, disp_cs ;interface AN ;Hardware-Reset beendent. rcall display_init ;Display initialisieren end: rjmp end ;Endlosschleife ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;------------------------ ; *** Unterprogramme *** ;------------------------ ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ display_init: ldi disp_cmd, SW_RESET rcall display_command ;Software reset ldi disp_cmd, SLEEP_OUT rcall display_command ;Display aus dem stromsparmodus wecken ldi disp_cmd, DISP_ON rcall display_command ;Booster voltage ON ldi loop, 0xFF rcall wait ;mind. 200ms bis Booster voltage aufgebaut ldi disp_cmd, BSTR_ON rcall display_command ;Display ON ldi disp_cmd, ALL_PIXEL_ON ;Alle Pixel einschalten. rcall display_command ret ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ wait: ;warte loop * 1ms (wenn loop = 5 --> 5ms Pause) ldi R17, 0x1F WGLOOP0: ldi R18, 0x28 WGLOOP1: dec R18 brne WGLOOP1 dec R17 brne WGLOOP0 dec loop breq next1 ;Wenn loop = 0 springe wieder zurück zum programm. rjmp wait next1: ret ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ display_command: cbi disp_PORT, disp_clk cbi disp_PORT, disp_data ;kommando soll übertragen werden sbi disp_PORT, disp_clk ;1. bit wird gelesen ldi disp_counter, 0x08 ; noch 8 bit übertragen dis_comand1: cbi disp_PORT, disp_clk lsl disp_cmd ;Bit ins carry schieben, MSB first brcs csub1 brcc csub2 ;Bit vorbereiten sbi disp_PORT, disp_clk dec disp_counter breq cnext rjmp dis_comand1 cnext: ret ;~~~~~~~ csub1: sbi disp_PORT, disp_data ret csub2: cbi disp_PORT, disp_data ret ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ display_data: cbi disp_PORT, disp_clk sbi disp_PORT, disp_data ;daten sollen übertragen werden sbi disp_PORT, disp_clk ;1. bit wird gelesen ldi disp_counter, 0x08 ; noch 8 bit übertragen disp_data1: cbi disp_PORT, disp_clk lsl disp_daten ;Bit ins carry schieben, MSB first brcs dsub1 brcc dsub2 ;Bit vorbereiten sbi disp_PORT, disp_clk dec disp_counter breq dnext rjmp disp_data1 dnext: ret ;~~~~~~~ dsub1: sbi disp_PORT, disp_data ret dsub2: cbi disp_PORT, disp_data ret ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~