3 / 2 / 1
Регистрация: 28.03.2020
Сообщений: 92

[mcs-51] Инкремент счетчика нажатий кнопки SW15, и декремент счетчика при нажатии кнопки SW16

11.04.2021, 22:32. Показов 2202. Ответов 12

Студворк — интернет-сервис помощи студентам
Реализовать программу, которая при нажатии кнопки SW15 добавляет их каждое нажатие ((Lich) = (Lich) +1), а при нажатии кнопки SW16 отнимает каждое из них ((Lich) = (Lich) -1, если Lich> = 1). Каждое нажатие выводится на статический индикатор лабораторного стенда.
SW15 - P3.2
SW16 - P3.3
Ниже код программы которая добавляет каждое количество нажатий.
csubb - подпрограмма которая будет отнимать каждое из нажатий.

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


Assembler
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
Name Lab_9_4
N EQU 1
Const_TH0 EQU high(65536 - 6144)
Const_TL0 EQU low(65536 - 6144)
CSEG AT 0x00
    MOV R0, #0x7F
    CLR A
L1:
    MOV @R0, A
    DJNZ R0, L1
    MOV TMOD, #0x01
    SETB TR0
    CLR  A
    
    MOV R3, #1
    MOV R7, #0x00
    MOV R6, #0x00
    
L_ADD:      
    JNB P3.2, $
        
    MOV R5, #N
    CALL Delay10
    call cadd
         
    JC L_END
 
    JB  P3.2, $
    MOV R5, #0x01
    CALL Delay10
    JB  P3.2, $
    JMP L_ADD
        
Delay10:
    MOV R5, #N
  
LZ2:
    MOV TH0, #Const_TH0
    MOV TL0, #Const_TL0
LZ1:
    JNB TF0, LZ1
    CLR TF0
    DJNZ R5, LZ2
    RET
 
cadd:
    MOV A,  R7
    ADD A,  #1
    DA A
    MOV R7, A
        
    MOV A,  R6
    ADDC    A,  #0
    DA A
    MOV R6, A
    MOV DPTR, #0xA000
    MOVX @DPTR, A
    MOV A,  R7
    MOV DPTR, #0xB000
    MOVX @DPTR, A
    ret
    
    
csubb:
    MOV A,  R7
    SUBB    A,  #1
    DA A
    MOV R7, A
        
    MOV A,  R6
    SUBB    A,  #0
    DA A
    MOV R6, A
    MOV DPTR, #0xA000
    MOVX @DPTR, A
    MOV A,  R7
    MOV DPTR, #0xB000
    MOVX @DPTR, A
    ret
    
 
 
L_END:
    END
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.04.2021, 22:32
Ответы с готовыми решениями:

Увеличение счетчика на единицу при нажатии кнопки
Помогите с кодом плиз.Думаю все понятно объясню.Если вы знаете игру cookie clicker,там при нажатие на кнопку покупается один обгрейд,грубо...

[MICROCAP] Схема счетчика нажатий кнопки
Доброго времени суток! Помогите, пожалуйста, с заданием. Необходимо разработать схему электрическую счётчика количества последовательных...

Как при нажатии и удерживании кнопки сделать непрерывное, а не однократное изменение счетчика
Подскажите, пожалуйста, как можно сделать аналог JSpinnera, но используя 2 кнопки. То есть, при нажатии на одну кнопку происходит не...

12
1184 / 659 / 113
Регистрация: 15.05.2012
Сообщений: 4,073
12.04.2021, 07:30
По состоянию нужного бита в порту.
0
3 / 2 / 1
Регистрация: 28.03.2020
Сообщений: 92
12.04.2021, 09:33  [ТС]
pyzhman, можете пожалуйста привести пример проверки бита?
0
1184 / 659 / 113
Регистрация: 15.05.2012
Сообщений: 4,073
12.04.2021, 14:32
http://www.gaw.ru/html.cgi/txt... t_re18.htm
0
3 / 2 / 1
Регистрация: 28.03.2020
Сообщений: 92
12.04.2021, 14:50  [ТС]
pyzhman,

По кнопке SW15(INT0) увеличивает счетчик, по SW16(INT1) не уменьшает..
В чем ошибка?

Assembler
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
N EQU 1
Const_TH0 EQU high(65536 - 6144)
Const_TL0 EQU low(65536 - 6144)
CSEG AT 0x00
MOV R0, #0x7F
CLR A
L1:
  MOV @R0, A
  DJNZ R0, L1
  MOV TMOD, #0x01
  SETB TR0
  CLR  A
 
  
  MOV  R7,  #0x00
  MOV  R6,  #0x99
 
start:
    JNB P2.2,   L_SUBB
 
L_ADD:
  JNB IE0, L_ADD
L4:
  MOV R5, #N
  CALL Delay10
  JNB IE0, L4
  
  MOV  A,  R7
  ADD  A,  #1
  DA A
  MOV  R7,  A
  
  MOV  A,  R6
  ADDC  A,  #0
  DA A
  MOV  R6,  A
  
  MOV DPTR, #0xa000
  MOVX @DPTR, A
  MOV A,   R7
  MOV DPTR, #0xB000
  MOVX @DPTR, A
  
L5:
  JB IE0, L5
  MOV R5, #0x01
L6:
  CALL Delay10
  JB IE0, L6
  JMP start
  
  
 
 
L_SUBB:
  JNB IE1, L_SUBB
L44:
  MOV R5, #N
  CALL Delay10
  JNB IE1, L44
  
  MOV  A,  R7
  SUBB  A,  #1
  MOV   R3, A
  DA A
  MOV  R7,  A
  
  MOV  A,  R6
  SUBB  A,  #0
  DA A
  MOV  R6,  A
  
  MOV DPTR, #0xa000
  MOVX @DPTR, A
  MOV A,   R7
  MOV DPTR, #0xB000
  MOVX @DPTR, A
  MOV   B,  R3
  MOV   R7, B
  
L55:
  JB IE1, L55
  MOV R5, #0x01
L66:
  CALL Delay10
  JB IE0, L66
  JMP start
  
  
Delay10:
  MOV R5, #N
  
LZ2:
  MOV TH0, #Const_TH0
  MOV TL0, #Const_TL0
LZ1:
  JNB TF0, LZ1
  CLR TF0
  DJNZ R5, LZ2
  RET
  END
0
Модератор
1230 / 662 / 290
Регистрация: 10.11.2019
Сообщений: 1,392
12.04.2021, 15:43
da a работает только с командами сложения. Для вычитания нужен другой код.
0
3 / 2 / 1
Регистрация: 28.03.2020
Сообщений: 92
12.04.2021, 16:27  [ТС]
qbfan,
сделал подпрограму для вычитания, работает для чисел > 0.
Как ее обьединить с предыдущим кодом, и сделать условие при котором при нажатии кнопки SW15 будет работать L_ADD, а при нажатии кнопки SW16 - L_SUBB?

Assembler
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
L_SUBB:
  MOV  R7,  #10
  MOV  R6,  #10
 
