⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pov.c

📁 this is a POV (persistence of vision) designed with atmega16.
💻 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 + -