Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 24.11.2012
Сообщений: 5
1

Intel8051: ассемблер, кнопки, индикаторы

29.05.2013, 21:49. Показов 2661. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
доброго времени суток) появилась задача: программирование контроллера клавиатуры из 16 кнопок (4×4), код кнопки выводится на двухразрядный семи сегментный индикатор. все это на основе микросхемы intel8051.
к задаче прилагался нерабочий код. путем изменений получилось вот так:

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
ORG 0000H   ; смещение при загрузке кода будет равно 0
    LJMP    SBROS   ; переход на сброс
 
    ORG 000BH   ; смещение на 11 байт
    LJMP    TIME_00 ; переход на обработку переполнения таймера
 
    ORG 0100H   ; пропускаем первые 256 байт, которые отводятся под блок PSP
    
DIGITS: DB  03fh,06h,05bh,04fh,066h,06dh,07dh,07h,07fh,06fh ; цифры на индикаторе от 0 до 9
 
SBROS:  CLR TCON.4      ; остановка таймера 
    MOV R3, #00H    ; обнуляем R3
    MOV TMOD, #1    ; запускаем т/с в режиме таймера
    MOV P1, #00H    ; обнуляем P1
    MOV P3, #00H    ; обнуляем P3 
 
START:  CLR A   ; очищаем аккумулятор
    CLR C   ; обнуляем флаг переноса
    MOV R5, #10H    ; Нач. значение для перебора строк
    MOV R1, #004H   ; счетчик декрементов при вычислении смещений регистра строк
 
; CJNE - сравнивает значения первых двх операндов и выполняет ветвление, если операнды не равны   
READ_ROW:   CJNE    R4, #0, READ_ROW;  проверка не нажата ли предыдущая кнопкаMOV A, R5
    RRC A   ; Сдвиг содержимого аккумулятора вправо. седьмой бит = С
    JC  START   ; если установлен перенос (с=1), переход на метку старт    
    DEC R1  ; уменьшаем R1 - прошла обработка одной строки, переход на следующую
    MOV R5, A   ; в R5 помещаем следующую строку
    MOV P0, R5  ;подсветка очередной строки
 
    MOV A, P1   ;считывание столбцов 
    JZ  READ_ROW    ; переход, если содержимое аккумулятора равно 0
    
 
    MOV R4, #1      ; нажата ли кнопка в данной строке
    MOV DPTR, #DIGITS
 
    MOV R2, #0      ;счётчик инкрементов для вычисления номера столбца   
NEXT:   INC R2
    RRC A   ; Сдвиг содержимого аккумулятора вправо через флаг переноса
    JNC NEXT    ; если установлен перенос, переход на метку next
    ; JB - если бит равен нулю. вычисление первой цифры номера кнопки
    JB P1.0, OUT1_0      
        JB P1.1, OUT1_0
        JB P1.3, OUT1_1
        JB P1.2, OUT1_0
 
OUT1_1: MOV P2, #00000110B ; код единицы
    LJMP    OUT2
OUT1_0: MOV P2, #00111111B ; код нуля
 
OUT2:   MOV A, R1       ;вычисление второй цифры номера кнопки
    MOV B, #004H    ; число смещений
    MUL AB
    DEC R2
    ADD A, R2
 
    MOVC    A, @A+DPTR  ; загружает аккумулятор константой из памяти программы
    MOV P3, A   ; выдает константу в индикатор - P3
    
    MOV TH0, #76
    MOV TL0, #01
    MOV IE, #10000010B  ;   прерывания разрешены для T/C0
    SETB    TCON.4
    LJMP    READ_ROW
 
TIME_00:    INC R3  ;обработки прерывания по переполнению таймера 0
    CJNE    R3, #20, CYCLE  ;ожидание 1 сек
 
    CLR TCON.4      ;остановка таймер 0
    MOV P2, #0      ;погашение индикатора порта 2
    MOV P3, #0      ;погашение индикатора порта 3
    MOV R4, #0      ;сброс флажка индикации предыдущей кнопки
    MOV R3, #00H
CYCLE:  RETI
 
    END
при запуске программы происходит опрос клавиатуры построчно. но если кнопка нажата, ничего, к сожалению, не происходит соответственно, не получается определить какая именно кнопка нажата, чтобы вывести ее номер на индикатор..
помогите, кто чем может)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2013, 21:49
Ответы с готовыми решениями:

Инициализация кнопки на PIC16F874 ассемблер
Доброго всем времени суток. Я в программировании - новичок. Необходимо реализовать в ассемблере...

Edsim51( Intel8051) АЦП
Добрый день! Ввод информации с АЦП и его запись. Кто может помочь почему не работает до конца не...

Edsim51( Intel8051) Keypad
Доброго времени суток! Появился такой вопрос, скан-код нажатой клавиши и ASCII это одно и тоже?...

Edsim51( Intel8051) Keypad
Доброго времени суток,вопрос такой. Может кто то объяснить как происходит опрос Keypad и как...

Разъём на мат. плате (индикаторы и кнопки)
Приветствую. Вопрос таков что за разъём MSG ? в инете кое-где написано что это индикатор питания,...

0
29.05.2013, 21:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2013, 21:49
Помогаю со студенческими работами здесь

не могу подключить к материнке ECS NFORCE4-A939 кнопки включения и индикаторы
Помогите плиз немогу подключить кнопки включения, перезагрузки, индикаторы к материнки!! материнка...

СМА Indesit IWB5083(CSI)/Y, не реагирует на кнопки, через 3-4 хаотично мигают индикаторы
Всем добрый день. Попалась в ремонт данная СМА с модулем Аркадия, при включении Сма в розетку не...

Как складывать числа с переполнением на intel8051
Проблема следующая, нужно вычислить сумму например 240 + 45, а потом к этому числу в данном случае...

Переход от ассемблера Atmega к ассемблеру Intel8051
Доброго времени суток Подскажите пожалуйста, как правильно перевести код ассемблера для ATmega...

[intel8051] Реализовать подпрограммы на ассемблере для сложения, вычитания, умножения 32 разрядных чисел
Реализовать три подпрограммы (вызываемые с помощью команды call), принимающие в качестве аргументов...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru