Ejemplo n.º 1
0
Archivo: main.c Proyecto: epffpe/Atmel
int main(void) 

{	/***********Configuración de los registros de datos y comandos*************/

   DDRC=0x00; //Parte alta como entrada y parte baja como salida.
   PORTC=0x0F;// Puerto C se utiliza para entradas al ADC y control del push Back.
   PORTB=0xE0;   // Puerto B resistencias en pull-up solo PB5-PB7, para control de los push1 y push2.
   TCCR0 = (1<<CS01); //preescalamiento del timer0 a clk/8
   

	// Espera un momento en lo que se inicializa el Display
	
	for(volatile uint16_t i=0; i<15000; i++);
	
	// Inicilalización de la LCD
	
	ks0108Init(0); //Inicializa la LCD en la coordenada 0 pagina 0.
	delay(SEG/10);
	   
	LoadBitmap(LOGOAG); //Carga el mapa de bits para desplegar en pantalla.
			  
    delay(3*SEG);// Retardo de aprox. 3s. SEG== 3906.
MENU:	
	menu();// Llama a la función para desplegar el menu de opciones.
	
	
	for(;;)
	{
	
	/******Segmento de la programación para el Osciloscopio.*******/
	
		if((PINB & 0XC0)==0x80) //Condición para seleccionar la opción en el menu de osciloscopio.
		{
			ks0108ClearScreen();	//Función para limpiar pantalla.
			ks0108SelectFont(Arial_Bold_14, ks0108ReadFontData, BLACK); //Selección del tipo de fuente.
			
			// Instrucción para situarce en la coordenada específica.
			ks0108GotoXY(40,27);
			
			// Instrucción para colocar un texto en pantalla, con el tamaño de fuente elejida.
			ks0108Puts_P(PSTR("Prueba 1"));
			
			ks0108DrawRoundRect(34, 25, 67, 15, 6, BLACK); // Dibuja un rectángulo redondeado.
			ks0108DrawRect(0,0,127,63,BLACK);	//Dibuja el marco alrededor de la pantalla.
			ks0108DrawLine(16, 8, 16, 60, BLACK); // Eje Y
			ks0108DrawLine(10, 55, 120, 55, BLACK); // Eje X2
			
			delay(SEG2);	//Aguarda un segundo de tiempo
			
			ks0108FillRect(30, 24, 73, 18, WHITE);// Borra el Letrero de Prueba 1.
			//ks0108DrawLine(10, 33, 120, 33, BLACK); // Eje X1
			
			ks0108SelectFont(Arial8, ks0108ReadFontData, BLACK); // Selecciona fuente Arial N°8
			// Instrucción para situarce en la coordenada específica.
			ks0108GotoXY(27,2);
			// Instrucción para colocar un texto en pantalla, con el tamaño de fuente elejida.
			ks0108Puts_P(PSTR("Osciloscopio Ver. 1.0"));
			
			ks0108GotoXY(1,42);
			ks0108Puts_P(PSTR("Ch2"));
			
			ks0108GotoXY(1,19);
			ks0108Puts_P(PSTR("Ch1"));
			
			//Inicialización del ADC.
			
			ADCSRA = _BV(ADPS2)|_BV(ADPS1)|_BV(ADEN);//preescalamiento a CPU/64, habilitacion del ADC
			ADMUX=_BV(REFS0)|_BV(ADLAR); // SE UTILIZA LA REFERENCIA DE avcc CON CAPACITOR EXTERNO y 8bits de resolución.
			//ADMUX =ADMUX|0x00; //Y justifica la conversión a la derecha (ADLAR) para 10 bits de resolución
			
			
			for(;;)
			{
				for(w=16; w<120;w++) // se asigna w un amplio de 105 puntos, que es el correpondiente a lo largo del eje x.
									// Esto se hace para que siempre se este barriendo los ejes X.
				{
					if((PINC&0x01)==0x00)// Si se presiona el boton de Back, regresa al menu para elegir una opción.
						goto MENU;
					//Graficación sobre el eje X2	
					amplitud= convierte(canal5);
					ks0108SetDot(w, (55-amplitud), BLACK);// Coloca un punto en el rango que le corresponde a la conversion. 
										
					if(w>16)//Si w ya esta en almenos en el segundo punto
						ks0108DrawLine(w-1, (55-Yant2), w, (55-amplitud), BLACK); //dibuja una línea del punto anterior al 
																					//punto actual. 
					Yant2= amplitud;//Respalda la abscisa anterior.
					
					//Graficación sobre el eje X1
					amplitud= convierte(canal4);
					ks0108SetDot(w, (33-amplitud), BLACK);// Coloca un punto en el rango que le corresponde a la conversion. 
					
					if(w>16)
						ks0108DrawLine(w-1, (33-Yant), w, (33-amplitud), BLACK);
					Yant= amplitud;
					delay(186);
					
				}
				ks0108FillRect(17,35,104,19,WHITE);// Borra lo dibujado en los 2 eje X...
				ks0108FillRect(17,13,104,20,WHITE);
				w=16; // y vuelve a barrer el eje X.	
			}
		}
		
		/******Segmento de la programación para el Analizador Lógico.*******/
 
		if ((PINB & 0XC0)==0x40)//Condición para seleccionar la opción en el menu de analizador lógico.
		{
			ks0108ClearScreen();	
			ks0108SelectFont(Arial_Bold_14, ks0108ReadFontData, BLACK);
			
			// Instrucción para situarce en la coordenada específica.
			ks0108GotoXY(40,27);
			
			// Instrucción para colocar un texto en pantalla, con el tamaño de fuente elejida.
			ks0108Puts_P(PSTR("Prueba 2"));
			
			ks0108DrawRoundRect(34, 25, 67, 15, 6, BLACK); // Dibuja un rectángulo redondeado.
			ks0108DrawRect(0,0,127,63,BLACK);	//Dibuja el marco alrededor de la pantalla.
			ks0108DrawLine(16, 8, 16, 60, BLACK); // Eje Y
			ks0108DrawLine(10, 55, 120, 55, BLACK); // Eje X2
			
			delay(SEG2);	//Aguarda un segundo de tiempo
			
			ks0108FillRect(30, 24, 73, 18, WHITE);// Borra el Letrero de Prueba 1.
			ks0108DrawLine(10, 33, 120, 33, BLACK); // Eje X1
			
			ks0108SelectFont(Arial8, ks0108ReadFontData, BLACK); // Selecciona fuente Arial N°8
			// Instrucción para situarce en la coordenada específica.
			ks0108GotoXY(32,2);
			// Instrucción para colocar un texto en pantalla, con el tamaño de fuente elejida.
			ks0108Puts_P(PSTR("Analizador Logico"));
			
			
			ks0108GotoXY(42,11);
			// Instrucción para colocar un texto en pantalla, con el tamaño de fuente elejida.
			ks0108Puts_P(PSTR("Version 1.0"));
			
			
			
			ks0108GotoXY(1,42);
			ks0108Puts_P(PSTR("Ch2"));
			
			
			ks0108GotoXY(1,19);
			ks0108Puts_P(PSTR("Ch1"));
		
			for (;;)
			{
				for(w=16; w<120;w++) // se asigna w un amplio de 105 puntos, que es el correpondiente a lo largo del eje x.
				{	
					if((PINC&0x01)==0x00)//Si se presiona este boton
						goto MENU;
						
					if ((PINB|0x3F) == 0x7F || (PINB|0x3F)==0x3F) // Señal de detección de 1 lógico para el canal 2.
					{
						if (tecleo ==0) //  Si la señal viene de tomar un valor 0 a 1 lógico...  
							ks0108DrawLine(w, 45, w, 55, BLACK);	//Dibuja el flanco de subida hasta el valor 1 lógico.
						ks0108SetDot(w, 45, BLACK);	//Grafica los puntos en la posición marcado por w en el nivel de 1 lógico 
						tecleo=1; // Asigna valor unitario la variable para que no se dibujen líneas verticales después de 
							  // que se tiene presente la señal.
					}
					if (((PINB|0x3F) == 0xFF || (PINB|0x3F)==0xBF) && tecleo==1) // Condición para dibujar el flanco de bajada del pulso detectado.
												//Si no se detecta señal en el puerto y además se viene de un valor logico 1,
												//se debe dibujar el flanco de bajada.
					{
						ks0108DrawLine(w, 45, w, 55, BLACK);
						tecleo=0;
					}
	
					if ((PINB|0x3F) == 0xBF || (PINB|0x3F)==0x3F) // Señal de detección de 1 lógico para el canal 1.
					{
						if (tecleo_1 ==0) //  Si la señal viene de tomar un valor 0 a 1 lógico,  
							ks0108DrawLine(w, 23, w, 33, BLACK);	//Dibuja una linea vertical hasta el valor 1 lógico.
						ks0108SetDot(w, 23, BLACK);	//Grafica los puntos en la posición marcado por w en el nivel de 1 lógico 
						tecleo_1=1; // Asigna valor unitario la variable para que no se dibujen líneas verticales después de 
							  // que se tiene presente la señal.
					}
					if (((PINB|0x3F)== 0xFF || (PINB|0x3F)==0x7F) && tecleo_1==1) // Condición para dibujar el flanco de bajada del pulso detectado.
												//Si no se detecta señal en el puerto y además se viene de un valor logico 1,
												//se debe dibujar el flanco de bajada.
					{
						ks0108DrawLine(w, 23, w, 33, BLACK);
						tecleo_1=0;
					}
				
					delay(186); // Retardo, el timer esta escalado a 8, asi que se se desborda cada 256us, si se quiere 
							//una base de tiempo sobre el eje x de 5s, a cada pixel de la LCD, le toca 186*256us.
				}
				ks0108FillRect(17,45,104,9,WHITE);// Borra lo dibujado en los 2 eje X...
				ks0108FillRect(17,23,104,9,WHITE);
				w=16; // y vuelve a barrer el eje X.	
			}
		}
	}
}
Ejemplo n.º 2
0
void ks0108DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t color) {
	uint8_t length, i, y, yAlt, xTmp, yTmp;
	int16_t m;
	
	//
	// vertical line
	//
	if(x1 == x2) {
		// x1|y1 must be the upper point
		if(y1 > y2) {
			yTmp = y1;
			y1 = y2;
			y2 = yTmp;
		}
		ks0108DrawVertLine(x1, y1, y2-y1, color);
	
	//
	// horizontal line
	//
	} else if(y1 == y2) {	
		// x1|y1 must be the left point
		if(x1 > x2) {
			xTmp = x1;
			x1 = x2;
			x2 = xTmp;
		}
		ks0108DrawHoriLine(x1, y1, x2-x1, color);
	
	//
	// schiefe line :)
	//
	} else {
		// angle >= 45°
		if((y2-y1) >= (x2-x1) || (y1-y2) >= (x2-x1)) {
			// x1 must be smaller than x2
			if(x1 > x2) {
				xTmp = x1;
				yTmp = y1;
				x1 = x2;
				y1 = y2;
				x2 = xTmp;
				y2 = yTmp;
			}
		
			length = x2-x1;		// not really the length :)
			m = ((y2-y1)*200)/length;
			yAlt = y1;
			
			for(i=0; i<=length; i++) {
				y = ((m*i)/200)+y1;
				
				if((m*i)%200 >= 100)
					y++;
				else if((m*i)%200 <= -100)
					y--;
				
				ks0108DrawLine(x1+i, yAlt, x1+i, y, color);
				
				if(length <= (y2-y1) && y1 < y2)
					yAlt = y+1;
				else if(length <= (y1-y2) && y1 > y2)
					yAlt = y-1;
				else
					yAlt = y;
			}
		
		// angle < 45°
		} else {
			// y1 must be smaller than y2
			if(y1 > y2) {
				xTmp = x1;
				yTmp = y1;
				x1 = x2;
				y1 = y2;
				x2 = xTmp;
				y2 = yTmp;
			}
			
			length = y2-y1;
			m = ((x2-x1)*200)/length;
			yAlt = x1;
			
			for(i=0; i<=length; i++) {
				y = ((m*i)/200)+x1;
				
				if((m*i)%200 >= 100)
					y++;
				else if((m*i)%200 <= -100)
					y--;
				
				ks0108DrawLine(yAlt, y1+i, y, y1+i, color);
				if(length <= (x2-x1) && x1 < x2)
					yAlt = y+1;
				else if(length <= (x1-x2) && x1 > x2)
					yAlt = y-1;
				else
					yAlt = y;
			}
		}
	}
}