;===================================================================== tm1637_delay: ;Zeitverzögerung 5µS (für 100kHz) if f_cpu>600000 push r16 ldi r16,f_cpu/600000 tm1637_delay1: dec r16 brne tm1637_delay1 pop r16 endif ret ;===================================================================== tm1637_init: ;Ausgänge auf 1 setzen cbi port{tm1637_scl_port},tm1637_scl_bit ;bleibt 0, nur ddr geschaltet cbi ddr{tm1637_scl_port},tm1637_scl_bit ;SCL bleibt erstmal hochohmig cbi port{tm1637_sda_port},tm1637_sda_bit ;bleibt 0, nur ddr geschaltet cbi ddr{tm1637_sda_port},tm1637_sda_bit ;SDA bleibt erstmal hochohmig rjmp tm1637_delay ;===================================================================== tm1637_start: cbi ddr{tm1637_scl_port},tm1637_scl_bit ;SCL hoch (für repeated Start) rcall tm1637_delay sbi ddr{tm1637_sda_port},tm1637_sda_bit ;SDA runter rcall tm1637_delay sbi ddr{tm1637_scl_port},tm1637_scl_bit ;SCL runter rcall tm1637_delay ret ;===================================================================== tm1637_stop: sbi ddr{tm1637_sda_port},tm1637_sda_bit ;SDA runter (wenn nicht schon) rcall tm1637_delay cbi ddr{tm1637_scl_port},tm1637_scl_bit ;SCL hoch rcall tm1637_delay cbi ddr{tm1637_sda_port},tm1637_sda_bit ;SDA hoch rcall tm1637_delay ret ;===================================================================== ;Ausgabe r16 über i2c, return: ack=carry gelöscht tm1637_wrbyte: push r17 ldi r17,8 tm1637_wrbyt1: ror r16 brcc tm1637_wrbytnull cbi ddr{tm1637_sda_port},tm1637_sda_bit ;eins ausgeben rjmp tm1637_wrbyteins tm1637_wrbytnull: sbi ddr{tm1637_sda_port},tm1637_sda_bit ;null ausgeben tm1637_wrbyteins: rcall tm1637_delay cbi ddr{tm1637_scl_port},tm1637_scl_bit ;SCL hoch rcall tm1637_delay tm1637_wrbyte2: sbis pin{tm1637_scl_port},tm1637_scl_bit ;ist SCL schon oben? rjmp tm1637_wrbyte2 sbi ddr{tm1637_scl_port},tm1637_scl_bit ;SCL runter rcall tm1637_delay dec r17 brne tm1637_wrbyt1 cbi ddr{tm1637_sda_port},tm1637_sda_bit ;SDA hochohmig rcall tm1637_delay ;Neunten Impuls ausgeben cbi ddr{tm1637_scl_port},tm1637_scl_bit ;SCL hoch rcall tm1637_delay tm1637_wrbyte3: sbis pin{tm1637_scl_port},tm1637_scl_bit ;ist SCL schon oben? rjmp tm1637_wrbyte3 clc ;Ack-Bit in Carry übernehmen sbic pin{tm1637_sda_port},tm1637_sda_bit sec in r17,sreg ;sreg zeitweilig sichern sbi ddr{tm1637_scl_port},tm1637_scl_bit ;SCL runter rcall tm1637_delay out sreg,r17 ;und wiederherstellen pop r17 ret ;===================================================================== packing on Segmenttabelle: data 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07 data 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 packing off tm1637_onible: push r16 push zl push zh andi r16,0x0f ldi zh,high(Segmenttabelle<<1) ldi zl,low(Segmenttabelle<<1) add zl,r16 clr r16 adc zh,r16 lpm r16,z rcall tm1637_wrbyte pop zh pop zl pop r16 ret tm1637_obyte rcall tm1637_onible swap r16 rcall tm1637_onible swap r16 ret ;===================================================================== tm1637_test: rcall tm1637_start ldi r16,0x40 rcall tm1637_wrbyte rcall tm1637_stop rcall tm1637_start ldi r16,0xc0 rcall tm1637_wrbyte ldi r16,0x01 rcall tm1637_onible ldi r16,0x02 rcall tm1637_onible ldi r16,0x03 rcall tm1637_onible ldi r16,0x04 rcall tm1637_onible rcall tm1637_stop rcall tm1637_start ldi r16,0x88 ;Helligkeit 0x88 bis 0x8f rcall tm1637_wrbyte rcall tm1637_stop ret ;==========================================