#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

#define DATOS   0x378
#define ESTADO  0x379
#define CONTROL 0x37A
#define ECR 0x378+0x402
#define ModoBidireccional outp(0x378+0x402,128);
#define Lectura outp(CONTROL,inp(CONTROL) | 32);
#define Escritura outp(CONTROL,inp(CONTROL) & 223);
#define Retardo100us for(retardo = 0; retardo < 5950; retardo++);
#define Retardo10us for(retardo = 0; retardo < 400; retardo++);
#define Retardo5us for(retardo = 0; retardo < 200; retardo++);
//----------------------------------------------------------------------------
// RUTINA PRINCIPAL DEL PROGRAMA.
//----------------------------------------------------------------------------
unsigned char d[30], N[10];
unsigned char a1=0,b1=0,c1=0,d1=0,e1=0,f1=0,g1=0,p1=0,E=0,M=0,S=0;
unsigned char a2=0,b2=0,c2=0,d2=0,e2=0,f2=0,g2=0,p2=0;
unsigned char a3=0,b3=0,c3=0,d3=0,e3=0,f3=0,g3=0,p3=0;
unsigned char a4=0,b4=0,c4=0,d4=0,e4=0,f4=0,g4=0,p4=0;
unsigned char a5=0,b5=0,c5=0,d5=0,e5=0,f5=0,g5=0,p5=0;
unsigned char a6=0,b6=0,c6=0,d6=0,e6=0,f6=0,g6=0,p6=0;
unsigned char a7=0,b7=0,c7=0,d7=0,e7=0,f7=0,g7=0,p7=0;
unsigned char a8=0,b8=0,c8=0,d8=0,e8=0,f8=0,g8=0,p8=0;
unsigned char buf1,buf2,buf3,buf4,buf5,buf6,buf7,buf8,tecla;
unsigned char s1,s2,s3,s4,s5,s6,s7,s8;
int t = 2;

void Control(unsigned char dato){
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x04); //Todos a 1.
   Escritura  outp(DATOS,dato);
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x0C); //WR a 0.
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x04); //Todos a 1.
   Lectura
}

void Pa(unsigned char dato){
   Escritura outp(DATOS,dato);
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x0F);  //0100
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x07);  //1100
   Lectura
}

unsigned char Pa(void){
unsigned char dato;
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x03);  //1000
   Lectura
   dato = inp(DATOS);
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x07);  //1100
return(dato);
}

void Pb(unsigned char dato){
   Escritura outp(DATOS,dato);
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x0E);  //0101
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x06);  //1101
   Lectura
}
unsigned char Pb(void){
unsigned char dato;
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x02);  //1001
   Lectura
   dato = inp(DATOS);
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x06);  //1101
return(dato);
}

void Pc(unsigned char dato){
   Escritura outp(DATOS,dato);
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x0D);  //0110
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x05);  //1110
   Lectura
}
unsigned char Pc(void){
unsigned char dato;
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x01);  //1001
   dato = inp(DATOS);
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x05);  //1101
return(dato);
}


int B(char *cad){
int dato,d;
char letra[20];
    dato = 0;
    for(int n = strlen(cad)-1; n >= 0; n--){
       d = (int)pow(2,strlen(cad)-n-1);
       letra[0] = cad[n]; letra[1] = '\0';
       d = d * atoi(letra);
       dato = dato + d;
    }
return(dato);
}

int n;

void CargaRegistro(){
int n;
  for(n = 0; n < 30; n++){
	d[n] = d[n] & 1;
	if (d[n] == 0){
	  Pa(0); Pa(2);
	}
	if (d[n] == 1){
	  Pa(1); Pa(3);
	}
  }
  Pb(0); Pb(1); delay(1); Pb(0);   //Carga los latches.
}

