Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Дисплеи и индикация » Как сдвинуть данные по типу " бегущая строка"


Как сдвинуть данные по типу " бегущая строка"

Сообщений 1 страница 10 из 10

1

Всем здрасте. Расскажу предисторию. Есть стелка возле аптеки с информационным табло, на нем всего одна надпись "аптека" , которая появляется с разными эффектами. сдвигается влево, вправо,вверх,вниз,крутятся буквы, ссыпаются сверху и тд , ну и показывают температуру и время. Так вот  мне захотелось попробовать повторить, я только начал , и начал со сдвига текста вверх и вниз , это было нетрудно сделать,но вот с третьим эффектом сразу загвоздка не смог сдвинуть текст по принципу бегущей строки, просмотрел весь интернет , из реально того что может помочь нашел только "бегущая строка" "моджет" который выкладывал "Radan" с моджетом вообще дебри ничего не понял , в строке немного попроще , но как там реализован сдвиг , тоже не разобрался . Если не трудно подскажите как реализовать сдвиг. Вот набросок моей программы.

Код:
$regfile = "m8def.dat"
$crystal = 1000000

Dim A As Byte
Dim I As Byte
Dim W As Integer
Dim S As Byte
Dim D As Byte

Config Portd = Output
Config Portb = Output
Ddrb = &B00000000

W = 0
S = 0

Do

If W = 50 Then
W = 0
      If S = 7 Then
      S = 0
      Ddrb = &B00000000
      Else
      S = S + 1
    End If
 Else
  W = W + 1
    End If

For I = 0 To 7
Waitms 12

Ddrb = &B00000000

D = Lookup(i , Ind21)



A = Lookup(i , Ind14)

Rotate A , Right , S

Shiftout Portd.0 , Portd.2 , A , 1




A = Lookup(i , Ind13)
Rotate A , Right , S
Shiftout Portd.0 , Portd.2 , A , 1

A = Lookup(i , Ind12)
Rotate A , Right , S
Shiftout Portd.0 , Portd.2 , A , 1

A = Lookup(i , Ind11)
Rotate A , Right , S
Shiftout Portd.0 , Portd.2 , A , 1

A = Lookup(i , Ind1)
Rotate A , Right , S
Shiftout Portd.0 , Portd.2 , A , 1


Pulseout Portd , 1 , 5

Ddrb = D



Next
Loop







Ind1:
Data &B11111111
Data &B10111101
Data &B10111101
Data &B10000001
Data &B10111101
Data &B10111101
Data &B11000011
Data &B11111111














Ind11:
Data &B11111111
Data &B10011101
Data &B11101101
Data &B11110001
Data &B11001101
Data &B10111101
Data &B10111101
Data &B11111111


Ind12:
Data &B11111111
Data &B11000011
Data &B10111101
Data &B10111101
Data &B10111101
Data &B10111101
Data &B11000011
Data &B11111111

Ind13:
Data &B11111111
Data &B10111101
Data &B10111101
Data &B10111101
Data &B10111101
Data &B10111101
Data &B10000001
Data &B11111111

Ind14:
Data &B11111111
Data &B10101011
Data &B11111111
Data &B11111111
Data &B11111111
Data &B11111111
Data &B11111111
Data &B11111111

Ind21:
Data 1
Data 2
Data 4
Data 8
Data 16
Data 32
Data 64
Data 128
Data 1
Data 2
Data 4
Data 8
Data 16
Data 32
Data 64
Data 128

В этом коде у меня происходит циклический сдвиг символа , но строго в одном квадрате 8*8 , а не от начала до конца табло.

0

2

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

0

3

Но люди делают же бегущие строки и в баском в том числе  строка Radana  но я никак не могу понять как там реализован сдвиг , затер до дыр , но много чего не  понятно , хотя бы принцип реализации понять.

0

4

Принцип сдвига для бегущей строки.

Каждый сам ищет свои способы реализации.