L_SUBB_1:
 
 
  MOV  A,  R7
  SUBB  A,  #1
  JC    L5
  MOV  R3,  A
  
 
  MOV B, #10
  DIV AB
  SWAP A
  MOV  @R1, B
  XCHD A,  @R1
 
  MOV DPTR, #0xB000
  MOVX @DPTR, A
  
  MOV  A,  R6
  MOV B, #10
  DIV AB
  SWAP A
  MOV  @R1, B
  XCHD A,  @R1
  MOV DPTR, #0xA000
  MOVX @DPTR, A
  MOV  A,  R3
  MOV  R7,  A
  JMP L_6
 
 L5:
  MOV  R7,    #0x63
  MOV  A,    R7
  MOV B, #10
  DIV AB
  SWAP A
  MOV  @R1, B
  XCHD A,  @R1
  
  MOV DPTR, #0xB000
  MOVX @DPTR, A
  
  MOV  A,  R6
  SUBB  A,  #1
  MOV  R4,  A
  MOV B, #10
  DIV AB
  SWAP A
  MOV  @R1, B
  XCHD A,  @R1
 
  MOV DPTR, #0xA000
  MOVX @DPTR, A
  MOV  A,  R4
  MOV  R6,  A
  MOV  A,  R7
  MOV  R7,  A
  
 L_6:
  JMP L_SUBB_1
  RET
0
Модератор
1230 / 662 / 290
Регистрация: 10.11.2019
Сообщений: 1,392
12.04.2021, 19:31
Assembler
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
CSEG    AT 0
    ORG 0
    JMP START
    ORG 26H
start:  nop ; добавьте сюда запуск таймера, если надо
    call cntzero
mainloop:call cntshow
; правильно ли я понял - клавиша отпущена=1, нажата=0 ?
    call delay10 ; ожидать отпускания 2 клавиш (две 1)
    mov C,p3.2
    anl C,p3.3
    jz mainloop
m2: mov C,p3.2     ; ожидать нажатия хотя бы 1 клавиши (1 0 или 0 1)
    anl C,p3.3
    jnz m2
    jnb p3.2,pressed0
    jnb p3.3,pressed1
    jmp mainloop
pressed0:call cntadd1
    jmp mainloop
 
pressed1:call cntsub1
    jmp mainloop
 
delay10:mov R4,#4 ; сделайте здесь ожидание по таймеру, если надо
    mov R5,#0
wt: djnz R5,wt
    djnz R4,wt
    ret
 
; обнулить счетчик
cntzero:mov R6,#0 ; старший байт
    mov R7,#0 ; младший байт
    ret
 
; прибавить к счетчику 1
cntadd1:mov a,R7 ; младший байт
    add a,#1
    da a     ; десятичная коррекция
    mov R7,a
 
    mov a,R6 ; старший байт
    addc a,#0
    da a     ; десятичная коррекция
    mov R6,a
    ret
 
; показать счетчик на дисплее
cntshow: mov dptr,#0B000h
    mov a,R6  ; старший байт
    movx @dptr,a
    mov dptr,#0A000h
    mov a,R7 ; младший байт
    movx @dptr,a
    ret
 
; отнять от счетчика 1
cntsub1:clr C
    mov a,R7 ; младший байт
    subb a,#1
    call dasub ; десятичная коррекция после вычитания
    mov R7,a
    mov a,R6 ; старший байт
    subb a,#0
    call dasub ; десятичная коррекция  после вычитания
    mov R6,a
    ret
 
; Это коррекция только для вычитания 1, а не для любого вычитаемого
dasub:  cjne a,#0FFh,das1 ; упрощенная коррекция a=#FFh ?
    mov a,#99h        ; да, присвоить a #99h ...
    setb C            ; и установить C
    ret
das1:   push acc
    anl a,#0Fh        ; младшая цифра=#0Fh ?
    cjne a,#0Fh,das2
    pop acc
    clr C             ; да - сбросить C и установить мл цифру #9 (15-6=9)
    subb a,#6
    ret
das2:   pop acc
    clr C
    ret
 
        end
0
3 / 2 / 1
Регистрация: 28.03.2020
Сообщений: 92
12.04.2021, 19:43  [ТС]
qbfan, наоборот , клавиша нажата - P2.(2)3. = 1, отпущена - 0
0
Модератор
1230 / 662 / 290
Регистрация: 10.11.2019
Сообщений: 1,392
13.04.2021, 09:44
Assembler
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
CSEG    AT 0
    ORG 0
    JMP START
    ORG 26H
