Bien, intentando e intentando, no consigo desplazar el texto de derecha a izquierda, expongo lo que tengo porque no encuentro el fallo :S,
1º Utilizo dos matrizes que contienen la letra anterior y la siguiente (la letra que desplazaremos).
2º Lo que hago para desplazar la letra es: cargar en la matriz a mostrar la letra anterior y luego modificar los bits de la letra anterior introduciendo poco a poco los bits de la letra siguiente.
3º Una vez tengo modificados los bits de la matriz a mostrar voy cargando los datos en el registro de desplazamiento y activando las respectivas salidas del puerto b.
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#USE DELAY(clock=4MHZ)
#define data PIN_C0
#define clock PIN_C1
#define strobe PIN_C2
#define show PIN_C3
#byte port_b=0X06
void escribir(int *letra,int time);
void cargar_dato(int dato);
void muestra_fila(int fila);
void desplazar_(int *letra,int velocidad);
void desplazar_izq (int *m_actual,int *m_siguiente,int refresh); //variables globales
int *m_actual,*m_anterior,desplazamiento,matriz_mostrar[8];
int *p,*p2,col,fila;
int M[8]={ 0b00111100, //letras a utilizar
0b00011000,
0b00000000,
0b00100100,
0b00111100,
0b00111100,
0b00111100,
0b00111100};
int J[8]={ 0b00000000,
0b00000000,
0b11100111,
0b11100111,
0b11100111,
0b11100111,
0b00000111,
0b00001111};
int I[8]={ 0b11000011,
0b11100111,
0b11100111,
0b11100111,
0b11100111,
0b11100111,
0b11100111,
0b11000011};
int Null[8]={0xFF,
0xFF,
0xFF,
0xFF,
0xFF,
0xFF,
0xFF,
0xFF};
void main(){
SET_TRIS_B(0x00);
SET_TRIS_C(0X00);
output_low(show);
output_low(data);
output_low(strobe);
output_low(clock);
port_b=0x00;
while (true){
p=Null;
p2=J;
desplazar_izq(p,p2,10);
p=p2;
p2=I;
desplazar_izq(p,p2,10);
p=p2;
p2=M;
desplazar_izq(p,p2,10);
}
}
void escribir(int *letra,int time){
while (time>0){
for (fila=0;fila<8;fila++){
cargar_dato(letra[fila]);
muestra_fila(fila);
}
time--;
}
}
void muestra_fila(int fila){
output_high(show);
bit_set(port_b,fila);
delay_us(400);
bit_clear(port_b,fila);
}
void cargar_dato(int dato){
output_high(strobe);
for(col=0;col<8;col++){
output_bit(data,(dato & 0x1));
dato=dato>>1;
output_low(clock);
output_high(clock);
}
}
void desplazar_izq (int *m_actual,int *m_siguiente,int refresh){
escribir(m_actual,20);
for (fila=0;fila<8;fila++){ //escribo en la matriz lo que necesito escribir
matriz_mostrar[fila]=m_actual[fila]; //asi solo modifico la matriz a desplazar.
}
desplazamiento=8;
while (desplazamiento!=0){
for (fila=0;fila<8;fila++){ //modifico la matriz a mostrar
matriz_mostrar[fila]=(matriz_mostrar[fila]<<1)+(bit_test(m_siguiente,desplazamiento)); //lo que hago aqui es desplazar la matriza mostrar ej. 0b11111111<<1.
} // quiero que haga 0b11111110; luego si le sumo el bit que quiero mostrar.
p=matriz_mostrar; //0b11111110 +1 = 0b11111111; 0b11111110+0= 0b11111110.
escribir(p,refresh);
desplazamiento--;
}
}
Aquí está el código, tengo varias funciones implementadas, la funcion cargar dato, escribir y mostrar fila funcionan bien, la funcion desplazar_izq me hace cosas raras, desplaza cosas pero no desplaza las letras que yo quiero que desplaze, a ver si podeis ayudarme a solucionar el pequeño problema que tengo.
Os adjunto el proyecto de proteus para que podais ver lo que sucede.