Я решил это дело так:
1) Создаём цикл с количеством проходов, равный длине текста.
При этом к тексту нужно добавить пустые символы в конце и начале, по количеству знакомест. Иначе ваш текст будет появлятся сразу на всю строку, а не медленно выезжать.
Ну и пропадать тоже будет сразу, а не медленно уезжать.

2) Далее заполняем наш массив со знакогенератора. Массив должен иметь размерность (К =1)*8, где К = количество знакомест. Если знакомест 8, берём 9 символов с текста строки.

3) Далее организуем ещё один цикл с количеством проходов 8.
В каждой итерации мы обращаемся к массиву в такой последовательности:
1. 0-63
2. 1-64
3. 2-65
4. 3-66
5. 4-67
6. 5-68
7. 6-69
8. 7-70
Выключаем все ключи строк, Заполняем регистры первой строки Вычитываем нулевой байт в вычитанной последовательности массива, включаем ключ строки, делаем небольшую задержку.
Далее для всех остальных строк так же, только берём 1-й, 2-й и т.д. байты.
Когда все строки были заполнены, следующая итерация.

4) В результате этого вся строка сдвинется попиксельно на один символ. Далее вычитываем следующий блок теста, но уже со сдвигом на один символ. И повторяем всё с пункта 2.

5) Не знаю, смог ли объяснить доступно, но в любом случае, нужно разрисовать на бумаге, что вы хотите сделать и как это можно получить. Успехов!

0

5

Если чесно не совсем все понял. Как раз таки загвоздка в том  как заставить баском убрать первый байт , или начать считать со второго байта.
Вот  есть у меня нижняя строка , например вот такая:
01101100   11000011  11111111  01010101
как сделать так чтобы он послал их 74HC595 в такой последовательности
1- 01101100   11000011  11111111  01010101
2- 1101100   11000011  11111111  01010101
3- 101100   11000011  11111111  01010101
4- 01100   11000011  11111111  01010101
5- 1100   11000011  11111111  01010101
ну и так далее

0

6

Mrshilov
Как я понял вы предлогаете создать строковую переменную типа STRING "01010101 10000001 00001111 11110000" , если так то это не проблемма и сдвинуть текст тоже не проблемма , но как его вытащить из массива в таком виде чтобы запихнуть в 74hc595 . Я могу вытаить из строки начиная со второго символа , но у меня получается так snring1="10101011"  дальше переменная=val(srting1) но это пулучается как целое число , а не как 8 битов , а вытасквать по 1 биту и этого числа слишком большой код получится.

0

7

Что то тихо по моему вопросу :( А у меня мозг уже вскипел придумывать , как же это можно сделать :) Но вот что то получилось, оцените , подскажите может что то не так . Все то работает , но мне кажется что слишком загружаемая программа для процессора, а там неизвестно , ведь у меня всего 5 букв и при этом работает четко. Единственное что как писал Radan , то что нужно пробелы сначала и с конца делать , чтобы текст плавно появлялся и уходил плавно , я не стал пока над этим заморачиватся и просто добавил пробелы только в конец.

Код:
$regfile = "m8def.dat"
$crystal = 1000000

Dim A As Byte
Dim I As Byte
Dim W As Integer
Dim S As Byte
Dim D As Byte
Dim Da As String * 255
Dim Das As String * 1
Dim Dsq As Byte
Dim M As Byte
Dim Ms As Byte
Dim Ss As Byte
Dim Tm As Byte



Config Portd = Output
Config Portb = Output
Ddrb = &B00000000

Sh_cp Alias Portd.2                                         'нога для тактовых импульсов
Ds Alias Portd.0                                            'нога для вывода данных
St_cp Alias Portd.1                                         'нога защелкивания


Do                                                          'кол-во чтения = кол-ву строк
If S = 8 Then S = 0
                                                             '
For I = 1 To 5                                              '
M = I * 8                                                   ' записываем в строку М ряд из маммива DATA
M = M + S                                                   '  м=1 первый рад
A = Lookup(m , Ind1)                                        ' м=2 второй ряд и тд
Da = Da + Bin(a)                                            '


