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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Дисплеи и индикация » Драйвер MAX7219 для светодиодных матриц 1088


Драйвер MAX7219 для светодиодных матриц 1088

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

1

Саша, я бы вывод строк оформлял по аналогии вот с этими исходниками: 16x8 LED dot matrix with MAX7219 module.

Как всегда использую Notepad++ для сборки и отладки проекта:

http://img.radiokot.ru/files/4453/thumbnail/92gd1ycqx.png

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

Архив: DM1088_20140129.zip (~60 Мб)

Там в архиве есть исходники из приведённой выше ссылки (в папке doc). Интерфейс модуля DotMatrix предназначен для вывода спрайтов (поточечных изображений) на набор матричных модулей разной длины. Я раньше с MAX7219 не работал, поэтому трудно сразу завести примеры. У меня где-то есть ошибки как при портировании исходников, так и, возможно, в согласовании их со схемой в Proteus. Я выбрал ATbanned6, т.к. думал, что проблема в мк, когда возникали ошибки компиляции. На самом деле нужно было более полно настраивать программный SPI, указав вывод для Din. Сейчас всё компилируется, но не работает.

Постепенно буду этот пример дорабатывать. Для работы с изображением используется буфер, где хранятся так называемые спрайты (кусочки изображений). Спрайт состоит из указания размеров первыми двумя цифрами и столбцами с данными. Набор данных честно взят из исходников проекта для Ардуины (нужно будет потом переделать таблицу для русского языка).

0

2

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

0

3

Новая версия проекта: DM1088_20140130. Индикация работает, теперь нужно доработать функции рисования на индикаторе. Я сделал несколько тестов для примера, но код ещё нужно дорабатывать.

Что касается красивого отображения бегущей строки, то так просто её не сделать. Выводы индикаторов расположены так, что соединить вместе модули не получится. А программно реализовывать функцию перевёртывая накладно, т.е. max7219 пишет по столбцам только.

+1

4

Работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

http://s8.uploads.ru/t/fP4Sy.jpg http://s9.uploads.ru/t/aKVGg.jpg


А почему так?:

' Строб записи.
Sub Dotmatrix_writestrobe

   ' Формируем короткий строб записи.
    Set Dm_load

    $asm
        NOP
    $end Asm

    Reset Dm_load

End Sub

а не так?:

' Строб записи.
Sub Dotmatrix_writestrobe

   ' Формируем короткий строб записи.
    Set Dm_load
    NOP
    Reset Dm_load

End Sub

Отредактировано sasha_1973 (2014-01-31 06:42:24)

0

5

Да, тоже вариант. Саша, убери в настройках IDE переформатирование кода. Среда портит моё форматирование и имена переменных (Enviromnent\Editor, две галочки напротив слов Reformat).

Там в коде ещё нужно поколдовать с выводом точки, рисует на одну строку ниже, чем должно быть. Потом нужно переделать кодовую страницу и разрисовать русский алфавит. Для этого можно воспользоваться поточечным изображением символов, взятых из драйвера HD44780. Там они тоже имеют размер 5х8. Порядок символов в таблице нужно сделать в соотв-вии с кодовой страницей CP-1251. В оригинальном коде первые 32 символа пропускаются. Наверное, чтобы места сэкономить. Эта поправка потом учитывается в DotMatrix_PutChar().

Ещё нужно доработать код, чтобы его поведение зависело от количества матричных индикаторов. Сейчас у меня жёстко привязано к 5 шт, хотя при инициализации нужно указывать их количество.
В общем, работы много ещё.

0

6

Саша, могу дать задание по созданию русского шрифта для вывода на эти матричные индикаторы. Ниже показана картинка, как это выглядит на примере заглавной буквы "А".

http://img.radiokot.ru/files/4453/thumbnail/94joojklb.png

Вот буква "А" в псевдографике, созданная по картинке:

Код:
'0 .***.
'1 *...*
'2 *...*
'3 *...*
'4 *****
'5 *...*
'6 *...*
'7 .....

http://s8.uploads.ru/t/5yvut.jpg

Кодируем её в код:

Код:
Data 5, 8, &B01111110, &B00010001, &B00010001, &B00010001, &B01111110 ' А

Это данные спрайта (маленькой картинки из точек): ширина, высота, столбцы данных. "Верх" буквы у данных справа, судя по уже имеющейся и работающей таблице.

Я тебе пришлю текстовой файл с заготовкой таблицы, нужно будет её по аналогии продолжить. Комментарии справа соответствуют порядку букв в верхней части CP1251. Нужно брать букву по порядку, найти её вид на картинке выше (русскую или латинскую), нарисовать в псевдографике, а потом закодировать столбцами. Сможешь?

Отредактировано uni (2014-01-31 17:57:02)

0

7

Доделали? исходниками можете поделиться?

0

8

Поделитесь, пожалуйста, примером работы вот с таким модулем, где микросхемы MAX7219 соединены последовательно.

http://s7.uploads.ru/t/w7WT4.jpg

0

9

kokosh написал(а):

Поделитесь, пожалуйста, примером работы вот с таким модулем, где микросхемы MAX7219 соединены последовательно.

Здесь

+1

10

Что-то не то...

http://sh.uploads.ru/t/6eQ4v.jpg

0

11

Сборка другая (корявая). :D

0

12

Здравствуйте! Нужна помощь.
Есть ли у кого готовый исходник или проект на один сегмент Dot matrix 8x8?
http://s3.uploads.ru/UJt8Q.jpg
Нужно просто выводить циферную индикацию B1,1,2,3,4,5,6,7,8.9
Просто индикация без бегущей строки.

В нете ничего подобного не нашел, есть на 4 - 5 - 10 сегментов.
Нужен на один сегмент 8х8.
Заранее благодарен.

0

13

Newmayer написал(а):

В нете ничего подобного не нашел, есть на 4 - 5 - 10 сегментов. Нужен на один сегмент 8х8.

По ссылке sasha_1973 Исследование MAX7219 (SPI драйвер 7seg led индикаторов) в самом низу страницы есть "Похожие темы"...
Там не копались ?

А так, навскидку, сложнее будет увеличить количество разрядов индикации, чем уменьшить... ;)

0

14

Nord написал(а):

сложнее будет увеличить количество разрядов индикации, чем уменьшить

Угу, было где пораскинуть мозгами. :)

0

15

Сделал вот так:

Код:




$regfile = "m16def.dat"
$crystal = 4000000
$hwstack = 32
$swstack = 32
$framesize = 40
$baud = 9600

Ddrc = &B11111111
Ddra = &B11111111

config PORTD.7 =input
portd.7=1

Dim W as byte
dim d0(8) as Byte
dim dt as byte

'dim d as byte


'd = 0
w = 1

do

   if pind.7 = 0 then
      incr w
      if w = 9 then w = 1
      waitms 300
   end if

   gosub f1



   select case w
      case 1 : restore d1
      case 2 : restore d2
      case 3 : restore d3
      case 4 : restore d4
      case 5 : restore d5
      case 6 : restore d6
      case 7 : restore d7
      case 8 : restore d8
   end select


   portc=&B00000001
   porta=d0(1)
   waitus 20
   portc=&B00000010
   porta=d0(2)
   waitus 20
   portc=&B00000100
   porta=d0(3)
   waitus 20
   portc=&B00001000
   porta=d0(4)
   waitus 20
   portc=&B00010000
   porta=d0(5)
   waitus 20
   portc=&B00100000
   porta=d0(6)
   waitus 20
   portc=&B01000000
   porta=d0(7)
   waitus 20
   portc=&B10000000
   porta=d0(8)
   waitus 20


loop
end

f1:

   for dt = 1 to 8
      read d0(dt)
   next dt
   'd =1

return
end

d1:
   Data &B11100011, &B11000111, &B11000111, &B11100111, &B11100111, &B11100111, &B11100111, &B11000011

d2:
   Data &B11000011,&B10111101,&B10111001,&B11110011,&B11100111,&B11001111,&B10011101,&B10000001

d3:
   Data &B11000011,&B10011001,&B10011001,&B11110011,&B11111001,&B10011001,&B10011001,&B11000011

d4:
   Data &B10011001,&B10011001, &B10011001, &B10011001,&B11000001,&B11111001,&B11111001,&B11111001

d5:
   Data &B10000001,&B10011101,&B10011111,&B11000011,&B11111001,&B10011001,&B10011001,&B11000011

d6:
   Data &B11000011,&B10011101,&B10011111,&B10000011,&B10011101,&B10011101,&B10011101,&B11000011