void MuestraFrame(){
 d[0]=0; d[1]=1; d[2]=0; d[3]=1; d[4]=0; d[5]=0;
  d[6]=b1;  d[7]=g1;  d[8]=e1;
  d[9]=b2; d[10]=g2; d[11]=e2;
 d[12]=b3; d[13]=g3; d[14]=e3;
 d[15]=b4; d[16]=g4; d[17]=e4;
 d[18]=b5; d[19]=g5; d[20]=e5;
 d[21]=b6; d[22]=g6; d[23]=e6;
 d[24]=b7; d[25]=g7; d[26]=e7;
 d[27]=b8; d[28]=g8; d[29]=e8;
 CargaRegistro(); delay(t);

 d[0]=0; d[1]=1; d[2]=0; d[3]=0; d[4]=0; d[5]=1;
  d[6]=p1;  d[7]=c1;  d[8]=d1;
  d[9]=p2; d[10]=c2; d[11]=d2;
 d[12]=p3; d[13]=c3; d[14]=d3;
 d[15]=p4; d[16]=c4; d[17]=d4;
 d[18]=p5; d[19]=c5; d[20]=d5;
 d[21]=p6; d[22]=c6; d[23]=d6;
 d[24]=p7; d[25]=c7; d[26]=d7;
 d[27]=p8; d[28]=c8; d[29]=d8;
 CargaRegistro(); delay(t);

 d[0]=0; d[1]=0; d[2]=0; d[3]=1; d[4]=0; d[5]=1;
  d[6]=E;  d[7]=a1;  d[8]=f1;
  d[9]=M; d[10]=a2; d[11]=f2;
 d[12]=S; d[13]=a3; d[14]=f3;
 d[15]=0; d[16]=a4; d[17]=f4;
 d[18]=0; d[19]=a5; d[20]=f5;
 d[21]=0; d[22]=a6; d[23]=f6;
 d[24]=0; d[25]=a7; d[26]=f7;
 d[27]=0; d[28]=a8; d[29]=f8;
 CargaRegistro(); delay(t);

 //////////////////Parte negativa
 d[0]=0; d[1]=1; d[2]=0; d[3]=1; d[4]=1; d[5]=1;
  d[6]=b1^1;  d[7]=g1^1;  d[8]=e1^1;
  d[9]=b2^1; d[10]=g2^1; d[11]=e2^1;
 d[12]=b3^1; d[13]=g3^1; d[14]=e3^1;
 d[15]=b4^1; d[16]=g4^1; d[17]=e4^1;
 d[18]=b5^1; d[19]=g5^1; d[20]=e5^1;
 d[21]=b6^1; d[22]=g6^1; d[23]=e6^1;
 d[24]=b7^1; d[25]=g7^1; d[26]=e7^1;
 d[27]=b8^1; d[28]=g8^1; d[29]=e8^1;
 CargaRegistro(); delay(t);

 d[0]=0; d[1]=1; d[2]=1; d[3]=1; d[4]=0; d[5]=1;
  d[6]=p1^1;  d[7]=c1^1;  d[8]=d1^1;
  d[9]=p2^1; d[10]=c2^1; d[11]=d2^1;
 d[12]=p3^1; d[13]=c3^1; d[14]=d3^1;
 d[15]=p4^1; d[16]=c4^1; d[17]=d4^1;
 d[18]=p5^1; d[19]=c5^1; d[20]=d5^1;
 d[21]=p6^1; d[22]=c6^1; d[23]=d6^1;
 d[24]=p7^1; d[25]=c7^1; d[26]=d7^1;
 d[27]=p8^1; d[28]=c8^1; d[29]=d8^1;
 CargaRegistro(); delay(t);

 d[0]=1; d[1]=1; d[2]=0; d[3]=1; d[4]=0; d[5]=1;
  d[6]=E^1;  d[7]=a1^1;  d[8]=f1^1;
  d[9]=M^1; d[10]=a2^1; d[11]=f2^1;
 d[12]=S^1;   d[13]=a3^1; d[14]=f3^1;
 d[15]=1;   d[16]=a4^1; d[17]=f4^1;
 d[18]=1;   d[19]=a5^1; d[20]=f5^1;
 d[21]=1;   d[22]=a6^1; d[23]=f6^1;
 d[24]=1;   d[25]=a7^1; d[26]=f7^1;
 d[27]=1;   d[28]=a8^1; d[29]=f8^1;
 CargaRegistro(); delay(t);
}