Next

Da = Da + "1111111111111111111111111111111111111111"        'добовляем в конец строки пробелы чтобы надпись плавно уезжала
Ms = Ss + 40
Incr S
For W = Ss To Ms                                            'записываем в 74hc595 биты из строки
'W = W + S
Das = Mid(da , W , 1)
Dsq = Val(das)
St_cp = 0                          'выставляем ногу в режим записи данных

Ds = Dsq                                                    'выставляем  бит записи
Sh_cp = 0                          'даем импульс на тактовый выход
Sh_cp = 1

Next


Decr S
St_cp = 1
Incr S
Da = ""
Ddrb = Lookup(s , Ind21)
'Next
'End If
If Tm = 20 Then                                             'задерка здвига пикселя
If S = 8 Then Ss = Ss + 1                                   'подпрограмма сдвига символа на SS пикселей
Tm = 0

Else
Tm = Tm + 1

End If
If Ss = 40 Then Ss = 0
Loop







Ind1:
Data 255                                                    '0
Data 255                                                    '0
Data 255                                                    '0
Data 255                                                    '0
Data 255                                                    '0
Data 255                                                    '0
Data 255                                                    '0
Data 255
'a
Data 255
Data 195                                                   '0
Data 189                                                    '1
Data 189                                                    '2
Data 129                                                    '3
Data 189                                                    '4
Data 189                                                    '5
Data 189                                                    '6
Data 255                                                    '7


'k
 Data 255
 Data &B10111001
 Data &B10110111
 Data &B10001111
 Data &B10110011
 Data &B10111101
 Data &B10111101
 Data &B11111111

'o
Data 255                                                    '16
Data 195                                                    '17
Data 189                                                    '18
Data 189                                                    '19
Data 189                                                    '20
Data 189                                                    '21
Data 195                                                    '22
Data 255                                                    '23

'Ind13:
'п
Data 255                                                    '24
Data 129                                                    '25
Data 189                                                    '26
Data 189                                                    '27
Data 189                                                    '28
Data 189                                                    '29
Data 189                                                    '30
Data 255                                                    '31

'Ind14:
'...
Data 255                                                    '32                                            '33
Data 255                                                    '34
Data 255                                                    '35
Data 255                                                    '36
Data 255                                                    '37
Data 255
Data &B10101011                                                     '38
Data 255                                                    '39

Ind21:
Data 0
Data 1
Data 2
Data 4
Data 8
Data 16
Data 32
Data 64
Data 128
Data 1
Data 2
Data 4
Data 8
Data 16
Data 32
Data 64
Data 128

0

8

Трудно понять авторский код...
Трудно читать чужие мысли...

Я сейчас стараюсь давать всем переменным названия, по которым не нужно бегать и смотреть что значит Das, Da или Dsq...
Или хотя бы их прокомментировать нужно.
Через время сами запутаетесь в своём коде, хотя я тоже так начинал писать.
И наиболее употребляемыми переменными у меня были QWERTY и QAZ  :D

Например:
Nextsimb - следующий символ
Runstring - текст бегущей строки

0

9

radan
Да я понимаю вас , и запутывался не один раз уже, делаю так только в то время когда пишу и отлаживаю работу , по окончанию всегда меняю на понятные иначе если забросить на пару недель програму а потом к ней вернутся , придется заново разбиратся уже в свеей писанине :) , просто когда пишешь сначала не хочется прописывать переменные которые состоят из нескольких букв , да и поскольку еще не профи приходится много эксперементировать с кодом поэтому когда приходит мысль по быстрому добавил переменную для пробы, у меня так после написания бывает по 10 лишних переменных. Вот переделал и прокоментировал.

Код:
$regfile = "m8def.dat"
$crystal = 1000000

Dim A As Byte
Dim I As Byte
Dim W As Integer
Dim Stroki As Byte                                          'количество строк
Dim D As Byte
Dim Massbits As String * 255                                'строковый массив хранения блока данных(бит) букв
Dim Das As String * 1                                       'строка хранения нужного бита из Massbits
Dim Readbit As Byte                                         'считаный бит из строки
Dim Masblock As Byte                                        'переменная блока данных массива букв
Dim Ms As Byte                                              'доп переменная для ститывания данных из блока DATA
Dim Sdvig As Byte                                           'переменная сдвига битов
Dim Temp As Byte                                            'скорость строки



Config Portd = Output
Config Portb = Output
Ddrb = &B00000000

Sh_cp Alias Portd.2                                         'нога для тактовых импульсов
Ds Alias Portd.0                                            'нога для вывода данных
St_cp Alias Portd.1                                         'нога защелкивания


Do                                                          'кол-во чтения = кол-ву строк
If Stroki = 8 Then Stroki = 0
                                                             '
For I = 1 To 5                                              '
Masblock = I * 8                                            ' записываем в строку М ряд из маммива DATA
Masblock = Masblock + Stroki                                '  м=1 первый рад
A = Lookup(masblock , Ind1)                                 ' м=2 второй ряд и тд
Massbits = Massbits + Bin(a)                                '


Next

Massbits = Massbits + "1111111111111111111111111111111111111111"       'добовляем в конец строки пробелы чтобы надпись плавно уезжала
Ms = Sdvig + 40
Incr Stroki
For W = Sdvig To Ms                                         'записываем в 74hc595 биты из строки
'W = W + S
Das = Mid(massbits , W , 1)
Readbit = Val(das)
St_cp = 0                                                   'выставляем ногу в режим записи данных

Ds = Readbit                                                'выставляем  бит записи
Sh_cp = 0                                                   'даем импульс на тактовый выход
Sh_cp = 1

Next


Decr Stroki
St_cp = 1
Incr Stroki
Massbits = ""
Ddrb = Lookup(stroki , Ind21)
'Next
'End If
If Temp = 20 Then                                           'задерка здвига пикселя
If Stroki = 8 Then Sdvig = Sdvig + 1                        'подпрограмма сдвига символа на SS пикселей
Temp = 0

Else
Temp = Temp + 1

End If
If Sdvig = 40 Then Sdvig = 0
Loop







Ind1:
Data 255                                                    '0
Data 255                                                    '0
Data 255                                                    '0
Data 255                                                    '0
Data 255                                                    '0
Data 255                                                    '0
Data 255                                                    '0
Data 255
'a
Data 255
Data 195                                                    '0
Data 189                                                    '1
Data 189                                                    '2
Data 129                                                    '3
Data 189                                                    '4
Data 189                                                    '5
Data 189                                                    '6
Data 255                                                    '7


'k
 Data 255
 Data &B10111001
 Data &B10110111
 Data &B10001111
 Data &B10110011
 Data &B10111101
 Data &B10111101
 Data &B11111111

'o
Data 255                                                    '16
Data 195                                                    '17
Data 189                                                    '18
Data 189                                                    '19
Data 189                                                    '20
Data 189                                                    '21
Data 195                                                    '22
Data 255                                                    '23

'Ind13:
'п
Data 255                                                    '24
Data 129                                                    '25
Data 189                                                    '26
Data 189                                                    '27
Data 189                                                    '28
Data 189                                                    '29
Data 189                                                    '30
Data 255                                                    '31

'Ind14:
'...
Data 255                                                    '32                                            '33
Data 255                                                    '34
Data 255                                                    '35
Data 255                                                    '36
Data 255                                                    '37
Data 255
Data &B10101011                                             '38
Data 255                                                    '39

Ind21:
Data 0
Data 1
Data 2
Data 4
Data 8
Data 16
Data 32
Data 64
Data 128

0

10

Так что , никто так и не скажет пойдет такой код или слишком загруженный будет.

0


Вы здесь » Программирование ATMEL в BASCOM. » Дисплеи и индикация » Как сдвинуть данные по типу " бегущая строка"