d7:
   Data &B10000001,&B10011101,&B10011101,&B11111011,&B11110111,&B11101111,&B11001111,&B11001111

d8:
   Data &B11111001,&B11110001,&B11110001,&B11111001,&B10001001,&B11111001,&B11111001,&B11110001


если есть вариант по проще, буду рад

есть ли возможность интегрировать этот код для модуля Arduino 8x8?

Готовый

Для генерирования циферок использовал этот сайт:
Генератор LED 8x8

Отредактировано Newmayer (2018-10-22 18:37:50)

0

16

Тема давнешняя, но популярная. Не найти оригинал. Тогда нарисовал "жирные" цифры, и попросил Александа сделать переход при изменении числа. Сверху вниз переход из предидущего, в новое. Все абсолютно четко работает. Хочу добавить секунды(еще одну матрицу). Как раз хватает для шрифта 5х8. Но не прописать к готовой теме 7х8. Блужу в циклах.
Часть кода только индикации.

Код:
$nocompile

'===============================================================================
  Sub Очистить_screen_buffer_word()
'-------------------------------------------------------------------------------
    Local Temp_byte As Byte

    For Temp_byte = 1 To Const_amount_columns
        Screen_buffer_word(temp_byte) = 0
    Next Temp_byte
'-------------------------------------------------------------------------------
  End Sub
'===============================================================================

'===============================================================================
  Sub Scrol_sumbols(byval Copy_name_font As String * 10)
'-------------------------------------------------------------------------------
    Local Count_bit_column As Byte , Count_column As Byte , Count_sumbol As Byte , Code_sumbol As Byte
    Local Count_column_sumbol As Byte , Data_column_sumbol As Byte , Count_sumbol_string As Byte
    Local Adres_sumbol_font As Word , Adres_column_font As Word
    Local Sumbol_new_str As String * 1 , Sumbol_old_str As String * 1

    For Count_column = 1 To Const_amount_columns            'От 1 до 8х5(40)
        Screen_buffer_word(count_column) = Screen_buffer_word(count_column) And &B_1111_1111_0000_0000
    Next Count_column

    Count_column = 1

   'Заполняем буфер
    For Count_sumbol_string = 1 To 8                        ' Len(copy_name_font)      'От 1 до 8
        Sumbol_new_str = Mid(time_new_str , Count_sumbol_string , 1)       'Берем по одному символу из нашей строки
        Code_sumbol = Asc(sumbol_new_str)                   'Переводим в ASCII
        Code_sumbol = Code_sumbol - 32                      'Откидываем символы до текстовых


        If Copy_name_font = "Font_5x8" Then
            Adres_sumbol_font = Code_sumbol * 5
        Elseif Copy_name_font = "Font_6x8" Then
            Adres_sumbol_font = Code_sumbol * 6
        Elseif Copy_name_font = "Font_7x8" Then
            Adres_sumbol_font = Code_sumbol * 7
        End If


        For Count_column_sumbol = 0 To 6                    'Ширина символа 7

            If Copy_name_font = "Font_5x8" Then
                Data_column_sumbol = Lookup(adres_sumbol_font , Font_5x8)
            Elseif Copy_name_font = "Font_6x8" Then
                Data_column_sumbol = Lookup(adres_sumbol_font , Font_6x8)
            Elseif Copy_name_font = "Font_7x8" Then
                Data_column_sumbol = Lookup(adres_sumbol_font , Font_7x8)
            End If

            Screen_buffer_word(count_column) = Screen_buffer_word(count_column) + Data_column_sumbol
            Adres_sumbol_font = Adres_sumbol_font + 1
            Count_column = Count_column + 1
        Next Count_column_sumbol                            'For Count_column_sumbol = 0 To 6

        If Count_sumbol_string = 2 Or Count_sumbol_string = 4 Then
          If T = 1 Then
            Count_column = Count_column + 1
            Screen_buffer_word(count_column) = 17408        'двоеточие между символами
            Count_column = Count_column + 1
            Screen_buffer_word(count_column) = 8704
            Count_column = Count_column + 1
            Screen_buffer_word(count_column) = 0
            Count_column = Count_column + 2
          Else
            Count_column = Count_column + 1
            Screen_buffer_word(count_column) = 8704         'двоеточие между символами
            Count_column = Count_column + 1
            Screen_buffer_word(count_column) = 17408
            Count_column = Count_column + 1
            Screen_buffer_word(count_column) = 0
            Count_column = Count_column + 2
          End If
        End If
    Next Count_sumbol_string



   'Крутим в буфере все изменённые символы
    For Count_bit_column = 1 To 8
        Count_column = 1

        For Count_sumbol = 1 To 7                           'For Count_sumbol От 1 до ширина символа 7
            Sumbol_new_str = Mid(time_new_str , Count_sumbol , 1)
            Sumbol_old_str = Mid(time_old_str , Count_sumbol , 1)

            If Sumbol_new_str <> Sumbol_old_str Then
                For Count_column_sumbol = 1 To 7            'От 1 до ширина символа 7
                    Shift Screen_buffer_word(count_column) , Left , 1
                    Count_column = Count_column + 1
                Next Count_column_sumbol
              Else
                Count_column = Count_column + 7             'Количество столбцов + ширина символа 7
            End If

            If Count_sumbol = 2 Or Count_sumbol = 4 Then
                Count_column = Count_column + 4
            End If
        Next Count_sumbol


       Waitms 50

      'Выводим буфер на экран
       Update_screen_max7219_word

    Next Count_bit_column                                   'For Count_bit_column = 1 To 8

