Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
алексей байдин
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 11
1

Странная работа кнопок в Протеусе

15.11.2018, 18:32. Просмотров 3875. Ответов 3
Метки нет (Все метки)

Всем привет! Я начинающий. Уже 3-ий вечер не могу разобраться с работой кнопок в Протеусе. Хочу изучить работу команд для lcd 16×2. При симуляции в Atmel Studio 6 всё работает хорошо при пошаговом режиме. А вот при симуляции в Протеусе работает только одна кнопка. На рисунке она "F". Причем заметил, рабочая та кнопка, которая опрашивается последней. Меняя местами байты в массивах potrState и lnputState, соответственно менянтся рабочая кнопка по значениям последних байт. Кто что скажет по такому эффекту...?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*   8-бит шина рабочая!
*/      
 
#include <avr/io.h>
#include <avr/interrupt.h>
//#include <util/delay.h>
#include "lcd_8bit.h"
#include "lcd_comand.h"
 
int i = 0, j = 0;
int counter = 0, THRESHOLD;
 char portState[4] = {0x7F, 0xBF, 0xDF, 0xEF};
char inputState[4] = {0x01, 0x02, 0x04, 0x08};
char key_tab[4][4] = {{'0', '1', '2', '3'},
                      {'4', '5', '6', '7'}, 
                      {'8', '9', 'A', 'B'},
                      {'C', 'D', 'E', 'F'}};
 
bool press = false, pressed = false, unpressed = false; 
bool finih_comand = false;
char temp, simbol;
 
void stroka_1(void)
{
    lcd_dat('H');
    lcd_dat('I');
    lcd_dat('T');
    lcd_dat('A');
    lcd_dat('C');
    lcd_dat('H');
    lcd_dat('I');
}
 
// ******************** сканируем порт B ******************** 
void scan_button()  
{
  for(i=0; i<4; i++)
    {
      PORTB = portState[i];
      for(j=0; j<4; j++)
        {
          if(((PINB&inputState[j]) == 0))
            {
                press = true;         // фиксируем момент нажатия
                temp = key_tab[i][j];  // записываем код клавиши
            }
          else
            {
                press = false;  // нет нажатия кнопки
                temp = 0x10;    // число, меньшее кода символа
            }
        }
    }
     //temp_A = 0x30;   // это строка для отладки(чтоб был символ)
}
 
 
//***********************************************************************       
ISR (TIMER0_OVF_vect)
{ 
  //counter = 0x64;     // ЭТО ДЛЯ ОТЛАДКИ !!!!!!!!!!!!!!!!!!!!!!
    if (!press)         // нет в прошлом фиксации нажатия кнопки, выполняем сканирование
      scan_button();        //PINB кнопка нажата - press = true, temp_B = код кнопки
    if (press && (!pressed))        
     {
        unpressed = false; 
        if (counter >= THRESHOLD) 
            {
              counter = 0;      // время антидребезга прошли
              scan_button();
              if (press)
               {
                 pressed = true;    
                 simbol = temp;
               }               
            }             
        else
            {   
              counter++;    // увеличиваем счётчик антидребезга
            }
     }
if (finih_comand & (!unpressed))
    {// команда кнопки выполнена и кнопка всё ещё нажата     
     // ждём отжатия кнопки
      scan_button();
          if (!press)
            {
               pressed = false; 
               unpressed = true;        // кнопка отжата
            }
    }           
}
 
 
int main(void)
{
    DDRA = 0xF0;
    PORTA = 0x0F;
    DDRB = 0xF0;        // "1" выход, "0" вход. 
    PORTB = 0xFF;       // "1" на выходе, вход подтянут к питанию.
    DDRC = 0x03;
    PORTC = 0xFC;
    DDRD = 0xFF;        
    PORT_LCD = 0x00;    
    THRESHOLD = 50;         // время задержки антидребезга
    pause(TIME);            // пауза на включение ЖКИ
    lcd_init();             // Инициализация ЖКИ
    lcd_com(lcd_home);
    lcd_com(lcd_blink_on);
    stroka_1();
            
    TIMSK = (1 << TOIE0);
    TCCR0 = ((1 << CS01)|(1 << CS00));
    //TCCR0 = (1 << CS01);  
    sei();  
    while(1)            //Вечный цикл
    {   
      if (simbol > 0x10)
        {
        //lcd_dat('T');  
          comand_lcd();     // команда кнопок порта B
        }
         
/*    if (simbol > 0x10)
        {
          comand_lcd();   // команда кнопок порта A
        }   */
     
    }
 return 1;
}
0
Миниатюры
Странная работа кнопок в Протеусе  
Вложения
Тип файла: rar LCD_Hello_world_8bit.rar (46.8 Кб, 0 просмотров)
Тип файла: txt new 1.txt (3.3 Кб, 1 просмотров)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2018, 18:32
Ответы с готовыми решениями:

Странная работа таймера на ATTiny2313
Добрый чего там у вас. Запускаю обычный таймер1 с предделителем 8. в прерывании переполнения...

[решено]Странная работа порта.
контроллеры Мега32 и мега16 (в двух корпусах, то есть разные контроллеры) язык Си, Amel Studyo 6 ...

Странная работа АЦП Attiny13A
Доброе время суток. Затеял тут один девайсик залудить. Заюзал Attiny13A-PU. PWM, прерывания, все...

PIC16F628A и USART (не работает в протеусе)
Итак, задача простейшая... (Ну я совсем новичок еще... :laughing:) 1) Послать байт на мк с...

Все работает в Протеусе, а в железе не хочет
Всем доброго времени суток. Есть прошивка для atmega16, она работает в протеусе, но в железе...

3
pyzhman
782 / 477 / 65
Регистрация: 15.05.2012
Сообщений: 2,689
16.11.2018, 06:58 2
Лучший ответ Сообщение было отмечено алексей байдин как решение

Решение

C
1
 for(j=0; j<4; j++)
n. Считали очередную (не последнюю) кнопку. Она оказалась нажатой. Поместили ее в temp.
n+1. Читаем следующую. Она не нажата. Ну и засовываем в temp 0х10.
________
Это не эффект. Это неверно составленный алгоритм.
Кстати, в протеусе есть модель keypad. Для телефона, для калькулятора и для еще чего-то.
И не мешало бы подтянуть в вашей схеме младшие биты порта В к питанию. Оно понятно, что программная подтяжка. Но бывают случАи.
0
алексей байдин
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 11
16.11.2018, 09:55  [ТС] 3
Как же всё просто... В очередной раз спасибо!
0
pyzhman
782 / 477 / 65
Регистрация: 15.05.2012
Сообщений: 2,689
16.11.2018, 11:02 4
Пожалуйста.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2018, 11:02

оценка загрузки процессорного времени мк в протеусе
пользуюсь протеусом второй раз, обычно все в железе тестирую. заметил интересную штуку: при запуске...

При симуляции UARTa в протеусе выдает "ИИИИИИИИ..."
Собрал схемку: тини и виртуальный порт, написал простой код, как в статье для начинающих, но при...

Функции в Протеусе работают а в железе (Atmega128a) нет
Имею AtmelStudio 7, Протеус 7, и программу написанную на С++. В Протеусе работает. Загружаю в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru