kipizik

Вывод Чисел На Самисегментник

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

kipizik    0

Добрый день!Пишу программу для вывода чисел набранных с помощью кнопок на 4-разрядный семисегментный индикатор.Числа от 0 до 9 выводит нормально.А вот как вывести например число 1234 последовательным нажатием кнопок не могу придумать. :blink: Помогите,пожалуйста :rolleyes:

Вот мой код:

#include <MEGA8515.H>                                                                                   
#include <delay.h>
#include <math.h>

#define str1 PIND.0
#define str2 PIND.1
#define str3 PIND.2
#define str4 PIND.3
#define stolb1 PORTD.4
#define stolb2 PORTD.5
#define stolb3 PORTD.6

int num;
int i;
unsigned char button[12];
void chisla(int n,int a);
int knopka();

void main(void)
{    
int BUT;
int j;
int c;
int n;
num=0;
j=0;


// Port A initialization
PORTA=0x00;
DDRA=0xFF;

// Port B initialization
PORTC=0x00;
DDRC=0xFF;

// Port D initialization
PORTD=0xFF;
DDRD=0xF0;

while (1)
{
/*{
 BUT=knopka();
 j=BUT;
 chisla(j,5);
}*/
n=0;
BUT=knopka();
if(BUT==0||BUT==1||BUT==2||BUT==3||BUT==4||BUT==5||BUT==6||BUT==7||BUT==8||BUT==9)
  {
   c=BUT*pow(10,n); //[color="#FF0000"][b]вот именно в єтом месте не могу придумать формулу для вывода[/b][/color]
   j=c+BUT;
   chisla(j,1);
   }                     
 if(BUT==0xaa)
 {
 j=0;
 chisla(j,1);
 }
 }
}

void chisla(int n,int a) 
{
int Dig1,Dig2,Dig3,Dig4,y;
Dig1=0;
Dig2=0;
Dig3=0;
Dig4=0;
Dig4=n%10;
n=n/10;
Dig3=n%10;
n=n/10;
Dig2=n%10;
n=n/10;
Dig1=n;
for(y=1; y<=a; y++)
 {
  PORTC=Dig1|0x10;
  delay_ms(2);
  PORTC=Dig2|0x20;
  delay_ms(2); 
  PORTC=Dig3|0x40;
  delay_ms(2);
  PORTC=Dig4|0x80;
  delay_ms(2);
 }
} 

int knopka()
{
 int key;
 int i;
   for (i = 0; i < 3; i++) //проверяем 3 столбца
     {   
        delay_ms(3);  //делаем задержку 
        switch(i)    //управление столбцами
        {       
           case 0:{ stolb3=1; stolb1=0;  break; };  //1 столбец
           case 1:{ stolb1=1; stolb2=0;  break; };  //2 столбец
           case 2:{ stolb2=1; stolb3=0;  break; };  //3 столбец
        }  
        delay_ms (6);                  //задержка                  
        button[0+i]=str1;   //проверка 1 строки
        delay_ms (6);                  //задержка
        button[3+i]=str2;   //проверка 2 строки
        delay_ms (6);                  //задержка
        button[6+i]=str3;   //проверка 3 строки
        delay_ms (6);                  //задержка
        button[9+i]=str4;  //проверка 4 строки  
     }
     if(button[0]==0) key=1; delay_ms(5);   //если нажата клавиша 1 
     if(button[1]==0) key=2; delay_ms(5);   //если нажата клавиша 2
     if(button[2]==0) key=3; delay_ms(5);   //если нажата клавиша 3
     if(button[3]==0) key=4; delay_ms(5);   //если нажата клавиша 4
     if(button[4]==0) key=5; delay_ms(5);   //если нажата клавиша 5
     if(button[5]==0) key=6; delay_ms(5);   //если нажата клавиша 6
     if(button[6]==0) key=7; delay_ms(5);   //если нажата клавиша 7
     if(button[7]==0) key=8; delay_ms(5);   //если нажата клавиша 8
     if(button[8]==0) key=9; delay_ms(5);   //если нажата клавиша 9
     if(button[9]==0) key=0xff; delay_ms(5);  //если нажата клавиша *
     if(button[10]==0) key=0; delay_ms(5);  //если нажата клавиша 0
     if(button[11]==0) key=0xaa; delay_ms(5);  //если нажата клавиша #  
    return(key);         
}

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


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
wowa    4