'-------------------------------------------------------------------------------
  End Sub
'===============================================================================
'===============================================================================
  Sub Update_screen_max7219_word()
'-------------------------------------------------------------------------------
    Local Tmp_count_matrix_bit As Byte , Tmp_count_str As Byte , Tmp_count_bit As Byte
    Local Tmp_count_column As Byte , Tmp_count_2_column As Byte , Tmp_data_column As Byte

    For Tmp_count_matrix_bit = 0 To 7
        Tmp_count_str = 8 - Tmp_count_matrix_bit
        Tmp_count_column = Const_amount_columns             ' = Количество матриц * Количество столбцов
        Load_max7219_7221 = 0

        Do
            For Tmp_count_bit = 7 To 0 Step -1
                Tmp_count_2_column = Tmp_count_matrix_bit + 8
                Tmp_data_column.tmp_count_bit = Screen_buffer_word(tmp_count_column).tmp_count_2_column
                Decr Tmp_count_column
            Next Tmp_count_bit                              'For Tmp_count_bit = 7 To 0 Step -1

            Call Write_data_max7219_7221(tmp_count_str)
            Call Write_data_max7219_7221(tmp_data_column)

        Loop Until Tmp_count_column = 0

        Load_max7219_7221 = 1
    Next Tmp_count_matrix_bit                               'For Tmp_count_matrix_bit = 0 To 7
'-------------------------------------------------------------------------------
  End Sub
'===============================================================================
'***************************************************************************************************************************
'===============================================================================
  Sub Update_screen_max7219()

    Local Tmp_count_matrix_bit As Byte , Tmp_count_str As Byte , Tmp_count_bit As Byte
    Local Tmp_count_column As Byte , Tmp_data_column As Byte

    For Tmp_count_matrix_bit = 0 To 7
        Tmp_count_str = 8 - Tmp_count_matrix_bit
        Tmp_count_column = Const_amount_columns             ' = Количество столбцов
        Load_max7219_7221 = 0

        Do
            For Tmp_count_bit = 7 To 0 Step -1
                Tmp_data_column.tmp_count_bit = Screen_buffer(tmp_count_column).tmp_count_matrix_bit
                Decr Tmp_count_column
            Next Tmp_count_bit                              'For Tmp_count_bit = 7 To 0 Step -1

            Call Write_data_max7219_7221(tmp_count_str)
            Call Write_data_max7219_7221(tmp_data_column)

        Loop Until Tmp_count_column = 0

        Load_max7219_7221 = 1
    Next Tmp_count_matrix_bit                               'For Tmp_count_matrix_bit = 0 To 7
'-------------------------------------------------------------------------------
  End Sub