start:  nop ; добавьте сюда запуск таймера, если надо
    call cntzero
mainloop:call cntshow
; клавиша отпущена=0, нажата=1 ?
    call delay10 ; ожидать отпускания 2 клавиш (два 0)
    mov C,p3.2
    orl C,p3.3
    jnz mainloop
m2: mov C,p3.2     ; ожидать нажатия хотя бы 1 клавиши (1 0 или 0 1)
    orl C,p3.3
    jz  m2
    jb  p3.2,pressed0
    jb  p3.3,pressed1
    jmp mainloop
pressed0:call cntadd1
    jmp mainloop
 
pressed1:call cntsub1
    jmp mainloop
 
; и далее без изменений
0
3 / 2 / 1
Регистрация: 28.03.2020
Сообщений: 92
13.04.2021, 11:15  [ТС]
qbfan, не реагирует на нажатие кнопок
0
Модератор
1230 / 662 / 290
Регистрация: 10.11.2019
Сообщений: 1,392
13.04.2021, 12:38
наоборот , клавиша нажата - P2.(2)3. = 1, отпущена - 0
Есть другие сведения от других студентов, вы всё-таки уточните.
Попробуйте в начале прграммы сделать:

Assembler
1
2
start:  setb P3.2 ; установить пины в режим чтения
          setb P3.3
0
Модератор
1230 / 662 / 290
Регистрация: 10.11.2019
Сообщений: 1,392
13.04.2021, 19:12
Лучший ответ Сообщение было отмечено ivan2020ua как решение

Решение

Я нашел ощибку в своём коде. Идея простая, сначала с помоью флага C ожидаем отпускания
обеих клавиш, а потом - нажатия на одну клавишу. Но условные переходы я написал неверно,
сказалась привычка писать под другие процессоры:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CSEG    AT 0
    ORG 0
    JMP START
    ORG 26H
start:  nop ; добавьте сюда запуск таймера, если надо
    call cntzero
mainloop:call cntshow
; клавиша отпущена=0, нажата=1 ?
    call delay10 ; ожидать отпускания 2 клавиш (два 0)
    mov C,p3.2
    orl C,p3.3
    jC  mainloop ; а не z !!!
m2: mov C,p3.2     ; ожидать нажатия хотя бы 1 клавиши (1 0 или 0 1)
    orl C,p3.3
    jnC  m2       ; а не z !!!
    jb  p3.2,pressed0
    jb  p3.3,pressed1
    jmp mainloop
 
; далее без изменений
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.04.2021, 19:12
Помогаю со студенческими работами здесь

[mcs-51] Подсчитать нажатия кнопки SW15
подсчитать нажатия кнопки SW15 от 0 до 9999, и вывести на статический индикатор ( 0xA000 -2 левых разряда, 0xB000-2 правых) У меня...

Инкремент при нажатии кнопки
Есть приложение, которое отображает значение в поле таблицы БД SQL Server. Нужно при нажатии кнопки увеличивать на +1 значение поля. ...

Инкремент счетчика в определенном интервале при каждом обновлении
Кто мне подскажет как мне получить в JavaScripte например взял 1до 500 цифры и кажды раз я буду обнавлять будет +1 например обнавил 2...

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

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


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

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

Новые блоги и статьи
Непрерывная интеграция для пакета Python
Mr. Docker 22.06.2025
Было 4 часа утра пятницы, когда я выпустил новую версию нашей внутренней библиотеки для обработки данных. Релиз 0. 5. 2 содержал небольшой фикс для обработки дат в ISO формате, что может пойти не так?. . .
Продвинутый ETL на C# из OLTP БД в хранилище
stackOverflow 22.06.2025
Работая в сфере корпоративной аналитики, я постоянно сталкиваюсь с одним и тем же - нужны чистые, структурированные и, главное, свежие данные. Без них современные аналитические системы, машинное. . .
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru