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);         
}

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


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

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

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


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

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

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

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

Понятно?

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

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


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

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

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


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

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

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

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

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


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

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

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


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

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

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


  • Сообщения

    • Дык макет же, на чистовую лампы надо будеть отодвинуть от ТС. Пусть пока с этими поиграет, надо обстоятельно его послушать с разніми нагрузками - мож тогда и на бублики перейдём
    • В целом - нормально. Но для меди по-больше бы VDI. Хотя зависит от степени её окисленности. Глубину бы по-ближе к 30 см - вообще было бы хорошо. Попробуйте по феррита перекалиброваться. Может с VDI поможет.
    • Василичь! Прописано в ГОСТе. Смотри выше, надоело повторяться. А про сотни фирм - так приводят, Василичь, приводят. Я, только вчера - сегодня выложил данные и Magnat, и Dinaco, и Luxman, и  McIntosh. У всех написагно 1% или менее. А ты, как слепой. Кроме своих картинок ничего не видишь. Ты, Василичь, как репродуктор на стенке. Ему что не говори, а он своё - Начинаем утреннюю зарядку.   Василичь! Ну, хоть народ не смеши. Я упомянул Luxman MQ-3600, McIntosh MC75,  Magnat RV 1, Dynaco ST-70. И привёл их параметры. Кто из них шарманка типа ресивер транзисторная? Ей Богу, глядя на тебя понимаешь - с возрастом далеко не ко всем приходит мудрость. Иных посещает иное. Ты много и долго говорил. Как всегда, не о том. Мне ужасно интересно немного другое. Ты тут сказал Василичь! Умоляю! Поясни мне, что такое в 0,1 раза  всего. С картинками на 3 экрана, с красными стрелками, ну, как ты любишь. Правда, не понимаю я твоей математики. Как понять - если при 250 милливатт мощности уровень гармоник равен уровню шума? С каких делов он равен? Откуда 71 дБ? Просто сложили котов с табуретками? Было 2 цифры 46 и 25 дБ. Что с ними делать? Только сложить. Ну, не вычитать же. Нет там ступеньки. Там Pure Class A на этих мощностях. Это, если угодно, рекламный трюк. Способ привлечь внимание к низким искажениям усилителя в большом диапазоне мощностей. 
    • Предлагаю четвертый вариант: скачать и почитать вот эту книжку.
    • предлагаю третий вариант : щупы на выводы индуктивности, осцил - триггер по напряжению
    • Конечно изначально контролирую ток через лампы по контрольным резисторам, хотя по большому счету разве существенна разница есть резисторы, 1ом, 10 ом или их нет мы то все равно видим  по мультиметру (только разное положение переключателя диапазонов измерений) какой ток течет через лампу, можно и без резисторов и по падению на сопротивлении обмотки по закону ома посчитать,  а "0"  в милливольтах мы все равно видим между анодами выходных ламп если схема симметрична, или снова я не правильно понимаю? Прошу сильно не ругать, я только учусь. Ведь потому и пишу, что ставлю лампы с разным током (проверенные) с обмотками у которых разное сопротивление и в итоге при такой "установке" ноль между анодами и получается при минимальной разности по сопротивлениям (хорошая симметрия?) на подстроечных и постоянных (фазоинвертор) резисторах по искажениям и одинаковом токе через лампы на контрольных 10ом (70-75мА) резисторах, а если я ставлю лампы с одинаковым током (установлено по одной точке при подборе) то ток разный через лампы получается и настройка проходит трудней.
    • "Правов" нет, но навык вождения, всякого самобеглого, имеется. Сказалась буйная молодость, сельхоз десанты и картофельные командировки на месяц, когда в технаре обучался. Велик не брошу, он гораздо пользительнее "белоруса".  И соляру не жрёть.