Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 17.05.2021
Сообщений: 3
1

Задача. Бегущая строка на PIC(16f877)

17.05.2021, 21:00. Показов 424. Ответов 6
Метки нет (Все метки)

Доброго времени суток, уважаемые форумчане! Есть задача, создать бегущую строку с основными требованиями:
1. Индикация динамическая
2. Число знакомест >10
3. Данные считаются уже зашитыми в память МК. Сообщение должно выводится при нажатии на кнопку. ( аля подключили 3 кнопки и на нажатие каждой выводит определенное сообщение)
4. Сообщение должно состоять из 20+- символов, включая пробелы
5. Код asm, без Си.
И самая загвоздка, что не должны использоваться любые аппаратные решения, аля max7219, сдвиговых регистров и тд.
Т.е. тупая задача. Нужно взять допустим память типо 24с64, при необходимости. Зашить в нее там 5 сообщений. Сделать 5 кнопок, и при нажатии на одну из них выводится определенное сообщение( брать 24с64 не обязательно впринципе просто для примера)
PIC16f877 не обязателен тоже, но как по мне он оптимален. LCD нельзя
Итак. Я не прошу делать всю работу за меня конечно же, я уважаю время каждого, но буду очень рад если мне помогут разрешить проблемы с которыми я столкнулся.
Первое. Хотел делать изначально на матричных индикаторах, но без дешифраторов, сдвиговых регистров, драйверов можно реализовать там 2 матрицы 8х8.. Повторюсь, весь алгоритм индикации должен быть в МК. Если я просто не разобрался, и есть варианты как подключить больше 2-3 матриц без всяких приблуд, буду благодарен!
Суть:
Решил взять семисегментные. PORTB,C,D Позволяют подключить порядка 14, если учитывать еще подключение в ПОРТуБ 24С64.
Индикация выполняется через прерывания ( нашел примерный код ), сам пытался делать через паузы, понял что бегущая через паузы это гиблое дело.
Да, с прерываниями я могу просто вручную задать "по тупому" каждый сдвиг вручную прописывая значения для каждого знакоместа. Но хотелось бы понять как реализовать вывод по человечески в цикле и как реализовать считывание определенного сообщения. Т.е. хочу нажать на кнопку и чтобы начало выводится уже предзаписанное сообщение с помощью какого-либо цикла Простите там за тавтологию.
И еще одно, должны быть кнопки аля "+" и " -" которые должны регулировать скорость строки. Но это уже позже.

PS/Всем выделившим время огромное спасибо.

Код программы, исходник и proteus8 схема для 4 индикаторов прилагаю.

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
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
          #include <P16F877A.INC>
            LIST        p=16F877A    ; 
           
                                    ; 
            
Sec           equ         20h  ;
Sec1          equ         21h   ; 
Sec2          equ         22h   ;
datind1       equ         23h   ;
datind2       equ         24h    ;
datind3       equ         25h
datind4       equ         26h    ;
shet          equ         27h
W_TEMP        equ         7Eh
STATUS_TEMP   equ         7Fh    ;
 
test            equ         28h
 
 
#DEFINE       ind1  PORTA,0
#DEFINE       ind2  PORTA,1
#DEFINE       ind3  PORTA,2
#DEFINE       ind4  PORTA,3
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Реализация динамической индикации для 4-х семисегментных индикаторов
;Частота тактового генератора для примера 4 МГц, машинный цикл 1 мкс
 
              org         0000h           ;начать выполнение программы с адреса 0000h
                clrf test
              movlw       .4    ;
              movwf       test        ;
 
              goto        Start           ;переход на метку Start
           
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Подпрограмма обработки прерываний
 
              org         0004h           ;начать выполнение подпрограммы с адреса 0004h
       
              movwf       W_TEMP          ;сохранение значений ключевых регистров
              swapf       STATUS,W        ;
              clrf        STATUS          ;
              movwf       STATUS_TEMP     ;
                                          ;   
              bcf         ind1            ;выключение 1-го индикатора
              bcf         ind2            ;выключение 2-го индикатора
              bcf         ind3            ;выключение 3-го индикатора
              bcf         ind4            ;выключение 4-го индикатора
                                          ;
              incf        shet,F          ;инкремент регистра shet
              movlw       .5              ;проверка содержимого регистра shet
              xorwf       shet,W          ;на равенство числу 5
              btfss       STATUS,Z        ;
              goto        met1            ;число в регистре shet не равно 5
              movlw       .1              ;число в регистре shet равно 5: запись числа 1
              movwf       shet            ;в регистр shet
                                          ;
