E
electronicus
Guest
Haw posso cambiare il numero dei moduli, da 11 anche 22, in questo asm "" file?
**************************
;************************************************* *********
; * LEDFONT.ASM V2.1 *
; * LED che si spostano font *
; * MAX7219 Diversi sono cascata, costituiti da moduli *
; * 8x8 LED; tipo di carattere 5x8 *
; * Programma assembler per 8051-controller compatibile, *
; * AT89C51 ad esempio, la frequenza al quarzo 11,0592 MHz *
; * Il seguente programma di controlli fino a 11 moduli.*
;************************************************* *********
; * Mondo dell'elettronica *
; Http://www.woe.de.vu * *
; * Guai (at) topmail.de *
; * (C) GUAI, 1999 *
;************************************************* *********
DIN equ p1.0; DIN a Port 1,0
CLCK equ P1.1, CLK a Port 1.1
LOAD equ P1.2; carico, a Port 1,2
SCL equ p3.5; SCL per I2C-Bus
SDA equ p3.7; SDA per I2C-Bus
equ jumper_ser P1.6; Jumper per il download di serie
jumper_eep equ p3.2; Jumper per EEPROM-mode
jumper_baud equ p3.3; Jumper per baudrate di serie
ser_wait equ P3.4; stretta di mano di serie
LED equ P1.7; LED per il download di serie
MODULO equ 11; numero di 8x8 moduli LED (max. 11); Bandiere (in zona bit, ADR. 20h RAM interna)
i2c_ack_in equ 0
i2c_ack_out equ 1
z_abfrage equ 2
equ eep_mode 3
z_anz_h equ 21h; numero di caratteri
z_anz_l equ 22h; (16 bit)
zeichen_h equ 23h; counter carattere
zeichen_l equ 24h; (16 bit)
sp_off_l equ 25h; Offset per font di caratteri
sp_off_h equ 26h; (16 bit)Anfang:
Seth i2c_ack_out
Seth i2c_ack_in
call clear_disp
ledout_ini chiamata; inizializzazione
jb jumper_ser, Lauf
JMP ser_load
Lauf:
jb jumper_eep, rom_mode
Seth eep_mode
Telefonare read_z_anz; leggere il numero di caratteri di EEPROM
JMP anz_ende
rom_mode:
clr eep_mode
read_anz_rom chiamata; leggere il numero di caratteri di ROM
anz_ende:
mov r0, # 40
clr uno
clr_loop:
mov @ r0, a; celle di memoria chiara 40 ... 127 (RAM interna)
inc r0
cjne r0, # 128, clr_looplauf_loop:
call ledout_ini
zeichen_h mov, # 0; contatore ad alta carattere
zeichen_l mov, # 0; carattere counter BASSA
clr z_abfrage
mov R5, # 0; r5: colonna counter
JNB eep_mode, rom_dat
call read_eeprom
JMP read_end
rom_dat:
call read_rom
read_end:
Spa:
JNB acc.7, z_ascii
call convert_char
JMP z_ok
z_ascii:
clr c
subb A, # 32
jnc z_ok
clr uno
z_ok:
mov b, # 5
mul ab
sp_off_l mov, a; Offset per la colonna
sp_off_h mov, b; (16 bit)
WDH:
mov r1, # 127
mov r0, # 126
shift_ram:
mov a, @ r0
MOV @ R1, una
Dicembre r1
Dicembre r0
cjne r1, # 40, shift_ram
cjne R5, # 5, sp_calc
mov 40, # 0; LED-colonna sul lato destro
mov R5, # 0
Seth z_abfrage
inc zeichen_l
mov a, # 0
cjne uno, zeichen_l, x1
inc zeichen_h
x1:
JNB eep_mode, rom_dat2
call read_eeprom
JMP read_end2
rom_dat2:
call read_rom
read_end2:
Spal:
JNB acc.7, z_ascii2
call convert_char
JMP z_ok2
z_ascii2:
clr c
subb A, # 32
jnc z_ok2
mov a, # 0
z_ok2:
mov b, # 5
mul ab
sp_off_l mov, un
sp_off_h mov, b
JMP l1
sp_calc:
mov DPTR, # Spalten
mov a, sp_off_l
aggiungere una, DPL
jnc Y1
inc DPH
Y1:
mov DPL, un
mov a, sp_off_h
ADD A, DPH
mov DPH, un
MOV A, R5
movc A, @ A DPTR
mov 40, a; LED-colonna sul lato destro
inc r5
L1:
Matrix:
mov r2, # 8, 8 colonne
mov R6, # 47; sinistra LED-colonna del 8x8-modulo a destra
led_10:
mov b, # ((MODULO-1) * 8)
dispout:
MOV A, R6
Aggiungere a, b
mov r1, un
mov a, @ R1
mov r3, un
call ledout
mov a, b
clr c
subb A, # 8
b mov, un
jnc dispout
Seth LOAD; tutti memorizzare i propri dati MAX7219
clr LOAD
Dicembre r6
djnz r2, led_10; tutte le 8 colonne di un modulo
Zeit chiamata; ritardo
JNB z_abfrage, wdh_jump
clr z_abfrage
mov a, z_anz_l
cjne uno, zeichen_l, wdh_jump
mov a, z_anz_h
cjne uno, zeichen_h, wdh_jump
JMP lauf_loop
wdh_jump:
JMP WDH
ser_load:
JNB jumper_baud, B1200; ponticello di esempio per baudrate
b9600:
MOV TH1, # 0fdh; 9600 Baud
mov TL1, # 0fdh
JMP ser
B1200:
MOV TH1, # 0e8h; 1200 Baud
mov TL1, # 0e8h
ser:
mov TMOD, # 20h
scon mov, # 50h
Seth tr1
mov a, sbuf
CLR RI
clr LED; LED Scarica il
z_anz_h mov, # 0
z_anz_l mov, # 0
mov R7, # 2; dati in EEPROM inizia con indirizzo 2
mov R6, # 0a0h
clr ser_wait
wait_data:
jb p3.0, no_startbit
Seth ser_wait
no_startbit:
RI JB, ri_ok
JMP wait_data
ser_wdh:
clr ser_wait
MOV R4, # 3
w3:mov r3,#0 W2:
mov R2, # 0
W1:
jb p3.0, no_start
Seth ser_wait
no_start:
RI JB, ri_ok
djnz r2, w1
djnz R3, w2
djnz R4, w3
JMP ser_end
ri_ok:
mov a, sbuf
CLR RI
Seth ser_wait
Seth LED; LED off
b mov, un
call i2c_start
MOV A, R6, I2C indirizzo di EEPROM
call i2c_send
mov A, R7, indirizzo in EEPROM
call i2c_send
mov a, b, i dati per EEPROM
call i2c_send
call i2c_stop
call wait_eeprom
inc R7
cjne R7, # 0, s1
inc r6
inc r6
S1:
inc z_anz_l
mov a, z_anz_l
cjne a, # 0, s2
inc z_anz_h
S2:
mov R5, z_anz_h
cjne R5, # 7h, ser_wdh
cjne a, # 0FEh, ser_wdhser_end:
call i2c_start
mov a, # 0a0h
call i2c_send
mov a, # 0
call i2c_send
mov a, z_anz_h
call i2c_send
call i2c_stop
call wait_eeprom
call i2c_start
mov a, # 0a0h
call i2c_send
mov a, # 1
call i2c_send
mov a, z_anz_l
call i2c_send
call i2c_stop
call wait_eeprom
Seth ser_wait
blink:
cpl LED
mov R7, # 2
BL1:
mov R6, # 0
BL2:
mov R5, # 0
BL3:
djnz r5, BL3
djnz r6, BL2
djnz R7, BL1
JMP blinkread_eeprom:; leggere il carattere effettivo di EEPROM
push 6
push 7
mov R6, zeichen_h
mov R7, zeichen_l
mov A, R7
ADD A, # 2
jnc no_inc
inc r6
no_inc:
mov R7, un
MOV A, R6
RL A
ORL A, # 0a0h
mov R6, uno
call i2c_start
call i2c_send
mov A, R7
call i2c_send
call i2c_start
MOV A, R6
inc uno
call i2c_send
Seth i2c_ack_out; no ACK
call i2c_read
call i2c_stop
Pop 7
Pop 6
retread_rom:; leggere il carattere effettivo di ROM
mov DPTR, Zeichen #
mov a, DPL
aggiungere una, zeichen_l
jnc no_inc_dph
inc DPH
no_inc_dph:
mov DPL, un
mov a, DPH
aggiungere una, zeichen_h
mov DPH, un
clr uno
movc A, @ A DPTR
retread_z_anz:; leggere il numero di caratteri di EEPROM
call i2c_start
mov a, # 0a0h
call i2c_send
mov a, # 0
call i2c_send
call i2c_start
mov a, # 0a1h
call i2c_send
clr i2c_ack_out
call i2c_read
z_anz_h mov, un
Seth i2c_ack_out; no ACK
call i2c_read
z_anz_l mov, un
call i2c_stop
retread_anz_rom:; leggere il numero di caratteri di ROM
mov DPTR, z_anz_rom #
clr uno
movc A, @ A DPTR
z_anz_h mov, un
mov a, # 1
movc A, @ A DPTR
z_anz_l mov, un
retconvert_char:
cjne a, # 132, CO1
mov a, # 96;
ret
CO1:
cjne a, # 148, CO2
mov a, # 97;
ret
CO2:
cjne a, # 129, CO3
mov a, # 98;
ret
CO3:
cjne a, # 142, CO4
mov a, # 99;
ret
CO4:
cjne a, # 153, Co5
mov a, # 100;
ret
Co5:
cjne a, # 154, CO6
mov a, # 101;
ret
CO6:
cjne a, # 225, CO7
mov a, # 102; á
ret
CO7:
uno CLR; carattere altrimenti vuoto
ret;************************************************* *******
; Inizializzazione: (usa R1, R2, R3, Accu)
ledout_ini:
clr DIN
clr CLCK
clr LOAD
; Modalità Decodifica a 0-7 cifre = normale:
mov r2, # 09h; Indirizzo di Decode Mode Register
mov r3, # 0h; non decodificare
mov r1, # MODULO
decodifica:
call ledout
djnz r1, decodificare, tutti i moduli
Seth LOAD
clr LOAD
; impostare l'intensità di massima:
mov r2, # 0Ah; Indirizzo di intensità Registrati
mov r3, # 0Fh; max.Intensità
mov r1, # MODULO
intens:
call ledout
djnz r1, intens; tutti i moduli
Seth LOAD
clr LOAD
; impostare il limite di scansione su 8 schermi attivi:
mov r2, # 0Bh; Indirizzo di Scan Limit Register
mov r3, # 07h; 8 cifre
mov r1, # MODULO
scanlim:
call ledout
djnz r1, scanlim; tutti i moduli
Seth LOAD
clr LOAD
; Display modalità di prova = off:
mov r2, # 0Fh; Indirizzo di Display Test Registrati
mov r3, # 0h; il normale funzionamento
mov r1, # MODULO
distest:
call ledout
djnz r1, distest; tutti i moduli
Seth LOAD
clr LOAD
; disattivare Individuazione = accendere il display:
mov r2, # 0Ch; Indirizzo di arresto Registrati
mov r3, # 01h; il normale funzionamento
mov r1, # MODULO
shutd:
call ledout
djnz r1, shutd; tutti i moduli
Seth LOAD
clr LOAD
ret;*************************************************
; Chiara visualizzazione completa
clear_disp:
push 1
push 2
push 3
clr DIN
clr CLCK
clr LOAD
mov r2, # 8, 8 cifre
led_ini_10:
mov r3, # 0; dati = 0
mov r1, # MODULO
Modul:
call ledout
djnz r1, modul; tutti i moduli
Seth LOAD
clr LOAD
djnz r2, led_ini_10
pop 3
pop 2
pop 1
ret;*************************************************
; Inviare dati a MAX7219 (senza impulso LOAD!)
; Parametri:
; R2 = byte Indirizzo per MAX7219
; R3 = byte di dati per MAX7219
ledout: push acc
push 0
push 1
mov ACC, r2
mov r1, # 2; 2x 8 bit
lo_5: mov r0, # 8; sempre 8 bit
lo_10: jb acc.7, lo_20
DIN CLR; inviare 0
JMP lo_30
lo_20: DIN Seth; inviare 1
lo_30: CLCK Seth; generare clock
clr CLCK
RL A; prossimo bit
djnz r0, lo_10; (8 volte)
MOV A, R3; byte di dati in accu
djnz r1, lo_5, ancora una volta, ma ora con i dati byte
pop 1
Pop 0
pop acc
ret
;************************************************* *******
; Ritardo
Zeit:
push acc
push b
mov b, # 0EH; valore di partenza del registro B può essere
Z1: MOV A, # 0FFh; aumentato per più lento di velocità
Z2: NOP
NOP
NOP
NOP
djnz ACC, z2
djnz b, Z1
pop b
pop acc
retwait_eeprom:
push 5
push 6
mov R6, # 50
w_eep1:
mov R5, # 100
w_eep2:
djnz r5, w_eep2
djnz r6, w_eep1
Pop 6
pop 5
reti2c_start:; I2C condizione Start
Seth SDA
NOP
Seth scl
call i2c_wait
clr SDA; dati = 0 (Start)
NOP
clr scl; Clock = 0
reti2c_stop:; I2C condizione di arresto
Seth scl; Clock = 1
NOP
Seth SDA; Data = 1 (Stop)
reti2c_send:; inviare 1 byte di dati (Accu) via I2C
push 3
mov r3, # 8
i2c_sloop:
RLC uno
mov sda, c
NOP
Seth scl
call i2c_wait
clr scl
djnz R3, i2c_sloop
NOP
Seth SDA
NOP
Seth scl
call i2c_wait
c mov, SDA, leggere Riconoscere-bit
i2c_ack_in mov, c
clr scl
NOP
clr SDA
pop 3
reti2c_read:; ricevere 1 byte di dati tramite I2C (Accu)
push 3
mov r3, # 8
clr uno
Seth SDA
i2c_rloop:
call i2c_wait
Seth scl
NOP
c mov, sda
RLC uno
NOP
clr scl
djnz R3, i2c_rloop
c mov, i2c_ack_out, inviare Riconoscere-bit
mov sda, c
NOP
Seth scl
call i2c_wait
clr scl
NOP
clr SDA
pop 3
reti2c_wait:; ritardo per I2C (CALL RET -> 4US a 12MHz)
ret
;************************************************* ********
; Font charcter (5x8)
Spalten:; font-caratteri ASCII da 32 (dicembre) il
db 0,0,0,0,0; char vuota
db 0,0,242,0,0;!
db 0,224,0,224,0; "
db 40,254,40,254,40; #
db 36,84,254,84,72; $
db 196,200,16,38,70;%
db 108,146,170,132,10; &
db 0,160,192,0,0 d
db 0,56,68,130,0; (
db 0,130,68,56,0
db 40,16,124,16,40; *
db 16,16,124,16,16;
db 0,5,6,0,0;,
db 16,16,16,16,16; --
DB 0,6,6,0,0;.
db 4,8,16,32,64; /
db 124.138.146.162.124; 0
db 0,66,254,2,0; 1
db 66,134,138,146,98; 2
db 132.130.162.226.156; 3
db 24,40,72,254,8; 4
db 228.162.162.162.156; 5
db 60,82,146,146,12; 6
db 128.142.144.160.192; 7
db 108.146.146.146.108; 8
db 96.146.146.148.120; 9
db 0,54,54,0,0;:
db 0,53,54,0,0;;
db 16,40,68,130,0; <
db 40,40,40,40,40; =
db 0,130,68,40,16;>
db 64,128,138,144,96;?
db 76.146.158.130.124; @
db 126.144.144.144.126; A
db 254.146.146.146.108; B
db 124,130,130,130,68; C
db 254.130.130.130.124; D
db 254.146.146.146.146; E
db 254.144.144.144.144; F
db 124,130,146,146,92; G
db 254,16,16,16,254; H
db 0,130,254,130,0; I
db 132.130.130.130.252; J
db 254,16,40,68,130; K
db 254,2,2,2,2; L
db 254,64,32,64,254; M
db 254,64,32,16,254; N
db 124.130.130.130.124; O
db 254,144,144,144,96; P
db 124.130.134.130.125; Q
db 254,144,152,148,98; R
db 100,146,146,146,76; S
db 128.128.254.128.128; T
db 252,2,2,2,252; U
db 248,4,2,4,248; V
db 254,4,8,4,254; W
db 198,40,16,40,198; X
db 192,32,30,32,192; Y
db 134.138.146.162.194; Z
db 0,254,130,130,0; [
db 64,32,16,8,4; \
db 0,130,130,254,0;]
db 32,64,128,64,32; ^
db 2,2,2,2,2; _
db 0,128,64,32,0 »;
db 4,42,42,42,30; uno
db 254,18,34,34,28; b
db 28,34,34,34,34; c
db 28,34,34,18,254; d
db 28,42,42,42,24; e
db 16,126,144,128,64; f
db 24,37,37,37,62; g
db 254,16,32,32,30; h
db 0,34,190,2,0; i
db 4,2,34,188,0; j
db 254,8,20,34,0; k
db 0,130,254,2,0; l
db 62,32,24,32,30; m
db 62,16,32,32,30; n
db 28,34,34,34,28; O
db 63,36,36,36,24; p
db 24,36,36,36,63; q
db 62,16,32,32,16; r
db 18,42,42,42,4; s
db 32,254,34,2,4; t
db 60,2,2,4,62; u
db 56,4,2,4,56; v
db 60,2,12,2,60; w
db 34,20,8,20,34; x
db 48,10,10,10,60; y
db 34,38,42,50,34; z
db 0,16,108,130,0; (
db 0,0,254,0,0; |
db 0,130,108,16,0
db 16,32,16,8,16; ~
db 0,0,0,0,0; (ASCII 127 dicembre)
db 4,170,42,170,30; (non standardizzati)
db 28,162,34,162,28;
db 28,66,2,66,28;
db 62,208,80,208,62;
db 60,194,66,194,60;
db 60,130,2,130,60;
db 127.144.146.146.108; á;************************************************* *******
; Testo da visualizzare sul carattere LED in movimento.
; Il numero di caratteri deve essere definito come un 2-Byte-valore
; Highbyte / Lowbyte in "z_anz_rom".
z_anz_rom:
db 0h, 70h; numero di caratteri memorizzati nella ROM
; (16-bit come Highbyte / Lowbyte)
Zeichen:
World db 'di Elettronica - Rund um Informationen Elektronik:'
http://www.online.de/home/woe db ''
email db ': guai (at) topmail.de'
db ''; 3 caratteri vuoti alla fine, come la separazione
; Complessivamente 112 chars = 070h
END
**************************
;************************************************* *********
; * LEDFONT.ASM V2.1 *
; * LED che si spostano font *
; * MAX7219 Diversi sono cascata, costituiti da moduli *
; * 8x8 LED; tipo di carattere 5x8 *
; * Programma assembler per 8051-controller compatibile, *
; * AT89C51 ad esempio, la frequenza al quarzo 11,0592 MHz *
; * Il seguente programma di controlli fino a 11 moduli.*
;************************************************* *********
; * Mondo dell'elettronica *
; Http://www.woe.de.vu * *
; * Guai (at) topmail.de *
; * (C) GUAI, 1999 *
;************************************************* *********
DIN equ p1.0; DIN a Port 1,0
CLCK equ P1.1, CLK a Port 1.1
LOAD equ P1.2; carico, a Port 1,2
SCL equ p3.5; SCL per I2C-Bus
SDA equ p3.7; SDA per I2C-Bus
equ jumper_ser P1.6; Jumper per il download di serie
jumper_eep equ p3.2; Jumper per EEPROM-mode
jumper_baud equ p3.3; Jumper per baudrate di serie
ser_wait equ P3.4; stretta di mano di serie
LED equ P1.7; LED per il download di serie
MODULO equ 11; numero di 8x8 moduli LED (max. 11); Bandiere (in zona bit, ADR. 20h RAM interna)
i2c_ack_in equ 0
i2c_ack_out equ 1
z_abfrage equ 2
equ eep_mode 3
z_anz_h equ 21h; numero di caratteri
z_anz_l equ 22h; (16 bit)
zeichen_h equ 23h; counter carattere
zeichen_l equ 24h; (16 bit)
sp_off_l equ 25h; Offset per font di caratteri
sp_off_h equ 26h; (16 bit)Anfang:
Seth i2c_ack_out
Seth i2c_ack_in
call clear_disp
ledout_ini chiamata; inizializzazione
jb jumper_ser, Lauf
JMP ser_load
Lauf:
jb jumper_eep, rom_mode
Seth eep_mode
Telefonare read_z_anz; leggere il numero di caratteri di EEPROM
JMP anz_ende
rom_mode:
clr eep_mode
read_anz_rom chiamata; leggere il numero di caratteri di ROM
anz_ende:
mov r0, # 40
clr uno
clr_loop:
mov @ r0, a; celle di memoria chiara 40 ... 127 (RAM interna)
inc r0
cjne r0, # 128, clr_looplauf_loop:
call ledout_ini
zeichen_h mov, # 0; contatore ad alta carattere
zeichen_l mov, # 0; carattere counter BASSA
clr z_abfrage
mov R5, # 0; r5: colonna counter
JNB eep_mode, rom_dat
call read_eeprom
JMP read_end
rom_dat:
call read_rom
read_end:
Spa:
JNB acc.7, z_ascii
call convert_char
JMP z_ok
z_ascii:
clr c
subb A, # 32
jnc z_ok
clr uno
z_ok:
mov b, # 5
mul ab
sp_off_l mov, a; Offset per la colonna
sp_off_h mov, b; (16 bit)
WDH:
mov r1, # 127
mov r0, # 126
shift_ram:
mov a, @ r0
MOV @ R1, una
Dicembre r1
Dicembre r0
cjne r1, # 40, shift_ram
cjne R5, # 5, sp_calc
mov 40, # 0; LED-colonna sul lato destro
mov R5, # 0
Seth z_abfrage
inc zeichen_l
mov a, # 0
cjne uno, zeichen_l, x1
inc zeichen_h
x1:
JNB eep_mode, rom_dat2
call read_eeprom
JMP read_end2
rom_dat2:
call read_rom
read_end2:
Spal:
JNB acc.7, z_ascii2
call convert_char
JMP z_ok2
z_ascii2:
clr c
subb A, # 32
jnc z_ok2
mov a, # 0
z_ok2:
mov b, # 5
mul ab
sp_off_l mov, un
sp_off_h mov, b
JMP l1
sp_calc:
mov DPTR, # Spalten
mov a, sp_off_l
aggiungere una, DPL
jnc Y1
inc DPH
Y1:
mov DPL, un
mov a, sp_off_h
ADD A, DPH
mov DPH, un
MOV A, R5
movc A, @ A DPTR
mov 40, a; LED-colonna sul lato destro
inc r5
L1:
Matrix:
mov r2, # 8, 8 colonne
mov R6, # 47; sinistra LED-colonna del 8x8-modulo a destra
led_10:
mov b, # ((MODULO-1) * 8)
dispout:
MOV A, R6
Aggiungere a, b
mov r1, un
mov a, @ R1
mov r3, un
call ledout
mov a, b
clr c
subb A, # 8
b mov, un
jnc dispout
Seth LOAD; tutti memorizzare i propri dati MAX7219
clr LOAD
Dicembre r6
djnz r2, led_10; tutte le 8 colonne di un modulo
Zeit chiamata; ritardo
JNB z_abfrage, wdh_jump
clr z_abfrage
mov a, z_anz_l
cjne uno, zeichen_l, wdh_jump
mov a, z_anz_h
cjne uno, zeichen_h, wdh_jump
JMP lauf_loop
wdh_jump:
JMP WDH
ser_load:
JNB jumper_baud, B1200; ponticello di esempio per baudrate
b9600:
MOV TH1, # 0fdh; 9600 Baud
mov TL1, # 0fdh
JMP ser
B1200:
MOV TH1, # 0e8h; 1200 Baud
mov TL1, # 0e8h
ser:
mov TMOD, # 20h
scon mov, # 50h
Seth tr1
mov a, sbuf
CLR RI
clr LED; LED Scarica il
z_anz_h mov, # 0
z_anz_l mov, # 0
mov R7, # 2; dati in EEPROM inizia con indirizzo 2
mov R6, # 0a0h
clr ser_wait
wait_data:
jb p3.0, no_startbit
Seth ser_wait
no_startbit:
RI JB, ri_ok
JMP wait_data
ser_wdh:
clr ser_wait
MOV R4, # 3
w3:mov r3,#0 W2:
mov R2, # 0
W1:
jb p3.0, no_start
Seth ser_wait
no_start:
RI JB, ri_ok
djnz r2, w1
djnz R3, w2
djnz R4, w3
JMP ser_end
ri_ok:
mov a, sbuf
CLR RI
Seth ser_wait
Seth LED; LED off
b mov, un
call i2c_start
MOV A, R6, I2C indirizzo di EEPROM
call i2c_send
mov A, R7, indirizzo in EEPROM
call i2c_send
mov a, b, i dati per EEPROM
call i2c_send
call i2c_stop
call wait_eeprom
inc R7
cjne R7, # 0, s1
inc r6
inc r6
S1:
inc z_anz_l
mov a, z_anz_l
cjne a, # 0, s2
inc z_anz_h
S2:
mov R5, z_anz_h
cjne R5, # 7h, ser_wdh
cjne a, # 0FEh, ser_wdhser_end:
call i2c_start
mov a, # 0a0h
call i2c_send
mov a, # 0
call i2c_send
mov a, z_anz_h
call i2c_send
call i2c_stop
call wait_eeprom
call i2c_start
mov a, # 0a0h
call i2c_send
mov a, # 1
call i2c_send
mov a, z_anz_l
call i2c_send
call i2c_stop
call wait_eeprom
Seth ser_wait
blink:
cpl LED
mov R7, # 2
BL1:
mov R6, # 0
BL2:
mov R5, # 0
BL3:
djnz r5, BL3
djnz r6, BL2
djnz R7, BL1
JMP blinkread_eeprom:; leggere il carattere effettivo di EEPROM
push 6
push 7
mov R6, zeichen_h
mov R7, zeichen_l
mov A, R7
ADD A, # 2
jnc no_inc
inc r6
no_inc:
mov R7, un
MOV A, R6
RL A
ORL A, # 0a0h
mov R6, uno
call i2c_start
call i2c_send
mov A, R7
call i2c_send
call i2c_start
MOV A, R6
inc uno
call i2c_send
Seth i2c_ack_out; no ACK
call i2c_read
call i2c_stop
Pop 7
Pop 6
retread_rom:; leggere il carattere effettivo di ROM
mov DPTR, Zeichen #
mov a, DPL
aggiungere una, zeichen_l
jnc no_inc_dph
inc DPH
no_inc_dph:
mov DPL, un
mov a, DPH
aggiungere una, zeichen_h
mov DPH, un
clr uno
movc A, @ A DPTR
retread_z_anz:; leggere il numero di caratteri di EEPROM
call i2c_start
mov a, # 0a0h
call i2c_send
mov a, # 0
call i2c_send
call i2c_start
mov a, # 0a1h
call i2c_send
clr i2c_ack_out
call i2c_read
z_anz_h mov, un
Seth i2c_ack_out; no ACK
call i2c_read
z_anz_l mov, un
call i2c_stop
retread_anz_rom:; leggere il numero di caratteri di ROM
mov DPTR, z_anz_rom #
clr uno
movc A, @ A DPTR
z_anz_h mov, un
mov a, # 1
movc A, @ A DPTR
z_anz_l mov, un
retconvert_char:
cjne a, # 132, CO1
mov a, # 96;
ret
CO1:
cjne a, # 148, CO2
mov a, # 97;
ret
CO2:
cjne a, # 129, CO3
mov a, # 98;
ret
CO3:
cjne a, # 142, CO4
mov a, # 99;
ret
CO4:
cjne a, # 153, Co5
mov a, # 100;
ret
Co5:
cjne a, # 154, CO6
mov a, # 101;
ret
CO6:
cjne a, # 225, CO7
mov a, # 102; á
ret
CO7:
uno CLR; carattere altrimenti vuoto
ret;************************************************* *******
; Inizializzazione: (usa R1, R2, R3, Accu)
ledout_ini:
clr DIN
clr CLCK
clr LOAD
; Modalità Decodifica a 0-7 cifre = normale:
mov r2, # 09h; Indirizzo di Decode Mode Register
mov r3, # 0h; non decodificare
mov r1, # MODULO
decodifica:
call ledout
djnz r1, decodificare, tutti i moduli
Seth LOAD
clr LOAD
; impostare l'intensità di massima:
mov r2, # 0Ah; Indirizzo di intensità Registrati
mov r3, # 0Fh; max.Intensità
mov r1, # MODULO
intens:
call ledout
djnz r1, intens; tutti i moduli
Seth LOAD
clr LOAD
; impostare il limite di scansione su 8 schermi attivi:
mov r2, # 0Bh; Indirizzo di Scan Limit Register
mov r3, # 07h; 8 cifre
mov r1, # MODULO
scanlim:
call ledout
djnz r1, scanlim; tutti i moduli
Seth LOAD
clr LOAD
; Display modalità di prova = off:
mov r2, # 0Fh; Indirizzo di Display Test Registrati
mov r3, # 0h; il normale funzionamento
mov r1, # MODULO
distest:
call ledout
djnz r1, distest; tutti i moduli
Seth LOAD
clr LOAD
; disattivare Individuazione = accendere il display:
mov r2, # 0Ch; Indirizzo di arresto Registrati
mov r3, # 01h; il normale funzionamento
mov r1, # MODULO
shutd:
call ledout
djnz r1, shutd; tutti i moduli
Seth LOAD
clr LOAD
ret;*************************************************
; Chiara visualizzazione completa
clear_disp:
push 1
push 2
push 3
clr DIN
clr CLCK
clr LOAD
mov r2, # 8, 8 cifre
led_ini_10:
mov r3, # 0; dati = 0
mov r1, # MODULO
Modul:
call ledout
djnz r1, modul; tutti i moduli
Seth LOAD
clr LOAD
djnz r2, led_ini_10
pop 3
pop 2
pop 1
ret;*************************************************
; Inviare dati a MAX7219 (senza impulso LOAD!)
; Parametri:
; R2 = byte Indirizzo per MAX7219
; R3 = byte di dati per MAX7219
ledout: push acc
push 0
push 1
mov ACC, r2
mov r1, # 2; 2x 8 bit
lo_5: mov r0, # 8; sempre 8 bit
lo_10: jb acc.7, lo_20
DIN CLR; inviare 0
JMP lo_30
lo_20: DIN Seth; inviare 1
lo_30: CLCK Seth; generare clock
clr CLCK
RL A; prossimo bit
djnz r0, lo_10; (8 volte)
MOV A, R3; byte di dati in accu
djnz r1, lo_5, ancora una volta, ma ora con i dati byte
pop 1
Pop 0
pop acc
ret
;************************************************* *******
; Ritardo
Zeit:
push acc
push b
mov b, # 0EH; valore di partenza del registro B può essere
Z1: MOV A, # 0FFh; aumentato per più lento di velocità
Z2: NOP
NOP
NOP
NOP
djnz ACC, z2
djnz b, Z1
pop b
pop acc
retwait_eeprom:
push 5
push 6
mov R6, # 50
w_eep1:
mov R5, # 100
w_eep2:
djnz r5, w_eep2
djnz r6, w_eep1
Pop 6
pop 5
reti2c_start:; I2C condizione Start
Seth SDA
NOP
Seth scl
call i2c_wait
clr SDA; dati = 0 (Start)
NOP
clr scl; Clock = 0
reti2c_stop:; I2C condizione di arresto
Seth scl; Clock = 1
NOP
Seth SDA; Data = 1 (Stop)
reti2c_send:; inviare 1 byte di dati (Accu) via I2C
push 3
mov r3, # 8
i2c_sloop:
RLC uno
mov sda, c
NOP
Seth scl
call i2c_wait
clr scl
djnz R3, i2c_sloop
NOP
Seth SDA
NOP
Seth scl
call i2c_wait
c mov, SDA, leggere Riconoscere-bit
i2c_ack_in mov, c
clr scl
NOP
clr SDA
pop 3
reti2c_read:; ricevere 1 byte di dati tramite I2C (Accu)
push 3
mov r3, # 8
clr uno
Seth SDA
i2c_rloop:
call i2c_wait
Seth scl
NOP
c mov, sda
RLC uno
NOP
clr scl
djnz R3, i2c_rloop
c mov, i2c_ack_out, inviare Riconoscere-bit
mov sda, c
NOP
Seth scl
call i2c_wait
clr scl
NOP
clr SDA
pop 3
reti2c_wait:; ritardo per I2C (CALL RET -> 4US a 12MHz)
ret
;************************************************* ********
; Font charcter (5x8)
Spalten:; font-caratteri ASCII da 32 (dicembre) il
db 0,0,0,0,0; char vuota
db 0,0,242,0,0;!
db 0,224,0,224,0; "
db 40,254,40,254,40; #
db 36,84,254,84,72; $
db 196,200,16,38,70;%
db 108,146,170,132,10; &
db 0,160,192,0,0 d
db 0,56,68,130,0; (
db 0,130,68,56,0
db 40,16,124,16,40; *
db 16,16,124,16,16;
db 0,5,6,0,0;,
db 16,16,16,16,16; --
DB 0,6,6,0,0;.
db 4,8,16,32,64; /
db 124.138.146.162.124; 0
db 0,66,254,2,0; 1
db 66,134,138,146,98; 2
db 132.130.162.226.156; 3
db 24,40,72,254,8; 4
db 228.162.162.162.156; 5
db 60,82,146,146,12; 6
db 128.142.144.160.192; 7
db 108.146.146.146.108; 8
db 96.146.146.148.120; 9
db 0,54,54,0,0;:
db 0,53,54,0,0;;
db 16,40,68,130,0; <
db 40,40,40,40,40; =
db 0,130,68,40,16;>
db 64,128,138,144,96;?
db 76.146.158.130.124; @
db 126.144.144.144.126; A
db 254.146.146.146.108; B
db 124,130,130,130,68; C
db 254.130.130.130.124; D
db 254.146.146.146.146; E
db 254.144.144.144.144; F
db 124,130,146,146,92; G
db 254,16,16,16,254; H
db 0,130,254,130,0; I
db 132.130.130.130.252; J
db 254,16,40,68,130; K
db 254,2,2,2,2; L
db 254,64,32,64,254; M
db 254,64,32,16,254; N
db 124.130.130.130.124; O
db 254,144,144,144,96; P
db 124.130.134.130.125; Q
db 254,144,152,148,98; R
db 100,146,146,146,76; S
db 128.128.254.128.128; T
db 252,2,2,2,252; U
db 248,4,2,4,248; V
db 254,4,8,4,254; W
db 198,40,16,40,198; X
db 192,32,30,32,192; Y
db 134.138.146.162.194; Z
db 0,254,130,130,0; [
db 64,32,16,8,4; \
db 0,130,130,254,0;]
db 32,64,128,64,32; ^
db 2,2,2,2,2; _
db 0,128,64,32,0 »;
db 4,42,42,42,30; uno
db 254,18,34,34,28; b
db 28,34,34,34,34; c
db 28,34,34,18,254; d
db 28,42,42,42,24; e
db 16,126,144,128,64; f
db 24,37,37,37,62; g
db 254,16,32,32,30; h
db 0,34,190,2,0; i
db 4,2,34,188,0; j
db 254,8,20,34,0; k
db 0,130,254,2,0; l
db 62,32,24,32,30; m
db 62,16,32,32,30; n
db 28,34,34,34,28; O
db 63,36,36,36,24; p
db 24,36,36,36,63; q
db 62,16,32,32,16; r
db 18,42,42,42,4; s
db 32,254,34,2,4; t
db 60,2,2,4,62; u
db 56,4,2,4,56; v
db 60,2,12,2,60; w
db 34,20,8,20,34; x
db 48,10,10,10,60; y
db 34,38,42,50,34; z
db 0,16,108,130,0; (
db 0,0,254,0,0; |
db 0,130,108,16,0
db 16,32,16,8,16; ~
db 0,0,0,0,0; (ASCII 127 dicembre)
db 4,170,42,170,30; (non standardizzati)
db 28,162,34,162,28;
db 28,66,2,66,28;
db 62,208,80,208,62;
db 60,194,66,194,60;
db 60,130,2,130,60;
db 127.144.146.146.108; á;************************************************* *******
; Testo da visualizzare sul carattere LED in movimento.
; Il numero di caratteri deve essere definito come un 2-Byte-valore
; Highbyte / Lowbyte in "z_anz_rom".
z_anz_rom:
db 0h, 70h; numero di caratteri memorizzati nella ROM
; (16-bit come Highbyte / Lowbyte)
Zeichen:
World db 'di Elettronica - Rund um Informationen Elektronik:'
http://www.online.de/home/woe db ''
email db ': guai (at) topmail.de'
db ''; 3 caratteri vuoti alla fine, come la separazione
; Complessivamente 112 chars = 070h
END