void ks0108DrawRoundRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t radius, uint8_t color) { int16_t tSwitch, x1 = 0, y1 = radius; tSwitch = 3 - 2 * radius; while (x1 <= y1) { ks0108SetDot(x+radius - x1, y+radius - y1, color); ks0108SetDot(x+radius - y1, y+radius - x1, color); ks0108SetDot(x+width-radius + x1, y+radius - y1, color); ks0108SetDot(x+width-radius + y1, y+radius - x1, color); ks0108SetDot(x+width-radius + x1, y+height-radius + y1, color); ks0108SetDot(x+width-radius + y1, y+height-radius + x1, color); ks0108SetDot(x+radius - x1, y+height-radius + y1, color); ks0108SetDot(x+radius - y1, y+height-radius + x1, color); if (tSwitch < 0) { tSwitch += (4 * x1 + 6); } else { tSwitch += (4 * (x1 - y1) + 10); y1--; } x1++; } ks0108DrawHoriLine(x+radius, y, width-(2*radius), color); // top ks0108DrawHoriLine(x+radius, y+height, width-(2*radius), color); // bottom ks0108DrawVertLine(x, y+radius, height-(2*radius), color); // left ks0108DrawVertLine(x+width, y+radius, height-(2*radius), color); // right }
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. } } } }