Новичок
Регистрация: 05.12.2012
Сообщений: 11
Репутация: 11
|
Доброго времени суток.
Пишу программу для аквариумного контроллера.Первый уровень меню-выбор из семи функций с выводом на LCD. Функции перебираются кнопкой(сигнал InA0),а нужная функция выбирается другой кнопкой(InA3). Вот и вся программа.Запускаю,начинаю нажимать InA0- всё работает ,функции перебираются,но третья по счёту функция "SetSUNSET" - на ЖКИ не отображается.Всё остальное-нормально работает. Если гору if-ов сделать комментарием,то третья функция отображается нормально.Отладку веду на EasyPIC-5. Вот код в mikroC: // LCD module connections from LCD Library sbit LCD_RS at RB4_bit; sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; //------------------------------------------------------------------------------ unsigned int pMenu; bit old_SA0,old_SA3; bit InA0,InA1,InA2,InA3; //Var.definitions for some text outputing to LCD-------------------------------- unsigned char temper[5];//Variable gets string value,converted from numTemp. float numTemp=36.5; //Stores float of temperature. //MY 7 functions //------------------------------------------------------------------------------ SetHM() { Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"Set H / M"); while(1){ } } //------------------------------------------------------------ SetSR() { Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"Set SR H/M"); while(1){ } } //----------------------------------------------------------------------------- SetSS() { Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"Set SS H/M"); while(1){ } } //----------------------------------------------------------------------------- SetCO2start() { Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"Set CO2strt H/M"); while(1){ } } //----------------------------------------------------------------------------- SetCO2end() { Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"Set CO2end H/M"); while(1){ } } //----------------------------------------------------------------------------- SetO2start() { Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"Set O2strt H/M"); while(1){ } } //----------------------------------------------------------------------------- SetO2end() { Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"Set O2end H/M"); while(1){ } } //================================================== =================== //==========Начало программы================================ ========= ==== void main(){ ADCON1 |= 0x0F; // Configure AN pins as digital CMCON |= 7; // Disable comparators TRISA |=0x0F; //------------------------------------------------------------------------------ Lcd_Init(); // Initialize LCD - from LCD library Lcd_Cmd(_LCD_CLEAR); // Clear display - from LCD library Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Cmd(_LCD_TURN_ON); // Cursor off - from LCD library forCase: pMenu=0; do { InA0=PORTA.RA0; InA3=PORTA.RA3; if(InA0 == 0 && old_SA0==1){//Если нажата кнопка switch(pMenu) { //Перебирать пункты меню case 0: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetCLOCK");break; case 1: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetSUNRISE");brea k; case 2: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetSUNSET");break ; case 3: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetCO2_STRT");bre ak; case 4: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetCO2_END");brea k; case 5: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetO2_STRT");brea k; case 6: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetO2_END");break ; case 7: goto forCase; } //pMenu содержит номер выбранной функции pMenu++; }//продолжить перебор функций old_SA0=InA0; //================================================== ========== ========== //при нажатии InA3 войти в подпрограмму соответствующую (pMenu)выбранной функции if(inA3==0 && old_SA3==1 && pMenu==1)SetHM(); if(inA3==0 && old_SA3==1 && pMenu==2)SetSR(); if(inA3==0 && old_SA3==1 && pMenu==3)SetSS(); if(inA3==0 && old_SA3==1 && pMenu==4)SetCO2start(); if(inA3==0 && old_SA3==1 && pMenu==5)SetCO2end(); if(inA3==0 && old_SA3==1 && pMenu==6)SetO2start(); if(inA3==0 && old_SA3==1 && pMenu==7)SetO2end(); old_SA3=InA3 ; } while(1);//бесконечный возврат на do } Теперь мистика. Если не нажимать кнопку InA3,а только перебирать функции кнопкой InA0,то,как я и говорил,третья функция не отображается.остальное всё в порядке. Но(!!!),если я расширяю в этой третьей фукции "Set SS H/M" на "Set SS H/Mллллллллллллллллл" ,то вижу часть символов "л" в первой строке ЖКИ.Получается,что без нажатия InA3 всё равно как-то выбирается и выполняется(при этом не сначала строки!) третий if?????? Может,кто поможет инвалиду умственного труда. Заранее спасибо от новичка. |
||
Оценка
|
Знаток
Регистрация: 06.01.2010
Адрес: Львов
Сообщений: 238
Репутация: 125
|
А Вы уверены, что симулятор Вас не обманывает? Недавно пробовал посмотреть работу своей схемы (собранной, кстати, и в железе) в Протеусе - и столкнулся с глюками вроде того, что светодиод не зажигается, хотя порт настроен на вывод и нужный его бит устанавливается в 1. В железе же всё работает... Единственный симулятор, которому, на мой взгляд, можно доверять, это MPLab Sim. Я лично им и пользуюсь при возникновении подобных "загадочных" ситуаций. Но программа должна быть написана на Ассемблере.
|
||
Оценка
|
Новичок
Регистрация: 01.05.2013
Сообщений: 6
Репутация: 10
|
Наверно к вас здесь косячок
Код:
case 1: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetSUNRISE");brea k; Остальные break тоже есть с ошибкой. Нарисуйте в протеусе, для проверки. Есть же в микросях встроеная функция обработки нажатия кнопки с функцией антидребезга, воспользуйтес ею. Антидребезг у вас не обрабатывается. |
||
Оценка
|
Новичок
Регистрация: 01.05.2013
Сообщений: 6
Репутация: 10
|
Цитата:
А Вы уверены, что симулятор Вас не обманывает? Недавно пробовал посмотреть работу своей схемы (собранной, кстати, и в железе) в Протеусе - и столкнулся с глюками вроде того, что светодиод не зажигается, хотя порт настроен на вывод и нужный его бит устанавливается в 1. В железе же всё работает... Единственный симулятор, которому, на мой взгляд, можно доверять, это MPLab Sim. Я лично им и пользуюсь при возникновении подобных "загадочных" ситуаций. Но программа должна быть написана на Ассемблере.
А лучше проектик выложите, посмотрели бы. |
||
Оценка
|
Новичок
Регистрация: 05.12.2012
Сообщений: 11
Репутация: 11
|
Цитата:
Наверно к вас здесь косячок
Код:
case 1: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetSUNRISE");brea k; Остальные break тоже есть с ошибкой. Нарисуйте в протеусе, для проверки. Есть же в микросях встроеная функция обработки нажатия кнопки с функцией антидребезга, воспользуйтес ею. Антидребезг у вас не обрабатывается. |
||
Оценка
|
Обратная связь РадиоЛоцман Вверх |