'===============================================================================
  Sub Сдвиг_экрана_вниз(byval Copy_кол_сдвигов As Byte , Byval Copy_закольцевать As Byte)

    Local Tmp_byte As Byte
    Local Tmp_цикл_1 As Byte


    For Tmp_цикл_1 = 1 To Amount_columns_buffer_screen
        Tmp_byte = Screen_buffer(tmp_цикл_1)

        Shift Tmp_byte , Left , Copy_кол_сдвигов

        Screen_buffer(tmp_цикл_1) = Tmp_byte
    Next Tmp_цикл_1

    #if Rotation_matrix = 0
        Обновить_экран
      #else
        Update_screen_max7219
    #endif
'-------------------------------------------------------------------------------
  End Sub
'===============================================================================
  Sub Сдвиг_экрана_вверх(byval Copy_кол_сдвигов As Byte , Byval Copy_закольцевать As Byte)

    Local Tmp_byte As Byte
    Local Tmp_цикл_1 As Byte

    For Tmp_цикл_1 = 1 To Amount_columns_buffer_screen
        Tmp_byte = Screen_buffer(tmp_цикл_1)

        Shift Tmp_byte , Right , Copy_кол_сдвигов

        Screen_buffer(tmp_цикл_1) = Tmp_byte
    Next Tmp_цикл_1

    #if Rotation_matrix = 0
        Обновить_экран
      #else
        Update_screen_max7219
    #endif

  End Sub
'===============================================================================
  Sub Сдвиг_экрана_влево(byval Copy_кол_сдвигов As Byte , Byval Copy_закольцевать As Byte)

    Local Tmp_byte As Byte
    Local Tmp_цикл_1 As Byte , Tmp_цикл_2 As Byte , Tmp_цикл_3 As Byte
    Local Tmp_пред_значение As Byte

    If Copy_закольцевать > 0 Then
        Tmp_пред_значение = Screen_buffer(1)
    End If

    For Tmp_цикл_1 = 1 To Copy_кол_сдвигов
        For Tmp_цикл_2 = 1 To Amount_columns_buffer_screen
            Tmp_byte = Screen_buffer(tmp_цикл_2)
            Tmp_цикл_2 = Tmp_цикл_2 - 1
            Screen_buffer(tmp_цикл_2) = Tmp_byte
            Tmp_цикл_2 = Tmp_цикл_2 + 1
        Next Tmp_цикл_2
    Next Tmp_цикл_1

    If Copy_закольцевать > 0 Then
        Screen_buffer(1) = Tmp_пред_значение
    End If

    #if Rotation_matrix = 0
        Обновить_экран
      #else
        Update_screen_max7219
    #endif

  End Sub
'===============================================================================
  Sub Сдвиг_экрана_вправо(byval Copy_кол_сдвигов As Byte , Byval Copy_закольцевать As Byte)

    Local Tmp_byte As Byte
    Local Tmp_цикл_1 As Byte , Tmp_цикл_2 As Byte , Tmp_цикл_3 As Byte

    For Tmp_цикл_1 = 1 To Copy_кол_сдвигов
        For Tmp_цикл_2 = Amount_columns_buffer_screen To 1 Step -1
            Tmp_byte = Screen_buffer(tmp_цикл_2)
            Screen_buffer(tmp_цикл_2) = 0
            Tmp_цикл_2 = Tmp_цикл_2 + 1
            Screen_buffer(tmp_цикл_2) = Tmp_byte
            Tmp_цикл_2 = Tmp_цикл_2 - 1
        Next Tmp_цикл_2
    Next Tmp_цикл_1

    #if Rotation_matrix = 0
        Обновить_экран
      #else
        Update_screen_max7219
    #endif

  End Sub
'===============================================================================
  Sub Print_точка(byval Copy_x As Byte , Byval Copy_y As Byte , Byval Copy_негат_позитив As Byte)

    Local Tmp_byte As Byte

    Select Case Copy_y
        Case 1 : Copy_y = &B_0000_0001
        Case 2 : Copy_y = &B_0000_0010
        Case 3 : Copy_y = &B_0000_0100
        Case 4 : Copy_y = &B_0000_1000
        Case 5 : Copy_y = &B_0001_0000
        Case 6 : Copy_y = &B_0010_0000
        Case 7 : Copy_y = &B_0100_0000
        Case 8 : Copy_y = &B_1000_0000
    End Select

    If Copy_негат_позитив = 0 Then
        Loadadr Copy_y , X
        !ld R16 , X
        !com R16
        !st X , R16
    End If

    Tmp_byte = Screen_buffer(copy_x)
    If Copy_негат_позитив = 0 Then
        Tmp_byte = Tmp_byte And Copy_y
      Else
        Tmp_byte = Tmp_byte Or Copy_y
    End If
    Screen_buffer(copy_x) = Tmp_byte

    #if Rotation_matrix = 0
        Обновить_экран
      #else
        Update_screen_max7219
    #endif

  End Sub