unsigned char letra(unsigned char c){
if (c=='0') return(63);
if (c=='1') return(6);
if (c=='2') return(91);
if (c=='3') return(79);
if (c=='4') return(102);
if (c=='5') return(109);
if (c=='6') return(125);
if (c=='7') return(39);
if (c=='8') return(127);
if (c=='9') return(111);
if (c=='a') return(119);
if (c=='b') return(124);
if (c=='c') return(88);
if (c=='d') return(94);
if (c=='e') return(121);
if (c=='f') return(113);
if (c=='g') return(61);
if (c=='h') return(116);
if (c=='H') return(118);
if (c=='i') return(24);
if (c=='j') return(30);
if (c=='k') return(112);
if (c=='l') return(56);
if (c=='m') return(55);
if (c=='n') return(84);
if (c=='¤') return(85);
if (c=='o') return(92);
if (c=='p') return(115);
if (c=='q') return(103);
if (c=='r') return(80);
if (c=='s') return(109);
if (c=='t') return(120);
if (c=='u') return(28);
if (c=='v') return(62);
if (c=='w') return(126);
if (c=='x') return(100);
if (c=='y') return(110);
if (c=='z') return(82);
if (c=='-') return(64);
if (c=='=') return(72);
if (c=='?') return(83);
if (c=='¨') return(90);

return(0);
}


//////////////////////////////////////////////////////////////////////////////
main(){
clrscr();
ModoBidireccional Lectura
Control(128); Pa(0); Pb(0);
for(n=0; n<8; n++) N[n]=0;
M=0;

//N[8] = 30; N[7]=92; N[6]=109; N[5] = 121;
//N[4] = 30; N[3]=92; N[2]=109; N[1] = 121;
int i = 8;

do{
buf1 = N[1]; buf2 = N[2]; buf3 = N[3]; buf4 = N[4];
buf5 = N[5]; buf6 = N[6]; buf7 = N[7]; buf8 = N[8];
for(n=0; n < 8; n++){
 s1 = N[1] & 1; s2 = N[2] & 1; s3 = N[3] & 1; s4 = N[4] & 1;
 s5 = N[5] & 1; s6 = N[6] & 1; s7 = N[7] & 1; s8 = N[8] & 1;
 if (n == 0){ a1=s1; a2=s2; a3=s3; a4=s4; a5=s5; a6=s6; a7=s7; a8=s8;}
 if (n == 1){ b1=s1; b2=s2; b3=s3; b4=s4; b5=s5; b6=s6; b7=s7; b8=s8;}
 if (n == 2){ c1=s1; c2=s2; c3=s3; c4=s4; c5=s5; c6=s6; c7=s7; c8=s8;}
 if (n == 3){ d1=s1; d2=s2; d3=s3; d4=s4; d5=s5; d6=s6; d7=s7; d8=s8;}
 if (n == 4){ e1=s1; e2=s2; e3=s3; e4=s4; e5=s5; e6=s6; e7=s7; e8=s8;}
 if (n == 5){ f1=s1; f2=s2; f3=s3; f4=s4; f5=s5; f6=s6; f7=s7; f8=s8;}
 if (n == 6){ g1=s1; g2=s2; g3=s3; g4=s4; g5=s5; g6=s6; g7=s7; g8=s8;}
 if (n == 7){ p1=s1; p2=s2; p3=s3; p4=s4; p5=s5; p6=s6; p7=s7; p8=s8;}
 N[1] = N[1] >> 1; N[2] = N[2] >> 1; N[3] = N[3] >> 1; N[4] = N[4] >> 1;
 N[5] = N[5] >> 1; N[6] = N[6] >> 1; N[7] = N[7] >> 1; N[8] = N[8] >> 1;
}
N[1] = buf1; N[2] = buf2; N[3] = buf3; N[4] = buf4;
N[5] = buf5; N[6] = buf6; N[7] = buf7; N[8] = buf8;

//a8=0; b8=0; c8=0; d8=0; e8=0; f8=0; g8=1; p8=0;
//g3=0; g4=0; g5=0; g6=0; g7=0; g8=0;
//f3=1; f4=1; f5=1; f6=1; f7=1; f8=1;
//S=0;


do{
  MuestraFrame();
}while(!kbhit());
int temp;
   tecla = getch();
   if (tecla == 27 ) break;
   if (tecla == 13) {
   }
   if (tecla == 8 && i < 8){
     i++; tecla = 32;  N[i] = 8; goto salto;
   }
   if (i==0){
     for(n = 8; n > 1; n--){
	N[n] = N[n-1];
     }
     i = 1;
   }

   N[i] = letra(tecla); i--;
salto:
   gotoxy(12,12); printf("%d ",i);

}while(1);

}
//----------------------------------------------------------------------------