met1          movlw       .1              ;проверка содержимого регистра shet
              xorwf       shet,W          ;на равенство числу 1
              btfss       STATUS,Z        ;
              goto        met2            ;число в регистре shet не равно 1: переход на met2
              movf        datind1,W       ;число в регистре shet равно 1: копирование 
              movwf       PORTB           ;содержимого регистра datind1 в регистр PORTB
              bsf         ind1            ;включение 1-го индикатора
              goto        exxit           ;переход на метку exxit
met2          movlw       .2              ;проверка содержимого регистра shet
              xorwf       shet,W          ;на равенство числу 2
              btfss       STATUS,Z        ;
              goto        met3            ;число в регистре shet не равно 2: переход на met3
              movf        datind2,W       ;число в регистре shet равно 2: копирование 
              movwf       PORTB           ;содержимого регистра datind2 в регистр PORTB 
              bsf         ind2            ;включение 2-го индикатора
              goto        exxit           ;переход на метку exxit
met3          movlw       .3              ;проверка содержимого регистра shet
              xorwf       shet,W          ;на равенство числу 3
              btfss       STATUS,Z        ;
              goto        met4            ;число в регистре shet не равно 3: переход на met4 
              movf        datind3,W       ;число в регистре shet равно 3: копирование 
              movwf       PORTB           ;содержимого регистра datind3 в регистр PORTB
              bsf         ind3            ;включение 3-го индикатора
              goto        exxit           ;переход на метку exxit
met4          movf        datind4,W       ;копирование содержимого регистра datind3
              movwf       PORTB           ;в регистр PORTB
              bsf         ind4            ;включение 4-го индикатора
                                          ;
exxit         bcf         INTCON,T0IF     ;сброс флага прерывания по переполнению TMR0
              movlw       .100            ;запись числа 156 в регистр таймера TMR0
              movwf       TMR0            ;
                                          ;
              swapf       STATUS_TEMP,W   ;восстановление содержимого ключевых регистров
              movwf       STATUS          ;
              swapf       W_TEMP,F        ;
              swapf       W_TEMP,W        ;
                                          ;
              retfie                      ;выход из подпрограммы прерывания
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Основная программа
                                 
             
Start         movlw       b'00000000'
              movwf       PORTB
              movlw       b'00000000'
              movwf       PORTA
              ;movlw       b'00000111'
             ; movwf       CMCON
 
              bsf         STATUS,RP0        
              movlw       b'00000000'          
              movwf       TRISB
              movlw       b'11110000'          
              movwf       TRISA
              
                                          ;запись двоичного числа 11010011 в регистр
              movlw       b'11010011'     ;OPTION_REG, тем самым устанавливаем внутренний
              movwf       OPTION_REG      ;источник тактового сигнала для TMR0
              bcf         STATUS,RP0      ;включаем предделитель перед TMR0
                                          ;устанавливаем коэффициент предделителя 1:16
                                          ;
              clrf        shet            ;обнуление регистра shet, перед запуском 
                                          ;прерываний по переполнению TMR0, выполняется
                                          ;однократно, после включения питания
                                          ;
              clrf        datind1        ;очистка регистров вывода информации на 
              clrf        datind2        ;индикаторы, равнозначно выключению
              clrf        datind3        ;индикаторов, так как индикаторы с общим
              clrf        datind4        ;катодом
                                          ;
              bcf         INTCON,T0IF     ;сброс флага прерывания по переполнению TMR0
              bsf         INTCON,T0IE     ;разрешение прерываний по переполнению TMR0
              bsf         INTCON,GIE      ;разрешение глобальных прерываний 
                                          ;
 
