📄 pov.c
字号:
/*
Proyecto Final
"Persistence of Vision"
Diseno de Sistemas de Computadora
Presentado por:
Raymundo Yamammoto
2004-0081
Desiree Gutierrez
2004-0878
*/
//Incluyendo librerias necesarias
#include <mega16.h>
#include <stdio.h>
//Declarando variables
unsigned int key=0;
unsigned int time1=0;
unsigned int time2=0;
unsigned char timeh=100;
unsigned char timel=100;
unsigned char tamano=0;
unsigned char *letrero="k lo k wilson$";
unsigned char *puntero1=0;
unsigned char *puntero2=0;
unsigned char i=0;
unsigned char final[32];
unsigned char e=0;
unsigned char a=0;
unsigned char o=0;
unsigned char salida[162];
unsigned char *abc1="abcdefghijklmnopqrstuvwxyz ";
unsigned char *abc2="ABCDEFGHIJKLMNOPQRSTUVWXYZ ";
unsigned char bits[162]= {
0b01111000,//A0
0b00100100,
0b00100010,
0b00100100,
0b01111000,
0b00000000,
//--------
0b01111110,//B1
0b01001010,
0b01001010,
0b01001010,
0b00110100,
0b00000000,
//--------
0b00111100,//C2
0b01000010,
0b01000010,
0b01000010,
0b01000010,
0b00000000,
//--------
0b01111110,//D3
0b01000010,
0b01000010,
0b01000010,
0b00111100,
0b00000000,
//--------
0b01111110,//E4
0b01001010,
0b01001010,
0b01001010,
0b01000010,
0b00000000,
//--------
0b01111110,//F5
0b00001010,
0b00001010,
0b00001010,
0b00000010,
0b00000000,
//--------
0b01111110,//G6
0b01000010,
0b01010010,
0b01010010,
0b01110010,
0b00000000,
//--------
0b01111110,//H7
0b00010000,
0b00010000,
0b00010000,
0b01111110,
0b00000000,
//--------
0b00000000,//I8
0b00000000,
0b01111110,
0b00000000,
0b00000000,
0b00000000,
//--------
0b00100000,//J9
0b01000000,
0b01000000,
0b01000000,
0b00111110,
0b00000000,
//--------
0b01111110,//K10
0b00010000,
0b00011000,
0b00100100,
0b01000010,
0b00000000,
//--------
0b01111110,//L11
0b01000000,
0b01000000,
0b01000000,
0b01000000,
0b00000000,
//--------
0b01111110,//M12
0b00000100,
0b00001000,
0b00000100,
0b01111110,
0b00000000,
//--------
0b01111110,//N13
0b00000100,
0b00001000,
0b00010000,
0b01111110,
0b00000000,
//--------
0b00111100,//O14
0b01000010,
0b01000010,
0b01000010,
0b00111100,
0b00000000,
//--------
0b01111110,//P15
0b00010010,
0b00010010,
0b00010010,
0b00001100,
0b00000000,
//--------
0b00111100,//Q16
0b01000010,
0b01000010,
0b01100010,
0b01111100,
0b00000000,
//--------
0b01111110,//R17
0b00010010,
0b00010010,
0b00010010,
0b01101100,
0b00000000,
//--------
0b01001100,//S18
0b01010010,
0b01010010,
0b01010010,
0b00100010,
0b00000000,
//--------
0b00000010,//T19
0b00000010,
0b01111110,
0b00000010,
0b00000010,
0b00000000,
//--------
0b00111110,//U20
0b01000000,
0b01000000,
0b01000000,
0b00111110,
0b00000000,
//--------
0b00011110,//V21
0b00100000,
0b01000000,
0b00100000,
0b00011110,
0b00000000,
//--------
0b00111110,//W22
0b01000000,
0b00111110,
0b01000000,
0b00111110,
0b00000000,
//--------
0b01100110,//X23
0b00011000,
0b00011000,
0b00011000,
0b01100110,
0b00000000,
//--------
0b00000010,//Y24
0b00000100,
0b01111000,
0b00000100,
0b00000010,
0b00000000,
//--------
0b01000010,//Z25
0b01100010,
0b01010010,
0b01001010,
0b01000110,
0b00000000,
//--------
0b00000000,// 26
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000
};
//Interrupcion del Compare Match 0
interrupt [TIM0_COMP] void comp()
{
key = 1; //Indicando que ocurrio el compare match
}
//Interrupcion del Input Capture Pin
interrupt [TIM1_CAPT] void control()
{
time1 = ICR1H; //Copiar parte alta del ICR1 en time1
time2 = ICR1L; //Copiar parte baja del ICR1 en time2
time1 = (time1<<=8); //Moviendo 8 bits a la izaquierda el valor de time1
time1 = (time1+time2); //Sumando time 1 y time 2
time1 = (time1/192); //Calculando tiempo de retardo
timel = (time1&&0x00ff); //Filtrando parte baja del registro
time1 = (time1>>=8); //Moviendo 8 bits a la derecha el valor de time1
timeh = (time1&&0x00ff); //Filtrando parte alta del registro
a=0;
}
//Funcion de delay entre posicion de LED
void delay_1()
{
OCR0 = timel; //Cargando conteo inicial
TCNT0 = 0; //Reiniciando contador 0
TCCR0 |= 0b00000010; //Activando prescaler
while(key==0); //Esperando compare match
key = 0; //Activando espera del compare match
TCCR0 &= 0b11111101; //Desactivando prescaler
if(timeh>0) //Revisar si queda tiempo
{
do{
timeh--; //Decrementar tiempo
OCR0 = 0xff; //Cargando conteo
TCNT0 = 0; //Reiniciando contador 0
TCCR0 |= 0b00000010; //Activando prescaler
while(key==0); //Esperando compare match
key = 0; //Activando espera del compare match
TCCR0 &= 0b11111101; //Desactivando prescaler
}while(timeh>0); //Repetir hasta que timeh sea cero
}
}
//Programa principal
void main()
{
//Programando direccion de puertos y contadores
DDRB = 0xff;
DDRA = 0xff; //Puerto A de salida
DDRD.6 = 0; //Pin D.6 de entrada
TCCR0 = 0b01000000; //Contador 0 en modo normal
TCCR1A &= 0b11111100; //Contador 1 en modo normal
TCCR1B = 0b01000000; //ICE flanco positivo
TIMSK |= 0b00100010; //Seleccionando interrupciones
SREG |= 0b10000000; //Activar interrupciiones.
TCNT0 = 0; //Contador 0 igual a cero
TCNT1 = 0; //Contador 1 igual a cero
TCCR1B |= 0b00000010; //Activando prescaler
i = 0; //Iniciando contador
while((*puntero1)!='$') //Repetir hasta encontrar $
{
puntero1 = letrero+i; //Leyendo direccion
final[i] = (*puntero1); //Copiando dato de la direccion
i++; //Incrementando variable
}
tamano = i; //Obteniendo tamano del arreglo
a = 0; //Reiniciando 'a'
i = 0; //Reiniciando 'i'
while(i<tamano) //Repetir hasta llegar al tamano
{
for(e=0;e<=26;e++) //Revisando los 26 caracteres
{
puntero1=abc1+e; //Obteniendo direccion del abecedario en minuscula
puntero2=abc2+e; //Obteniendo direccion del abecedario en mayuscula
if((final[i]==*puntero1)||(final[i]==*puntero2))//Seleccionando letra
{
o=(e*6); //Multiplicando por 6 para seleccionar secuencia
salida[a]=bits[o]; //Guardando secuencia
a++; //Aumentando a
o++; //Aumentando o
salida[a]=bits[o]; //Guardando secuencia
a++; //Aumentando a
o++; //Aumentando o
salida[a]=bits[o]; //Guardando secuencia
a++; //Aumentando a
o++; //Aumentando o
salida[a]=bits[o]; //Guardando secuencia
a++; //Aumentando a
o++; //Aumentando o
salida[a]=bits[o]; //Guardando secuencia
a++; //Aumentando a
o++; //Aumentando o
salida[a]=bits[o]; //Guardando secuencia
a++;
}
}
o=0; //Reiniciando 'o'
i++; //Aumentado 'i'
}
tamano=tamano*6; //Calculando tamano real
while(1) //Repetir sin fin
{
for(a=0;a<tamano;a++) //Repetir 28 veces
{
PORTA = (~salida[a]); //primera secuencia
PORTA &= 0b01111110; //Agregando bordes
delay_1(); //Esperando
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -