|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jun 2012
Messaggi: 3
|
Software di gestione scheda calcolatrice Z80
Salve, ho realizzato una calcolatrice basata sullo Z80 di cui riporto il link qui a fianco ---> http://creative75.altervista.org/creative/?p=86 . Questo è il mio blog che spiega come ho realizzato tale
scheda. Il mio problema ora consiste nella realizzazione del software in C. Ora il problema non è tanto il trasferire il codice eseguibile per Z80 nella EEPROM, bensi quello di riuscire a far visualizzare come test di prova la cifra "1252" sul display. Dopo aver scritto, compilato e caricato il codice nella EEPROM si sente il relè dell' accensione che si accende ad intermittenza di 1sec. per poi visualizzare segmenti a caso ad ogni intermittenza. Non capisco il perchè di questo comportamento. Riporto di seguito il codice che dovrebbe visualizzare "1252" sul display: firmware_calc.c: Codice:
//====================Firmware calcolatrice============================ //21-04-2014 by Roncolato Fabio =================================== #include "display.h" void (*function)() = (void (*)())0xc0; int main() { display_7seg(12.55); while(1){}; return 0; } display.h: Codice:
//file header dei drivers void inserisci_cifra(int posizione, char x); char converti(char cifra); void visualizza(int posizione, char cifra); void display_7seg(float numero); Codice:
//drivers per gestire il display //indirizzi dei registri dei display //0x4000 display1 //0x4001 display2 //0x4002 display3 //0x4003 display4 //0x4004 display5 //0x4005 display6 //0x4006 display7 //0x4007 display8 #include "display.h" #include <stdio.h> #include <stdlib.h> char cifre[8]; int num, n=0; //funzione di visualizzazione cifre void visualizza(int posizione, char cifra) { char numero=converti(cifra); inserisci_cifra(posizione, numero); } //funzione di conversione da BCD a 7 segmenti char converti(char cifra) { if(cifra==0x01) cifra=0x9f; if(cifra==0x02) cifra=0x25; if(cifra==0x03) cifra=0x0d; if(cifra==0x04) cifra=0x99; if(cifra==0x05) cifra=0x49; if(cifra==0x06) cifra=0x41; if(cifra==0x07) cifra=0x1f; if(cifra==0x08) cifra=0x01; if(cifra==0x09) cifra=0x09; if(cifra==0x00) cifra=0x03; if(cifra==0xff) cifra=0xff; //spegni tutti i segmenti return cifra; } //funzione di inserimento cifra 7 seg. nella cella display indicata void inserisci_cifra(int posizione, char x) { __asm push ix add ix,sp ld h, 4(ix) ld l, 5(ix) push af ld a, 6(ix) ld (hl), a pop af pop ix ret __endasm; } //funzione di visuallizzazione cifre di un float nel display void display_7seg(float numero) { //int num, n=0; sprintf(cifre, "%f", numero); for(num=0x4000;num<0x4007;num++) { visualizza(num, cifre[n]); n++; } } Codice:
@echo -------------- compilermessages ----------------- @sdasz80 -o crt0calc.o crt0calc.s @sdcc -mz80 -c firmware_calc.c @sdcc -mz80 -c display.c @rem sdcc in linker mode, only tell .rel files in this line, no .c, no .asm @sdcc -mz80 --no-std-crt0 --reserve-regs-iy --code-loc 0x00F3 --data-loc 0xe000 -o linkresult.ihx crt0calc.rel firmware_calc.rel display.rel @echo ------------------------------------------------- @sdldz80 -nf "link.lnk" @hex2bin 4000 linkresult.ihx @copy linkresult.bin calc.ROM Quest' ultimo file è lo script di compilazione che serve ad SDCC (il compilatore che ho usato) per compilare il tutto. Nessuno mi può dare una mano a capire perchè mi escono segmenti del display a caso invecie di uscire "1252" ? Grazie in anticipo ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Nella funzione display n deve valere 0 all'inizio
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:14.