;//---------------------------------------------------------ВЫВОД----------------------------------------------------
m1            movlw       b'10111111'     ;Вывод нулей на индикаторы
              movwf       datind1        ;
              movwf       datind2        ;
              movwf       datind3        ;
              movwf       datind4        ;
                                    
              call        pause
 
 
 
              goto        m1
;//---------------------------------------------------------ВЫВОД----------------------------------------------------
pause         movlw       .6              ;запись числа 6 в регистр Sec2
              movwf       Sec2
p4            movlw       .218            ;запись числа 218 в регистр Sec1
              movwf       Sec1
p3            movlw       .255
              movwf       Sec             ;запись числа 255 в регистр Sec
p2            decfsz      Sec,F           ;декремент с условием регистра Sec
              goto        p2              ;регистр Sec не равен нулю: переход на метку p2
              decfsz      Sec1,F          ;регистр Sec равен нулю: декремент с условием
                                          ;регистра Sec1
              goto        p3              ;регистр Sec1 не равен нулю: переход на метку p3
              decfsz      Sec2,F          ;регистр Sec1 равен нулю: декремент с условием
                                          ;регистра Sec2
              goto        p4              ;регистр Sec2 не равен нулю: переход на метку p4
              return                      ;регистр Sec2 равен нулю: выход из подпрограммы         ;
                                          ;
 
;//-----------------------------------Знакогенератор ( почему то работает не корректно) перескакивает не на тот символ постоянно
tablica                 ;Таблица выборки для индикатора !!!с общим АНОДОМ!!! Точка нам не нужна, везде гасим
                            
;   andlw   0x0F            ;Маскируем ненужные биты (чтобы случайно не выскочить за предел таблицы)
    addwf   PCL,f           ;Прибавляем значение аккумулятора к счетчику команд PCL. Тем самым выполняя смешение в таблице 
    retlw   b'11000000';0   
    retlw   b'11111001';1   ;В соответствии со схемой определяем к какой ножке порта В какой сегмент подключен.
    retlw   b'10100100';2   
    retlw   b'01001111';3   
    retlw   b'10011001';4   
    retlw   b'10010010';5   
    retlw   b'10000010';6   
    retlw   b'11111000';7   
    retlw   b'10000000';8   
    retlw   b'10010000';9   
    retlw   b'11111111';+
    retlw   b'10111111';-
    retlw   b'11111111'     ;A
    retlw   b'11111111'     ;B
    retlw   b'11111111'     ;C
    retlw   b'11111111'     ;D
    retlw   b'11111111'     ;E
    retlw   b'11111111'     ;F
              end                         ;конец всей программы
