TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: catatbcd en 29 de Enero de 2020, 20:07:36
-
Hola a todos, ¿como están?. Soy nueva en este foro, estoy intentando hacer un menú para un temporizador con el PIC 16f877a, LCD y teclado, en PIC C. Les agradecería si pueden ayudarme.
Ya plantee el funcionamiento general del programa.
Son 5 vistas: el saludo inicial (Scroll Menu), el menú principal, rutinas, configuración y conteo.
se usan 5 botones:
- D abre menú.
- B y C desplaza el menú arriba y abajo respectivamente.
- A para acceder al siguiente menú o dar aceptar.
- # para retroceder.
Este es el teclado que estoy usando.
(https://www.prometec.net/wp-content/uploads/2014/10/Img_19_2.jpg)
De entrada parece funcionar pero después de acceder un par de veces empieza a fallar y me manda a la vista que no es, la función atrás no sirve.
#include <16f877A.H> //PIC 16F877A
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock=20000000) // Oscilador de 20MHz
#include <lcd.c> // Driver para LCD
#DEFINE USE_PORTB_KBD //Teclado conectado al puerto B
#include <KBD4x4.c> // Driver para teclado
//#DEFINE KEYHIT_DELAY 200 //Tiempo(ms) de espera del teclado
#BYTE PORTB =0X06
#BYTE PORTC =0X07
char key=0;
int valor_key,a=0,a0=0,b0=0,b1=0, b2=0, max,min, Nivelmenu=0;
short Conteo;
int Desplazar (max,min){
if (valor_key==19){//Letra C abajo
if (a>=max){
a=0;
}else {
a++;
}
}
else if (valor_key==18){//Letra B arriba
if (a<=min){
a=1;
}
else{
a--;
}
}
return a;
}
void Inicial(){
NivelMenu=0;
lcd_gotoxy(1,1);
Printf(lcd_putc,"\fScroll Menu");
}
void Rutinas(){
NivelMenu=2;
lcd_gotoxy(7,1);
printf(lcd_putc,"\fRUTINAS");
lcd_gotoxy(1,2);
printf(lcd_putc,"*Rutina 1");
if (valor_key==17){//Letra A aceptar
NivelMenu=0;
valor_key=0;
lcd_gotoxy(1,1);
printf(lcd_putc,"\fRutina 1");
delay_ms(1000);
Inicial();
}
}
void Menu(){
NivelMenu=1;
lcd_gotoxy(7,1);
printf(lcd_putc,"\fMENU");
lcd_gotoxy(1,2);
printf(lcd_putc,"*Rutinas");
if (valor_key==17){//Letra A aceptar
NivelMenu=2;
valor_key=0;
b0=0;
Rutinas();
}
}
void Conteos(){
NivelMenu=4;
lcd_gotoxy(7,1);
printf(lcd_putc,"\fCONTEO");
lcd_gotoxy(1,2);
printf(lcd_putc,"*Ascendente");
if (valor_key==17){//Letra A aceptar
NivelMenu=0;
valor_key=0;
Conteo=1;
lcd_gotoxy(7,1);
printf(lcd_putc,"\f %i",Conteo);
delay_ms(1000);
Inicial();
}
}
void Configuracion(){
NivelMenu=3;
lcd_gotoxy(7,1);
printf(lcd_putc,"\fCONFIGURACION %i",NivelMenu);
lcd_gotoxy(1,2);
printf(lcd_putc,"*Conteo");
if (valor_key==17){//Letra A aceptar
b2=0;
NivelMenu=4;
valor_key=0;
Conteos();
}
}
void Volumen() {
NivelMenu=0;
lcd_gotoxy(7,1);
printf(lcd_putc,"\fVolumen %i",NivelMenu);
lcd_gotoxy(1,2);
printf(lcd_putc,"%i",b1);
delay_ms(1000);
Inicial();
}
void main(){
port_b_pullups (1);
lcd_init();
kbd_init();
NivelMenu=0;
while (true){
key = kbd_getc();
if (key!=0){
valor_key = key-48; // convertir de ascii a entero
switch ( NivelMenu ) {
case 0: //MENU INICIAL
if (valor_key == 20) { //Letra D Menu
valor_key=0;
a0=0;
Menu();
}else
Inicial();
break;
case 1:
if (valor_key==-13){//simbolo # atras
Inicial();
}
a0=Desplazar(1,0);
switch ( a0 ) {
case 0:
Menu();
break;
case 1:
lcd_gotoxy(7,1);
printf(lcd_putc,"\fRutinas");
lcd_gotoxy(1,2);
printf(lcd_putc,"*Configuracion");
if (valor_key==17){//Letra A aceptar
valor_key=0;
b1=0;
valor_key=0;
Configuracion();
}
break;
}
break;
case 2:
if (valor_key==-13){//simbolo D atras
a0=0;
Menu();
}
b0=Desplazar(1,0);
switch ( b0 ) {
case 0:
Rutinas();
break;
case 1:
lcd_gotoxy(7,1);
printf(lcd_putc,"\fRutina 1");
lcd_gotoxy(1,2);
printf(lcd_putc,"*Rutina 2");
if (valor_key==17){//Letra A aceptar
valor_key=0;
lcd_gotoxy(1,1);
printf(lcd_putc,"\fRutina 2");
delay_ms(1000);
Inicial();
}
break;
}
break;
case 3:
if (valor_key==-13){//simbolo # atras
a0=0;
Menu();
}
b1=Desplazar(1,0);
switch ( b1 ) {
case 0:
Configuracion();
break;
case 1:
lcd_gotoxy(7,1);
printf(lcd_putc,"\fConteo");
lcd_gotoxy(1,2);
printf(lcd_putc,"*Volumen");
if (valor_key==17){//Letra A aceptar
valor_key=0;
Volumen();
}
break;
}
break;
case 4:
if (valor_key==-13){//simbolo D atras
b1=0;
Configuracion();
}
b2=Desplazar(1,0);
switch ( b2 ) {
case 0:
Conteos();
break;
case 1:
lcd_gotoxy(7,1);
printf(lcd_putc,"\fAscendente %i",NivelMenu);
lcd_gotoxy(1,2);
printf(lcd_putc,"*Desendente");
if (valor_key==17){//Letra A aceptar
valor_key=0;
Conteo=0;
lcd_gotoxy(7,1);
printf(lcd_putc,"\f %i",Conteo);
delay_ms(1000);
Inicial();
}
break;
}
break;
}
}
}
}
Ya he revisado el código y no doy con el o los errores, no tengo mucha experiencia con micro controladores, si alguien es tan amable de asesorarme estaré muy agradecida.
Nota: hay que presionar cualquier tecla para que muestre el saludo inicial.
-
Hola, así quedo el código funcionando por si a alguien le sirve, había un conflicto con la función de subir y bajar.
#include <16f877A.H> //PIC 16F877A
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock=20000000) // Oscilador de 20MHz
#include <lcd.c> // Driver para LCD
#DEFINE USE_PORTB_KBD //Teclado conectado al puerto B
#include <KBD4x4.c> // Driver para teclado
//#DEFINE KEYHIT_DELAY 200 //Tiempo(ms) de espera del teclado
#BYTE PORTB =0X06
#BYTE PORTC =0X07
char key=0;
int valor_key,a0=0,b0=0,b1=0, b2=0,Nivelmenu=0;
short Conteo;
void Inicial(){// NivelMenu==0
NivelMenu=0;
lcd_gotoxy(1,1);
Printf(lcd_putc,"\fScroll Menu NM:%i",NivelMenu);
}
void Rutinas(){ //NivelMenu=2
NivelMenu=2;
if (valor_key==20){//Letra D aceptar
valor_key =0;
lcd_gotoxy(1,1);
printf(lcd_putc,"\fRutina 1 NM:%i",NivelMenu);
delay_ms(1000);
NivelMenu=6;
Inicial();
}else{lcd_gotoxy(7,1);
printf(lcd_putc,"\fRUTINAS NM:%i",NivelMenu);
lcd_gotoxy(1,2);
printf(lcd_putc,"*Rutina 1");
}
}
void Menu(){ //NivelMenu==1
NivelMenu=1;
if (valor_key==20){//Letra D aceptar
NivelMenu=2;
valor_key =0;
Rutinas();
}else{
lcd_gotoxy(7,1);
printf(lcd_putc,"\fMENU NM:%i",NivelMenu);
lcd_gotoxy(1,2);
printf(lcd_putc,"*Rutinas");
}
}
void Conteos(){ //NivelMenu==4
NivelMenu=4;
if (valor_key==20){//Letra D aceptar
NivelMenu=0;
valor_key =0;
Conteo=1;
lcd_gotoxy(7,1);
printf(lcd_putc,"\f %i NM:%i", Conteo,NivelMenu);
delay_ms(1000);
Inicial();
}else{
lcd_gotoxy(7,1);
printf(lcd_putc,"\fCONTEO NM:%i",NivelMenu);
lcd_gotoxy(1,2);
printf(lcd_putc,"*Ascendente");
}
}
void Configuracion(){ //NivelMenu==3
NivelMenu=3;
if (valor_key==20){//Letra D aceptar
valor_key =0;
Conteos();
}else{
lcd_gotoxy(7,1);
printf(lcd_putc,"\fCONFIGURA NM:%i",NivelMenu);
lcd_gotoxy(1,2);
printf(lcd_putc,"*Conteo");
}
}
void Volumen() {
lcd_gotoxy(7,1);
printf(lcd_putc,"\fVolumen NM:%i",NivelMenu);
lcd_gotoxy(1,2);
printf(lcd_putc,"%i",b1);
delay_ms(1000);
NivelMenu=0;
Inicial();
}
void main(){
port_b_pullups (1);
lcd_init();
kbd_init();
NivelMenu=0;
while (true){
key = kbd_getc();
if (key!=0){
valor_key = key-48; // convertir de ascii a entero
if ( NivelMenu==0 ) { //MENU INICIAL
if (valor_key == 20) { //Letra D Menu
valor_key =0;
Menu();
}else{
inicial();}
}else if ( NivelMenu==1 ) {
if (valor_key==19){//Letra C abajo
if (a0>=1){
a0=0;
}else {
a0++;
} } else if (valor_key==18){//Letra B arriba
if (a0<=0){
a0=1;
}
else{
a0--;
}
}
if(a0==0){
if (valor_key==-13){//simbolo # atras
valor_key =0;
Inicial();
}else {
Menu();}}
else if(a0==1){
if (valor_key==-13){//simbolo # atras
valor_key =0;
Inicial();
}else{
if (valor_key==20){//Letra D aceptar
a0=0;
valor_key =0;
Configuracion();
}else {
lcd_gotoxy(7,1);
printf(lcd_putc,"\fRutinas");
lcd_gotoxy(1,2);
printf(lcd_putc,"*Configuracion");
}}
}
}else if ( NivelMenu==2 ) {//Menu principal
if (valor_key==19){//Letra C abajo
if (b0>=1){
b0=0;
}else {
b0++;
} } else if (valor_key==18){//Letra B arriba
if (b0<=0){
b0=1;
}
else{
b0--;
}
}
if( b0==0 ) {
if (valor_key==-13){//simbolo # atras
valor_key =0;
Menu();
}else{
Rutinas();}
}
else if(b0==1){
if (valor_key==-13){//simbolo # atras
valor_key =0;
Menu();
}else{
if (valor_key==20){//Letra D aceptar
b0=0;
valor_key =0;
lcd_gotoxy(1,1);
printf(lcd_putc,"\fRutina 2");
delay_ms(1000);
NivelMenu=7;
Inicial();
}else{lcd_gotoxy(7,1);
printf(lcd_putc,"\fRutina 1");
lcd_gotoxy(1,2);
printf(lcd_putc,"*Rutina 2");}
}}
}else if ( NivelMenu==3 ) {
//Configuracion
if (valor_key==19){//Letra C abajo
if (b1>=1){
b1=0;
}else {
b1++;
} } else if (valor_key==18){//Letra B arriba
if (b1<=0){
b1=1;
}
else{
b1--;
}
}
if( b1==0 ) {if (valor_key==-13){//simbolo # atras
valor_key =0;
Menu();
}else{
Configuracion();}
}else if (b1==1){
if (valor_key==-13){//simbolo # atras
valor_key =0;
Menu();
}else{
if (valor_key==20){//Letra D| aceptar
NivelMenu=5;
b1=0;
valor_key =0;
Volumen();
}else{
lcd_gotoxy(7,1);
printf(lcd_putc,"\fConteo");
lcd_gotoxy(1,2);
printf(lcd_putc,"*Volumen");
}
}}
}else if ( NivelMenu==4 ) { //Conteo
if (valor_key==19){//Letra C abajo
if (b2>=1){
b2=0;
}else {
b2++;
} } else if (valor_key==18){//Letra B arriba
if (b2<=0){
b2=1;
}
else{
b2--;
}
}
if ( b2==0 ) { if (valor_key==-13){//simbolo # atras
valor_key =0;
Configuracion();
}else{
Conteos();}
}
else if(b2== 1){
if (valor_key==-13){//simbolo # atras
valor_key =0;
Configuracion();
}else{
if (valor_key==20){//Letra D aceptar
b2=0;
valor_key =0;
Conteo=0;
lcd_gotoxy(7,1);
printf(lcd_putc,"\f %i",Conteo);
delay_ms(1000);
Inicial();
}else{ lcd_gotoxy(7,1);
printf(lcd_putc,"\fAscendente %i",NivelMenu);
lcd_gotoxy(1,2);
printf(lcd_putc,"*Desendente");}
}
}}
}
}
}