|
|||||||
|
|
|
![]() |
|
|
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: 01:32.



















