Владислав Бобриков

Перевод строки в число и наоборот

41 сообщение в этой теме

9 часов назад, Alex сказал:

Я вот не понимаю, к чему эти все извращения ?

Ну, это же учебный проект, чем больше извращений, тем больше интересно)
А так, скорее всего буду юзать простой таймер

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Таймер сделал на 1 сек. Обычный. Т.е. прерывания происходят каждую 1 сек.

Пытаюсь разобраться как же удалять символы. Ну допустим идет опрос клавиатуры нужно ввести пятизначное число, и ты на 3тьем символе просто ошибся, не будешь же ты вырубать питание и заново писать. Нужно придумать, как удалять символы. Я тут подумал в цикл опроса вставить условие, не нажата ли, например, звездочка. Если нажата, то счетчик цикла декрементируется, а последний записанный символ в массиве (counter-1) становится NULL. Только вот не знаю, как это повлияет на дисплей, если допустим этот алгоритм сработает, удалится число из массива, пропадет ли число на экране дисплея ? Или возможно станет каракулей ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alexeyslav    642

Нет такого понятия для МК как NULL. Что именно записывается туда, то и отобразится. В даташите на индикатор есть знакогенератор, просто пальчиком тыц-тыц и вы точно узнаете какой символ он отобразит. Но чтобы не гадать, не проще ли туда сразу занести ПРОБЕЛ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Блин, возникла та же проблема что и была, с переводом числа. Ну то есть я влезаю в диапазон лонг инт.

В первую настройку ввожу 999999
во вторую настройку ввожу 9999

они вводятся в массив, после этого конвертируются в лонг инт, и снова конвертируются, но в другом массив с таким же типом, как и был до этого.
этот же код у меня работал до этого, а потом перестал. Вторая настройка, в которой всего 4 разряда, конвертируется так, словно ей не хватает диапазона. (пробовал unsigned и signed)

photo_2019-01-16_23-05-35.thumb.jpg.3be3a4922b41927eae15a6c1b1d00b65.jpg

photo_2019-01-16_23-05-37.thumb.jpg.ff060d21f11ddc2eec1828fc8e2e4aa7.jpg

 

photo_2019-01-16_23-05-35.thumb.jpg.3be3a4922b41927eae15a6c1b1d00b65.jpg


Вот код:

 

#include <mega16.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <delay.h>
#include <alcd.h>
#include <keyboard.h>

eeprom unsigned long int FZ=0;
eeprom unsigned long int MR=0;

char buf=0;
char FZ_[6];
char MR_[4];
char kek[6];
char kek1[4];
int i;
unsigned long int temp_FZ=0,TEMP_FZ1=0;
unsigned long int temp_MR=0,TEMP_MR1=0;

 void main(void)
{
lcd_init(16);
KEYB_Init();
    
while (1)
      {  
                for( i = 0; i<8; i++)
                {   
                     if(i == 7)
                     {
                      do  { 
                      KEYB_ScanKeyboard();
                      buf = KEYB_GetKey();
                       } while(buf != '#');
                       break;
                      }
                    
                     
                    do { 
                     KEYB_ScanKeyboard();
                     buf = KEYB_GetKey();
                    } while(buf == NULL);
                    
                    
                       
                    
                        if(buf == '*')
                        {
                            FZ_[i-1] =' '; 
                            lcd_gotoxy(0,1);
                            lcd_putsf("FZ");
                            lcd_gotoxy((i-1),0);
                            lcd_putchar(FZ_[i-1]);
                            i = i-2;
                            
                        }
                    
                       else  {
                       if(i<6)
                         {
                        FZ_[i] = buf;
                        lcd_gotoxy(0,1);
                        lcd_putsf("FZ");
                        lcd_gotoxy(i,0);
                        lcd_putchar(FZ_[i]); 
                        }
                               }
                }      
               
                  
                
                 temp_FZ=atol(FZ_);
                 FZ=temp_FZ;
                 TEMP_FZ1=FZ;
                 ltoa(TEMP_FZ1, kek); 
                 delay_ms(5000);
                 lcd_clear();
                
          
           
             for(i=0;i<6;i++)
             {   
              if(i == 5)
                     {
                      do  { 
                      KEYB_ScanKeyboard();
                      buf = KEYB_GetKey();
                       } while(buf != '#');
                       break;
                      }
             
                do { 
                     KEYB_ScanKeyboard();
                     buf = KEYB_GetKey();
                    } while(buf == NULL); 
                    
                    
                        if(buf == '*')
                        {
                            MR_[i-1] =' '; 
                            lcd_gotoxy(0,1);
                            lcd_putsf("MR");
                            lcd_gotoxy((i-1),0);
                            lcd_putchar(MR_[i-1]);
                            i = i-2;
                            
                        }
                  else {
                       if(i<4)
                        {    
                          MR_[i] = buf;
                          lcd_gotoxy(0,1);
                          lcd_putsf("MR");
                          lcd_gotoxy(i,0);
                           lcd_putchar(MR_[i]);
                         }
                      } 
             }     
            
             temp_MR=atol(MR_);
             MR=temp_MR;
             TEMP_MR1=MR;
             ltoa(TEMP_MR1, kek1);
             delay_ms(5000);
             lcd_clear();
             
                
            // lcd_gotoxy(0,0);
            // lcd_puts(kek);     
               
               
       lcd_gotoxy(0,0);
       lcd_putchar(kek[0]);
       lcd_gotoxy(1,0);
       lcd_putchar(kek[1]);
       lcd_gotoxy(2,0);
       lcd_putchar(kek[2]);
       lcd_gotoxy(3,0);
       lcd_putchar(kek[3]);
       lcd_gotoxy(4,0); 
       lcd_putchar(kek[4]);
       lcd_gotoxy(5,0); 
       lcd_putchar(kek[5]);
       lcd_gotoxy(0,1);
       lcd_putchar(kek1[0]);
       lcd_gotoxy(1,1);
       lcd_putchar(kek1[1]);
       lcd_gotoxy(2,1);
       lcd_putchar(kek1[2]);
       lcd_gotoxy(3,1);
       lcd_putchar(kek1[3]);
     
         
         
        
     
 }     
        
}

 

photo_2019-01-16_23-05-38.jpg

Изменено пользователем Владислав Бобриков

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    568

Копайте в сторону размера буферов, в которые вводите символы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, Alex сказал:

Копайте в сторону размера буферов

Только что вторую настройку МР сделал флоатом, а следовательно использовал atof и ftoa - все работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    568

Интересно ещё вот что.
В цикле

for(i=0;i<6;i++)

у Вас имеется конструкция

MR_[i-1] =

Вы уверены, что тут всё верно ?

Ну и, конечно же, размер массива MR_ = всего 4-ём. А цикл до 6-ти. О чём я уже выше говорил.

PS: К чему такая жадность, при выделении памяти под массивы ? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

еще 2 итерации сделаны для того, чтобы можно было удалить последний символ через клавишу звездочка, и "ввести", то есть подтвердить ввод клавишей решетка.

Не могу понять, как сделать, чтобы функция вызывалась единожды. Ну то есть я поместил код опроса клавы в функцию. Аргумент у него некий флаг, внутри функции происходит опрос если флаг==0, а после опроса становиться единицей. флаг занесен в епром. При выключении питания и включении заново происходит снова опрос. Как сделать, чтобы функция ввода значений клавы вызывалась единожды при первом запуске ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    568
1 минуту назад, Владислав Бобриков сказал:

Как сделать, чтобы функция ввода значений клавы вызывалась единожды при первом запуске ?

Сделать её вызов 1 раз при запуске. Что логично :)

int main(){
  func();    // Вызываем 1 раз при запуске.
  
  while(1){
    ...
    ...  
  }
  
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    568

Что значит "не вызвалась" ? С какого такого перепугу, если Вы её вызов явно пишете в коде ? :blink:

Что-то Вы там мудрите и не договариваете ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Все уже сделал, заработало, немного стресс, из-за того что сроки скоро подойдут.

Сейчас работаю над тем, чтобы глобальное прерывания работало по нарастаящему фронту, когда 450 импульсов проходит, то из двух настроек минусуется единица(что символизирует литр).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно ли запрещать и разрешать глобальные прерывания (я так понимаю это команда еще является разрешением прерывания и для таймера) внутри функции, которая используется в главном цикле программы вайл ?


Ну то есть, допустим на вход порта Б бита ноль 0 подавалась единица. Вдруг она пропала, флаг стал нулем, описана функция, когда вызывается, если флаг становиться нулем, и в этой функции идет запрет на прерывания, отключения клапана, и крутиться бесконечный цикл, до тех пор, пока уровень на пине б.0 не станет снова высоким ? После того как стал высоким, прерывания разрешаются, флаг становиться единицей и программа выходит из этой функции в основной бесконечный цикл вайл.

Или же есть какие-то нюансы по поводу запретов и разрешений внешнего прерывания, и прерывания по переполнению таймера ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ARV    500

Запрещать и разрешать можно, лишь бы это соответствовало вашим целям.

Если прерывания запрещены глобально, то не только таймер перестанет их генерировать, но и все другие источники.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, ARV сказал:

Запрещать и разрешать можно

asm("sei") и asm("cli") , как я понимаю первое это глобальное разрешение, а второе - глобальный запрет ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...