0
Вложения
Тип файла: rar Ishodniki.rar (23.8 Кб, 2 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2021, 21:00
Ответы с готовыми решениями:

Разработка ПО для PIC 16F877, обеспечивающего двухсторонний обмен данными по интерфейсу RS232
на приеме байта зацикливается на двух строках btfss PIR1, RCIF ; ожидание окончания приема...

Холодильник Whirlpool FRAA36AF20/2 858616211010, Pic 16F877
Добрый вечер, пожалуйста, если кто-нибудь знает, могут ли эти панели рядом друг с другом...

Апплет "бегущая строка", найти ошибку, строка не останавливается и бежит по второму кругу
Заранее извиняюсь если не туда написал, суть вопроса: у меня стоит задача написать апплет, в...

Бегущая строка
Подскажите как сделать в аудиплеере бегущую строку(чтоб там показывал название песни и исполнитель)...

6
964 / 591 / 97
Регистрация: 15.05.2012
Сообщений: 3,482
18.05.2021, 08:23 2
Цитата Сообщение от Dima_Steep Посмотреть сообщение
Решил взять семисегментные
А как же буквы? Или в бегущей строке цифры и более менее читабельные на семисегментнике знаки?
Цитата Сообщение от Dima_Steep Посмотреть сообщение
Число знакомест >10
Пусть знакоместо 5х7. Тогда с учетом разделителя между знаками нужно восемь матриц.
Цитата Сообщение от Dima_Steep Посмотреть сообщение
PIC16f877 не обязателен тоже
Можно и на логике 155 собрать, не вопрос.
Цитата Сообщение от Dima_Steep Посмотреть сообщение
не должны использоваться любые аппаратные решения
А как насчет тока через светодиоды матриц? Буферы можно использовать?
Цитата Сообщение от Dima_Steep Посмотреть сообщение
Есть задача
Бюджет заложен?
0
0 / 0 / 0
Регистрация: 17.05.2021
Сообщений: 3
18.05.2021, 09:17  [ТС] 3
Бюджета нет. Просто тупо задача. Матрицы решил не брать, ибо не знаю как без сдвиговых регистров Аля 74hc595, дешифраторов и драйверов типо max7219 подключить к тому же пик16ф877 хотя бы 8 матриц. Буду рад, если подскажете. Ещё раз сама индикация должна быть реализована программно в МК. . 7сегментные меня тоже устроят если что. Интересует как можно реализовать вывод сообщения. С кнопкой я уж разберусь, а вот как зашить какое то сообщение. В массив там какой или ещё куда и через цикл при нажатии на кнопку считать и вывести в виде бегущей строки не особо понимаю. Хотя бы алгоритм понять..
0
964 / 591 / 97
Регистрация: 15.05.2012
Сообщений: 3,482
18.05.2021, 10:00 4
Цитата Сообщение от Dima_Steep Посмотреть сообщение
индикация должна быть реализована программно в МК
Откуда такое условие?
0
2593 / 1869 / 406
Регистрация: 11.09.2009
Сообщений: 6,937
18.05.2021, 10:31 5
Цитата Сообщение от Dima_Steep Посмотреть сообщение
не должны использоваться любые аппаратные решения
Что-то светящееся - это уже аппаратное решение, в микроконтроллерах ничего такого нет.
А если допускается навешивание хотя бы светодиодов, значит допускаются и цепи управления ими.
Не морочьте людям головы, начните с составления вменяемого задания.
0
0 / 0 / 0
Регистрация: 17.05.2021
Сообщений: 3
18.05.2021, 12:06  [ТС] 6
Не правильно немного выразился, простите. Использовать аппаратные решения типо дешифраторов для управления индикаторами нельзя. Немного поспешил когда оформлял топик. Обязательно все поправлю.

Добавлено через 10 минут
Ещё раз просто вкратце. Простая задача, без необходимости разработки реального устройства. Есть МК, есть индикатор, есть там 5 кнопок. Нажимаю первую кнопку на индикацию выводится первое сообщение в виде бегущей строки. Вторую, второе.. использовать аппаратные дешифраторы для управления индикаторами запрещено. Число знакомест 10-14. Число символов в сообщении 20+-. Lcd дисплей нельзя.

Добавлено через 1 час 15 минут
Нужен примерный алгоритм или код как это реализовать.
0
2593 / 1869 / 406
Регистрация: 11.09.2009
Сообщений: 6,937
18.05.2021, 15:21 7
Цитата Сообщение от Dima_Steep Посмотреть сообщение
Нужен примерный алгоритм или код
Вопрос неправильный.
Сначала нужно продумать схему вашей "бегущей строки с числом знакомест > 10" и схему её подключения к контроллеру.
Когда прочувствуете, сколько выводов управления потребуется иметь контроллеру, и нарисуете схему "без дешифраторов, регистров и т.п.", можно будет говорить об "алгоритме и коде".
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.05.2021, 15:21

Бегущая строка
Здравствуйте Помогите пожалуйста, мне нужен пример чтоб осмыслить как делать бегущую строку, типа...

Бегущая строка
Подскажите пожалуйста как смотрит янденкс на бегущую строку, ключевые слова и ссылки в ней? Буду...

Бегущая строка
В этой программе строка действительно бежит справа налево. Но есть одно непонятное явление. Когда...

Бегущая строка
Надоел уже наверно, но нужна помощь с еще одной задачкой) Нужно чтобы слово(символ) перемещалось...

Бегущая строка
Как с помощью php реализовать бегущую строку. Главное, чтобы текст строки был записан в отдельный...

Бегущая строка.
Здравствуйте, помогите пожалуйста дописать программу для светодиодной матрицы. Нужно написать код,...


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

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

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