'===============================================================================
  Sub Print_бегущая_влево_строка(byval Copy_строка As String * 250 , Byval Copy_скорость_сдвига As Byte)

    Local Tmp_byte As Byte
    Local Tmp_длина_строки As Byte
    Local Tmp_цикл_1 As Byte , Tmp_цикл_2 As Byte , Tmp_цикл_3 As Byte
    Local Tmp_символ_str As String * 1

    Tmp_длина_строки = Len(copy_строка)

    For Tmp_цикл_1 = 1 To Tmp_длина_строки

        Tmp_символ_str = Mid(copy_строка , Tmp_цикл_1 , 1 )
        Print_буфер_экрана Tmp_символ_str

        For Tmp_цикл_2 = 1 To Ширина_шрифта

            For Tmp_цикл_3 = 1 To Amount_columns_buffer_screen
                Tmp_byte = Screen_buffer(tmp_цикл_3)
                Tmp_цикл_3 = Tmp_цикл_3 - 1
                Screen_buffer(tmp_цикл_3) = Tmp_byte
                Tmp_цикл_3 = Tmp_цикл_3 + 1
            Next Tmp_цикл_3

            #if Rotation_matrix = 0
                Обновить_экран
              #else
                Update_screen_max7219
            #endif

            Waitms Copy_скорость_сдвига

        Next Tmp_цикл_2

    Next Tmp_цикл_1

   'Выводим пустой экран, чтобы задвинуть выводимый текст
    For Tmp_цикл_1 = 1 To Const_amount_columns

        For Tmp_цикл_2 = 1 To Amount_columns_buffer_screen

            Tmp_byte = Screen_buffer(tmp_цикл_2)
            Tmp_цикл_2 = Tmp_цикл_2 - 1
            Screen_buffer(tmp_цикл_2) = Tmp_byte
            Tmp_цикл_2 = Tmp_цикл_2 + 1

        Next Tmp_цикл_2

        #if Rotation_matrix = 0
            Обновить_экран
          #else
            Update_screen_max7219
        #endif

        Waitms Copy_скорость_сдвига

    Next Tmp_цикл_1

  End Sub
'===============================================================================
  Sub Print_буфер_экрана(byval Copy_строка As String * 20)

    Local Tmp_цикл As Byte
    Local Tmp_длина_строки As Byte
    Local Tmp_данные_столбца As Byte
    Local Tmp_ширина_символа As Byte
    Local Tmp_счетчик_столбцов As Byte
    Local Tmp_счетчик_символов As Byte
    Local Tmp_символ_str As String * 1

    Tmp_длина_строки = Len(copy_строка)
    Tmp_ширина_символа = Ширина_шрифта
    Tmp_счетчик_столбцов = Const_amount_columns

    For Tmp_счетчик_символов = 1 To Tmp_длина_строки

        Tmp_символ_str = Mid(copy_строка , Tmp_счетчик_символов , 1)

        Адрес_выводимой_колонки Tmp_символ_str              'Gosub Расчет_адреса_выводимой_колонки

        For Tmp_цикл = 1 To Tmp_ширина_символа
            Incr Tmp_счетчик_столбцов
            Tmp_данные_столбца = Cpeek(адрес_колонки_в_шрифте)
            Адрес_колонки_в_шрифте = Адрес_колонки_в_шрифте + 1
            Screen_buffer(tmp_счетчик_столбцов) = Tmp_данные_столбца
        Next Tmp_цикл

    Next Tmp_счетчик_символов

  End Sub
'===============================================================================
  Sub Print_строка(byval Copy_строка As String * 20 , Byval Copy_x As Byte)

    Local Tmp_цикл As Byte
    Local Tmp_длина_строки As Byte
    Local Tmp_данные_столбца As Byte
    Local Tmp_ширина_символа As Byte
    Local Tmp_счетчик_столбцов As Byte
    Local Tmp_счетчик_символов As Byte
    Local Tmp_символ_str As String * 1

    Tmp_счетчик_столбцов = Copy_x
    Tmp_ширина_символа = Ширина_шрифта
    Tmp_длина_строки = Len(copy_строка)

    For Tmp_счетчик_символов = 1 To Tmp_длина_строки

        Tmp_символ_str = Mid(copy_строка , Tmp_счетчик_символов , 1)

        Адрес_выводимой_колонки Tmp_символ_str              'Gosub Расчет_адреса_выводимой_колонки

        For Tmp_цикл = 1 To Tmp_ширина_символа
            Incr Tmp_счетчик_столбцов
            Tmp_данные_столбца = Cpeek(адрес_колонки_в_шрифте)
            Адрес_колонки_в_шрифте = Адрес_колонки_в_шрифте + 1

            #if Rotation_matrix = 0
                Print_столбец Tmp_счетчик_столбцов , Tmp_данные_столбца
              #else
                Screen_buffer(tmp_счетчик_столбцов) = Tmp_данные_столбца
            #endif

        Next Tmp_цикл

    Next Tmp_счетчик_символов


    #if Rotation_matrix = 1
        Update_screen_max7219
    #endif

  End Sub
'===============================================================================
  Sub Адрес_выводимой_колонки(byval Copy_символ_str As String * 1)

    Local Tmp_символ_byte As Byte

    Tmp_символ_byte = Asc(copy_символ_str)                  ' Узнаём код символа
    Адрес_символа_в_шрифте = Tmp_символ_byte - 32           ' Первые 32 значения не несут символьных данных
    Адрес_символа_в_шрифте = Адрес_символа_в_шрифте * Размер_блока_шрифта       ' Высчитываем адрес выводимой колонки выводимого символа в программной памяти МК
    Адрес_символа_в_шрифте = Адрес_символа_в_шрифте + 4     ' Сдвигаем полученный адрес на 4 байта в которых содержатся параметры шрифта
    Адрес_колонки_в_шрифте = Адрес_шрифта_word + Адрес_символа_в_шрифте       ' Получаем итоговый адрес выводимой колонки

  End Sub
'===============================================================================
  Sub Загрузить_шрифт(byval Copy_имя_шрифта As String * 10)

    If Copy_имя_шрифта = "Font_5x8" Then
        Loadwordadr Font_5x8
    Elseif Copy_имя_шрифта = "Font_6x8" Then
        Loadwordadr Font_6x8
    Elseif Copy_имя_шрифта = "Font_8x8" Then
        Loadwordadr Font_8x8
    End If


    !sts {Адрес_шрифта_word} , R30
    !sts {Адрес_шрифта_word + 1} , R31

    !lpm R16 , Z+
    !sts {Высота_шрифта} , R16
    !lpm R16 , Z+
    !sts {Ширина_шрифта} , R16
    !lpm R16 , Z+
    !sts {Размер_блока_шрифта} , R16
    !lpm R16 , Z+
    !sts {Шрифт_true_type} , R16

    Кол_столбцов_в_шрифте = Размер_блока_шрифта / Высота_шрифта
    Блок_символа = Высота_шрифта                            ' * 8
    Shift Блок_символа , Left , 3                           'Умножение на 8
    Блок_символа = Блок_символа - 1

  End Sub
'===============================================================================
  Sub Очистить_экран()

    Local Tmp_очистить_экран As Byte

    For Tmp_очистить_экран = 1 To Const_amount_columns      'От 1 до количества столбцов
        Print_столбец Tmp_очистить_экран , 0
    Next Tmp_очистить_экран

  End Sub
'===============================================================================
  Sub Очистить_буфер_экрана()

      Local Temp_byte As Byte

      For Temp_byte = 1 To Amount_columns_buffer_screen
          Screen_buffer(temp_byte) = 0
      Next Temp_byte

  End Sub
'===============================================================================
  Sub Обновить_экран()

    Local Tmp_обновить_экран As Byte

    For Tmp_обновить_экран = 1 To Const_amount_columns      'От 1 до количества столбцов
        Print_столбец Tmp_обновить_экран , Screen_buffer(tmp_обновить_экран)
    Next Tmp_обновить_экран

  End Sub
'===============================================================================
  Sub Print_столбец(byval Copy_столбец As Byte , Byval Copy_данные_столбца As Byte)

    Local Tmp_copy_столбец As Byte
    Local Tmp_copy_data_столбец As Byte

    Decr Copy_столбец
    Tmp_copy_столбец = Copy_столбец
    Shift Tmp_copy_столбец , Right , 3
    Incr Tmp_copy_столбец
    Tmp_copy_data_столбец = Copy_столбец And &H07
    Incr Tmp_copy_data_столбец
    Write_matrix_reg_data Tmp_copy_столбец , Tmp_copy_data_столбец , Copy_данные_столбца

  End Sub
'===============================================================================
  Sub Write_matrix_reg_data(byval Copy_matrix As Byte , Byval Copy_reg As Byte , Byval Copy_data As Byte)

    Local Tmp_count_matrix As Byte
    Local Tmp_ckip_max7219 As Byte

    Tmp_ckip_max7219 = 0

   'Даём понять чипам MAX7219_7221, что начинаем передавать данные
    Load_max7219_7221 = 0

    For Tmp_count_matrix = Const_amount_matrix To 1 Step -1
        If Copy_matrix = Tmp_count_matrix Then
           Write_data_max7219_7221 Copy_reg
           Write_data_max7219_7221 Copy_data
          Else
           Write_data_max7219_7221 Tmp_ckip_max7219
           Write_data_max7219_7221 Tmp_ckip_max7219
        End If
    Next Tmp_count_matrix

   'Даём понять чипам MAX7219_7221, что закончили передавать данные, тем самым разрешая применить введённые данные
    Load_max7219_7221 = 1

  End Sub
'===============================================================================
   Sub Write_data_max7219_7221(byval Copy_write_data As Byte)

    !push R16
    !push R17

    Loadadr Copy_write_data , X
    !ld R16 , X
    !ldi R17 , 8                                            ' 8 бит в байте

   Next_bit_max7219_7221:                                   ' Загоняем данные в ЬФЧ7219_7221, старшим битом вперёд
    !SBRC R16 , 7                                           ' Пропустить если бит в регистре очищен
    Data_max7219_7221 = 1
    !SBRs R16 , 7                                           ' Пропустить если бит в регистре установлен
    Data_max7219_7221 = 0
    !rol R16                                                ' Сдвигаем влево биты в байте
   Write_clk_max7219_7221:                                  ' Передаём тактовые импульсы
    Clk_max7219_7221 = 1
    Clk_max7219_7221 = 0

    !dec R17                                                ' Считаем биты
   !brne Next_Bit_max7219_7221

    !pop R16
    !pop R17

  End Sub
'===============================================================================
  Sub Настройка_экрана()

    Local Tmp_счетчик_матриц As Byte

    For Tmp_счетчик_матриц = 1 To Const_amount_matrix
        Write_matrix_reg_data Tmp_счетчик_матриц , Const_shutdown , 1       ' Режим Shutdown (0-дисплей выключен, 1-нормальная работа)
        Write_matrix_reg_data Tmp_счетчик_матриц , Const_decode_mode , 0       ' Выбор режима управления сегментами индикатора, декодирование аппаратное или программное
        Write_matrix_reg_data Tmp_счетчик_матриц , Const_bright , 7       ' Уровень свечения сегментов (0-минимум, 15-максимум)
        Write_matrix_reg_data Tmp_счетчик_матриц , Const_scan_limit , 7       ' Число используемых разрядов (счет от 0)
        Write_matrix_reg_data Tmp_счетчик_матриц , Const_matrix_test , 0       ' Тестовый режим (0-выключен, 1-включен)
    Next Tmp_счетчик_матриц

  End Sub
'===============================================================================

Интересует именно эта часть п/п.
Sub Update_screen_max7219_word()
Как добавить еще одну матрицу с секундами, и фонт 5х8. Переход сверху вниз необязателен, хотя красиво. Без секунд часы не совсем живые.

0

17

rom-i написал(а):

Как добавить еще одну матрицу с секундами

Скиньте весь исходник мне на мыло

0

18

sasha_1973
Как здоровски, что Вы ответили. Это Ваш код. Прошло правда уже пару лет с того времени. Какое у Вас сейчас рабочее мыло?

Отредактировано rom-i (2022-09-26 16:14:03)

0


Вы здесь » Программирование ATMEL в BASCOM. » Дисплеи и индикация » Драйвер MAX7219 для светодиодных матриц 1088