Сделайте отдельно вывод отдельно ввод - и незабудьте на виртулальный курсор - указатель на следующее свободное место.

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


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

В вашей програме я даже нестал розбираться :) Нет времени. Опишу понятней:

1) Заводите переменную которая будет виртуальным курсором - показывать в какой разряд будем выводить цифру. Настаиваем его на 0 - первую цифру.

2) После ввода цифры с клавиатуры выводим его на индикатор 0 и увеличиваем на 1 переменную с курсором. Теперь она нам показывает на 1 - второй индикатор. После увеличения на 1 проверяем если не стала больше чем количество индикаторов. Если да то обнуляем её. Если нет ждём следующую цифру :)

Понятно?

Надеюсь индикация динамическая и не зависима от работы главного цикла програмы?

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


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

о :mellow: так намного понятнее :mellow: спасибо :rolleyes: да,индикация динамическая ;)

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


Ссылка на сообщение
Поделиться на других сайтах
Knazev33    3
да,индикация динамическая ;)

Может и динамическая, но вот что она у тебя делает в главном цикле?

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

другие задачи.

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


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

извиняюсь за глупый вопрос :rolleyes: но какие другие задачи? и если не в главном цикле вызывать функцию вывода на экран,то где? :rolleyes:

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


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

Другие задачи, значит что-то полезное, а не просто выводить циферки с кнопки,

всё динамическую индикацию можно запихнуть в обработчик прерывания,

а в главном цикле только задовать значения выводимое на экран.

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения

    • Да нет, я думаю это прост недопонимание....все решится) думаю завтра)спасибо за беспокойство. ну и доверять людям нужно)))отправлял я здесь многим ....и ни кто не подводил)
    • Вопрос такой возник, от части по программе, от части нет. Знаю что трансформаторы мотаю литцендратом, а дроссели в один провод. Для лучших показателей. Программа отрабатывает незначительными отклонениями разных показателей если я дроссель намотаю литцендратом. На что это может повлиять?
    • 0,1мкФ самое то, я обычно именно  столько использую
    • @Falconist  буду ждать схемы, мне ашь интересно, какая она  должна быть  Я думаю ни чего страшного , входной транзистор в коллектор которого нагружена эта ёмкость от звукового сигнала  не прям полностью  ш открывается, сам по себе транзистор как токо ограничитель и работает. 
    • Очень многие малоопытные , начинающие радиолюбители ( в том числе и я ) , повторяя " липинский ,  " приобрели поистине неоценимый опыт в инверторном сваркостроении .  За это огромное спасибо всем , кто не погнушался передать свои знания страждущим ! Только из моих знакомых знаю двоих , успешно собравших этот аппарат ! На этом этапе , я , к примеру , наломал " кучу дров " , и если - бы не помощь жителей форума , в первую очередь основателей данной темы , дела были - бы плохи ! Скорее всего , забросил бы это дело !    К чему такое " лирическое отступление " ?  А вот к чему - хочу предложить нашим многоопытным гуру начать новую тему - " Очень простой , доступный в повторении и настройке инверторный полуавтомат " .      Желающих , поверьте , будет предостаточно ! Знаю это точно из общения с людьми !  Можно обвинить меня в личной заинтересованности , но это не так  - у меня уже есть такой аппарат и работает прилично . Покупной полуавтомат стоит дорого , не каждому он по карману , и даже за бывший в употреблении !  Но не это главное , а главное , собрать своими руками !  Можно ткнуть меня носом в уже существующие  и проверенные схемы .   Да , они хороши ! Но не для основной массы народу !  Большая часть желающих , увы , их собрать не сможет , а потому для них нужно что - то попроще , в меру возможного , конечно ... Что - бы это не стало " вещью в себе " , доступной лишь опытным ребятам !  Кто что думает  по данному вопросу ?  Был бы у меня опыт , сам бы взялся , но поскольку его нет , остается апеллировать к аксакалам ! ????????????