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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Дисплеи и индикация » ST7920 графический ЖКИ 128*64 и Bascom


ST7920 графический ЖКИ 128*64 и Bascom

Сообщений 61 страница 88 из 88

61

Представьте себе, я её ещё не сдал, тормозят меня по страшному  :canthearyou:
Такой простой проект растянул на больше, чем пол года и двигается он, когда сам беру в руки сварочник, болгарку, шуруповёрт, краску, ключи и т.д., а когда завершу всё это слесарное, меня начинаю теребить "Почему это не работает" и на программу вообще не отводят время.

0

62

Совет на будущее :
Заведи блокнотик, и записывай числа обещанные, сроки, и обещалки.
Потом когда спрашивают- достаешь блокнотик, и начинаешь спрашивать- Вы вот мне такого-то числа обещали к такому-то числу (вставить нужное). И Где ?

99% вопросов отпадают.

+1

63

Блокнот это тема!!!
Кстати, а вот, работа LCD экрана в действии, отснял видео. Перетащили это чудовище на рабочее место.

Даже премию не дали, пусть сами инструкции пишут. :D

+3

64

Зачетно вышло

0

65

Неплохо бы вместо музыки комментарий происходящих событий послушать.

0

66

:cool:  :flag: Титанический труд.
Без премии должно каждый месяц требовать профилактики ))) С паролем  :dontknow:

Отредактировано Skull (2015-08-01 22:13:30)

+1

67

Короче теперь пол завода на меня зубы точат. Стенд выявил кучу брака по одной технологической линии. Хоть и мерит о низкое давление 0.4-1.4кг/см датчиком на 200кг/см, всё-же браку увидел очень много. Представляю, если начальство соизволит всё-же раздобыть мне 4 клапана высокого давления и два цифровых датчика давления на 8кг/см, браку будет все 90%. Грубо говоря имели меня целых два дня, оскорбляли, унижали, в итоге настоял на разборке изделия.
Изделие разобрали - брак, второе разобрали - брак и так 100шт. пришлось перебирать.
Теперь ходят и говорят: "Всё нормально было, пока это г.. не поставили".
Сейчас сам тестирую всё, но чувствую, когда будут тестировать они, брак будут отправлять и не будут перебирать, а если настою на видео наблюдении, то на заводе буду самым плохим человеком  :confused:

0

68

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

Неплохо бы вместо музыки комментарий происходящих событий послушать.

Это скоро, обзаведусь нормальной камерой.
Процесс примерно такой:
- Закрыть деврь. (проверить закрытие)
- Зажать цилиндр (определить присутствие)
- Подвести головки низкого давления
- Прижать головку низкого давления
- Подвести головку высокого давления
- Прижать головку высокого давления
- Включить гидравлический насос
-  Прокачать N кол-во раз, в момент прокачки измерить время нажатия и возврата поршней изделия
- Закрыть клапаны высокого давления и сделать паузу для выравнивания давления до измерения
- Нажать сильно на поршни изделие для получения высокого давления 120кг/см, если давления небыло в любой камере, открыть клапана, переобжать головки высокого и низкого давления, поцокать клапанами и перейти к прокачки, второй раз просто вывести ошибку отсутствия давления.
- Отжать поршни и сделать паузу для выравнивания давления.
- Измерить остаточное низкое давление (целое шаманство)
- Прочистить изделие, удалить жидкости
- Проанализировать массивы, найти потери в высоком давлении за последние 15 сек.
- Найти минимумы и максимум
- Вывести результат (как графический, так и текстовый)

В сервисном меню можно проверить все выходы и входы, в том числе и АЦП
В меню настройке можно всё настроить, временные велечины (сколько жадть при закрытии, сколько дать времени на подвод головки, сколько циклов прокачки), настройка делителя АЦП, настройки фильтров и анализ данных низкого давления и т.д.

+2

69

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

Стенд выявил кучу брака по одной технологической линии.

Из-за халатного отношения к работе или из-за дефектов оборудования на котором производят изделия?

0

70

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

"Всё нормально было, пока это г.. не поставили".

Как это знакомо )))) Когда я поставил на родном хлебозаводе счетчики изделий меня даже водители бить собирались ))))
А потом началась компания по дискредитации счетчика- его и тестом залепливали, и со штанги сбивали, провода резали (ессно- случайно- само перетерлось). Но самое забавное- стоит отойти он начинал неправильно считать )) Вот неправильно и все тут ) Пока стоит проверяющий рядом- считает тютя в тютю, отвернулся- расхождение в сотню-две булок хлеба ))
Так что жди встречи за проходной ))) Я отмазался только тем, что сказал "Какая разница- кто делает ? Если начальство озадачилось- счетчик там будет. А кто его сделает- неважно" Вроде подействовало.
А потом наняли новую охрану и она так прижала местных деятелей, что счетчики у них перестали быть основной проблемой ))

Советую запастись терпением и отмазкой почему это делаешь именно ты )) И готовься к дискредитационной компании. Возможно твой стенд повредят.

0

71

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

Короче теперь пол завода на меня зубы точат. Стенд выявил кучу брака по одной технологической линии

Знакомая история, сочувствую.

0

72

Ребята, всем привет!
Никто еще не пробовал оформить все вышесказанное про ST7920 в виде библиотеки для BASCOM-а? Сам я не пробовал - просто не умею я писать библиотеки :blush: . Может кто-то уже занимался подобным вопросом? А то я поназаказывал на ALIEXPRESS всяких дисплеев, а лежат-то они теперь мертвым грузом... А у меня такие планы на них были...

0

73

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

А потом началась компания по дискредитации счетчика

У меня тоже самое было как под копирку на предприятии где раньше работал. Видимо проблема очень типичная!

0

74

Подтверждаю! На Xmega работает исправно от логического уровня 3.3 вольта  :glasses:

0

75

Если у кого будет шум на матрице, 4,7к. на шине данных спасают.

0

76

Ev3658 а как подключен Ваш LCD , параллельно или по последовательной шине , и библиотекой не поделитесь с сообществом ?

0

77

Ev3658 библиотекой для ST7920 поделится можете? Не получается вывести штифты в графическом режиме.

0

78

я не делал библиотекой, использую как подпрограмму: ST7920 графический ЖКИ 128*64 и Bascom

0

79

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

Ev3658 библиотекой для ST7920 поделится можете? Не получается вывести штифты в графическом режиме.

https://upforme.ru/uploads/0000/25/b8/1295/t568719.png

Использую по разному, экран в целом тормозной, с кнопочным интерфейсом так вообще не вариант.

В начале программы:

Код:
$include "lcd-lib-1.bas"

'Конфигурация портов LCD экрана

Outport Alias Portc
Getport Alias Pinc
Config Outport = Output
Rs Alias Portg.2                                            'H: Data    L: Instruction Code
Config Rs = Output
Rw Alias Portg.0                                            'H: Read    L: Write
Config Rw = Output
E Alias Portg.1
Config E = Output


...
...
...
...

Call Lcdstart()
Call Lcdcls

Использование:

Текст:

Код:
X = 0 : Y = 0 : Txt1 = "тут текст" : Text X , Y , Txt1 

Текс без стирания: Nstr = 1

Линии:

Код:
Xs = P * 5 : Xs = Xs + 3 : Ys = O : Xk = Xs + 3 : Yk = O : Lcdline Xs , Ys , Xk , Yk

         Xs = 0 : Ys = 0 : Xk = 127 : Yk = 0 : Lcdline Xs , Ys , Xk , Yk
         Xs = 1 : Ys = 10 : Xk = 126 : Yk = 10 : Lcdline Xs , Ys , Xk , Yk
         Xs = 1 : Ys = 20 : Xk = 126 : Yk = 20 : Lcdline Xs , Ys , Xk , Yk
         Xs = 0 : Ys = 0 : Xk = 0 : Yk = 20 : Lcdline Xs , Ys , Xk , Yk
         Xs = 127 : Ys = 0 : Xk = 127 : Yk = 20 : Lcdline Xs , Ys , Xk , Yk

В конце программы после "END":

Код:
$include "lcd-lib-2.bas"                                    'SUB программы LCD экрана 

Ссылка на файлы: https://yadi.sk/d/67jgRER5Oph5PA

Отредактировано Ev3658 (2020-11-02 22:49:54)

0

80

Ev3658 Большое спасибо! Разобрался. Вывод картинки также
оформил подпрограммой. Картинки готовлю в FastLCD.
Екран действительно тормозной!

0

81

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

...Картинки готовлю в FastLCD.
....

Я написал как-то простую программу, исходник блин потерял, но она позволяет мне очень быстро генерировать всё что захочу в блок DATA.
Вот: https://yadi.sk/d/bsZ_21wIzl_ugw
(он из темы - Led матрица 32*16 для бегущей строки)

+1

82

Не много причёсанный вариант. Основу брал с этой ветки.

Код:
'(                 12864В  контроллер ST7920 или ST920     ATbanned28A

                                    Панель оператора ДДУ

   BASCOM-AVR 2.0.8.1

   Ноябрь 2021г.
')
'**************************************************************************************************************
$regfile = "m128def.dat"
$crystal = 16000000
$hwstack = 256
$swstack = 256
$framesize = 256
'--------------------------------------------------------------------------------------------------------------
  ' My SUB
Declare Sub LCD_TXT(Byval y as byte , Byval x as byte , Byval txt as string * 16 )       ' 4x8 так как курсор занимает два знокоместа специфика экрана
Declare Sub Lcdcommand(byval bytecommand As Byte)
Declare Sub Lcdwrite(byval data_lcd As Byte)
Declare sub LCD_CLS()
'
Declare sub LCD_PIC_Hi(byval pic_H as string * 8)
Declare sub LCD_PIC_Lo(byval pic_L as string * 8)
'==============================================================================================================
'==============================================================================================================
'--------------------------------------------------------------------------------------------------------------
'    Настройка АЦП
Config Adc = Single , Prescaler = Auto , Reference = Avcc   'Internal
Start Adc
'--------------------------------------------------------------------------------------------------------------
'==============================================================================================================
'    Подключение Экрана ST7920
Outport Alias Porta
Config Outport = Output
Rs Alias Portc.3 : rs = 0
Rw Alias Portc.2 : rw = 0
E Alias Portc.1 : e = 0

rest Alias Portc.0
Config Portc = Output
rest = 0
waitms 500
rest = 1
waitms 200
'**********************
Lcdcommand &B_0011_0000                                     ' первый раз запускаем графическую конфигурацию экрана
Lcdcommand &B_0011_0110                                     ' при первой её инициализации после подачи питания на экран
LCD_CLS                                                     ' в графической памяти будет мусор очищаем его
'===========================================================================================================
'===========================================================================================================

dim adc_1 as word
dim u as single
dim a as byte
dim temp_str as string * 8

Dim Mybyte As Byte , Mybyte_1 As Byte , Mybyte_2 As Byte
Dim Lcdx As Byte , Lcdy As Byte
'
dim byte1_in as byte
dim byte2_in as byte
dim byte1_out as byte
dim byte2_out as byte

'**************************************************************************************************************
'
config portg = output                                       '   порт зелёный светодиод.

'*************************************************************************************************************
'                Начало программы
'
'LCD_TXT 1 , 2 , "8"
'LCD_TXT 1 , 5 , "9"
'LCD_TXT 2 , 1 , "5486"
'LCD_TXT 4 , 0 , "Serega"

'do
'adc_1 = getadc(7)
'u = adc_1 * 0.0044
'temp_str = fusing(u , "#.#")
'LCD_TXT 1 , 3 , temp_str

 LCD_PIC_Hi "4el"
 LCD_PIC_Lo "4el2"

'loop
'======================================================================================================================
                                        end                 ' КОНЕЦ  (GAME OVER)
' =====================================================================================================================
'======================================================================
Sub Lcdcommand(bytecommand As Byte)
   E = 0 : Rs = 0 : E = 1                                   ' команда
   Outport = bytecommand
   E = 0
   Waitus 75
End Sub
'---------------------------------------
Sub Lcdwrite(data_lcd As Byte)
   E = 0 : Rs = 1 : E = 1                                   ' данные
   Outport = data_lcd
   E = 0
   Waitus 75
End Sub
'---------------------------------------
'=====================================================================
'=====================================================================================================================
sub LCD_TXT(y as byte , x as byte , txt as string * 8 )
      '---------------------------------------------------------------------------------------
      Lcdcommand &B_0011_0000                               ' устанавливаем 8 бит передачу данных
      Lcdcommand &B_0000_1100                               ' запускаем текстовый режим
      '---------------------------------------------------------------------------------------
      Local koordinata As Byte , s4et as byte , data_lcd as byte , chr_text as string * 1
'----------------------------------------------------------------------------------
 if y <> 0 and y <= 4 and x <= 7 then
      if y = 1 then
         koordinata = 128
      elseif y = 2 then
         koordinata = 144
      elseif y = 3 then
         koordinata = 136
      elseif y = 4 then
         koordinata = 152
      endif
   koordinata = koordinata + x
   Lcdcommand koordinata                                    ' отправляем координату курсора
   '---------------------------------------------------------------------------------------
   For s4et = 1 To Len(txt)                                 ' по символьно заганяем строку в экран
      chr_text = Mid(txt , s4et , 1)
      data_lcd = Asc(chr_text)
      Lcdwrite data_lcd
   Next
 endif
End Sub
'======================================================================================================================
sub LCD_CLS()
   local x as byte , y as byte
   '------------------------------
      For x = &H80 To &B10001111                            '    128...143 =15   (d143 h8F)
         For y = &H80 To &B10011111                         ' 128...159 =31 (d159 h9F)
         Lcdcommand y
         Lcdcommand x
         Lcdwrite &h00
         Lcdwrite &h00
      Next
   Next
End Sub
'======================================================================================================================
sub LCD_PIC_Hi(pic_H as string * 8)                         ' Выводим рисунок на верхнюю часть экрана
'------------------------------------
   Lcdcommand &B_0000_0010                                  ' переводим курсор домой
   Lcdcommand &B_0011_0000                                  ' устанавливаем 8 бит передачу данных
   Lcdcommand &B_0011_0110                                  ' запускаем графический режим
   '-------------------------------------------------------------------------------------------
  Select Case pic_H
      Case "4el" : Restore Dat1
      Case "4el2" : Restore Dat2

End Select
'******************************************************
      For Lcdy = 128 To 159
         For Lcdx = 128 To 135
            Read byte1_in
            Read byte2_in
           '----------------------------------------
byte1_out.7 = byte1_in.0
byte1_out.6 = byte1_in.1
byte1_out.5 = byte1_in.2
byte1_out.4 = byte1_in.3
byte1_out.3 = byte1_in.4
byte1_out.2 = byte1_in.5
byte1_out.1 = byte1_in.6
byte1_out.0 = byte1_in.7
'
byte2_out.7 = byte2_in.0
byte2_out.6 = byte2_in.1
byte2_out.5 = byte2_in.2
byte2_out.4 = byte2_in.3
byte2_out.3 = byte2_in.4
byte2_out.2 = byte2_in.5
byte2_out.1 = byte2_in.6
byte2_out.0 = byte2_in.7
'---------------------------
         Lcdcommand Lcdy
         Lcdcommand Lcdx
         Lcdwrite byte1_out
         Lcdwrite byte2_out
      Next
   Next
End Sub
'======================================================================================================================
'======================================================================================================================
sub LCD_PIC_Lo(pic_L as string * 8)                         ' Выводим рисунок на верхнюю часть экрана
'------------------------------------
   Lcdcommand &B_0000_0010                                  ' переводим курсор домой
   Lcdcommand &B_0011_0000                                  ' устанавливаем 8 бит передачу данных
   Lcdcommand &B_0011_0110                                  ' запускаем графический режим
   '-------------------------------------------------------------------------------------------
  Select Case pic_L
      Case "4el" : Restore Dat1
      Case "4el2" : Restore Dat2

End Select
'******************************************************
      For Lcdy = 128 To 159
         For Lcdx = 136 To 143
            Read byte1_in
            Read byte2_in
           '----------------------------------------
byte1_out.7 = byte1_in.0
byte1_out.6 = byte1_in.1
byte1_out.5 = byte1_in.2
byte1_out.4 = byte1_in.3
byte1_out.3 = byte1_in.4
byte1_out.2 = byte1_in.5
byte1_out.1 = byte1_in.6
byte1_out.0 = byte1_in.7
'
byte2_out.7 = byte2_in.0
byte2_out.6 = byte2_in.1
byte2_out.5 = byte2_in.2
byte2_out.4 = byte2_in.3
byte2_out.3 = byte2_in.4
byte2_out.2 = byte2_in.5
byte2_out.1 = byte2_in.6
byte2_out.0 = byte2_in.7
'---------------------------
         Lcdcommand Lcdy
         Lcdcommand Lcdx
         Lcdwrite byte1_out
         Lcdwrite byte2_out
      Next
   Next
End Sub
'======================================================================================================================
Dat1:
DATA &B0000_0000, &B1110_0000, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B0000_0111, &B0000_0000 ' 1
DATA &B0000_0000, &B1111_0000, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B0000_1111, &B0000_0000 ' 2
DATA &B0000_0000, &B0001_1000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0001_1000, &B0000_0000 ' 3
DATA &B0000_0000, &B0110_1100, &B0000_1100, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1111_1110, &B1000_0111, &B1110_0011, &B0011_1000, &B0011_0110, &B0000_0000 ' 4
DATA &B0000_0000, &B1110_0110, &B0000_1110, &B0000_0000, &B0000_0000, &B1000_0000, &B0000_0111, &B1110_0000, &B0000_0000, &B0000_0000, &B0110_0000, &B1100_0000, &B1011_0110, &B0110_1101, &B0110_0111, &B0000_0000 ' 5
DATA &B0000_0000, &B1110_0011, &B1100_1111, &B1100_0001, &B0011_1000, &B1000_1000, &B0110_1101, &B1001_0110, &B0011_1001, &B1101_1000, &B0110_1100, &B0000_0000, &B1011_0110, &B0110_0001, &B1100_0110, &B0000_0000 ' 6
DATA &B1000_0000, &B0110_0001, &B0110_1101, &B1110_0011, &B0010_1000, &B1001_0100, &B0110_0111, &B1100_0110, &B0110_1100, &B1101_1100, &B0110_1100, &B0000_0000, &B1011_0110, &B0110_0001, &B1000_0110, &B0000_0001 ' 7
DATA &B1100_0000, &B0110_0000, &B0110_1100, &B1101_0011, &B0110_1100, &B1011_0110, &B0110_1101, &B1100_0111, &B0110_1100, &B1101_1010, &B0110_1110, &B0000_0000, &B1011_0010, &B0010_0001, &B0000_0110, &B0000_0011 ' 8
DATA &B0110_0000, &B0110_0000, &B0110_1100, &B1101_1011, &B1111_1110, &B1011_1110, &B1110_1101, &B1001_0110, &B0110_1101, &B1101_1011, &B0110_1101, &B1000_0000, &B1011_0001, &B0001_1001, &B0000_0110, &B0000_0110 ' 9
DATA &B0011_0000, &B0110_0100, &B1100_1100, &B1101_1001, &B1100_0110, &B1011_0110, &B0110_0111, &B1110_0110, &B0011_1000, &B1101_1011, &B0110_1100, &B1100_0000, &B1011_0100, &B0100_1101, &B0100_0110, &B0000_1100 ' 10
DATA &B0001_1000, &B0000_0100, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1100_0000, &B1110_0111, &B0111_1100, &B0100_1111, &B0001_1000 ' 11
DATA &B0000_1100, &B0000_1000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0010_0000, &B0011_0000 ' 12
DATA &B0000_0110, &B1111_0000, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B0001_1111, &B0110_0000 ' 13
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 14
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 15
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B1111_1100, &B0000_0111, &B1111_0000, &B0001_1111, &B0001_1000, &B0001_1000, &B0000_0000, &B1111_0000, &B0000_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 16
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0010, &B0000_1101, &B0001_1000, &B0011_0100, &B0001_1000, &B0001_1000, &B0000_0000, &B0001_1000, &B0001_1000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 17
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B1000_0011, &B0001_1001, &B0001_1000, &B0110_0110, &B0001_1000, &B0001_1000, &B0000_0000, &B0001_1000, &B0011_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 18
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B1000_0011, &B0011_0000, &B0001_1000, &B1100_0010, &B0011_0000, &B0001_1000, &B0000_0000, &B0000_0000, &B0011_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 19
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B1100_0011, &B0110_0000, &B0011_0000, &B1000_0010, &B0110_0001, &B0001_1000, &B0000_0000, &B0000_0000, &B0011_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 20
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0101_1110, &B0110_0000, &B0000_0000, &B1000_0001, &B1100_0001, &B0001_1000, &B0000_0000, &B0000_0000, &B0011_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 21
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0100_0000, &B0110_0000, &B0000_0000, &B1000_0001, &B1000_0001, &B0001_1001, &B1111_1111, &B0000_0000, &B0011_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 22
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0010_0000, &B0110_0000, &B1000_0000, &B1000_0000, &B0000_0001, &B0001_1111, &B1111_1111, &B0000_0000, &B0001_1000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 23
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0010_0000, &B0110_0000, &B1000_0000, &B1000_0000, &B0000_0001, &B0001_1100, &B1111_1111, &B0000_0000, &B0000_1110, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 24
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0011_0000, &B0110_0000, &B1100_0000, &B1000_0000, &B0000_0001, &B0000_1100, &B0000_0000, &B1100_0000, &B0000_0011, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 25
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0011_1110, &B0110_0000, &B1111_1000, &B1000_0000, &B0000_0001, &B0000_0110, &B0000_0000, &B0111_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 26
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B1101_0011, &B0110_0000, &B0100_1100, &B1000_0011, &B0000_0001, &B0000_0011, &B0000_0000, &B0001_1000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 27
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B1000_1011, &B0011_0001, &B0010_1100, &B1100_0110, &B1000_0000, &B0000_0001, &B0000_0000, &B0000_1100, &B0011_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 28
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_1111, &B0001_1111, &B0011_1100, &B0111_1100, &B1101_1000, &B0000_0000, &B0000_0000, &B1100_1100, &B0011_0011, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 29
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0110, &B0000_0000, &B0001_1000, &B0000_0000, &B0111_1000, &B0000_0000, &B0000_0000, &B0011_1100, &B0011_1100, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 30
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 31
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 32
'************
Dat2:
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000, &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 1
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1111_0000, &B0000_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 2
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1111_1000, &B0001_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 3
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1111_1100, &B0001_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 4
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0001_1100, &B0001_1100, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 5
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0001_1100, &B0001_1100, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 6
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0001_1100, &B0000_1110, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 7
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 8
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1000_0000, &B0000_0011, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 9
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1100_0000, &B1111_1101, &B0111_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 10
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000, &B1111_1110, &B0111_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 11
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0111_0000, &B1111_1111, &B0111_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 12
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0011_0000, &B1111_1111, &B0111_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 13
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1011_1000, &B0000_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 14
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1011_1100, &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 15
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1011_1100, &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 16
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1011_1100, &B0000_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 17
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1011_1100, &B1111_1111, &B0111_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 18
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1011_1100, &B1111_1111, &B0111_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 19
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1011_1100, &B1111_1111, &B0111_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 20
DATA &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1011_1100, &B1111_1111, &B0111_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000 ' 21
DATA &B0000_0110, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1011_1100, &B0000_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0110_0000 ' 22
DATA &B0000_1100, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1011_1100, &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0011_0000 ' 23
DATA &B0001_1000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1011_1100, &B0000_0111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0001_1000 ' 24
DATA &B0011_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1011_1100, &B0000_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_1100 ' 25
DATA &B0110_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0011_1000, &B1111_1111, &B0111_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0110 ' 26
DATA &B1100_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0011_1000, &B1111_1111, &B0111_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0011 ' 27
DATA &B1000_0000, &B0000_0001, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0111_0000, &B1111_1110, &B0111_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1000_0000, &B0000_0001 ' 28
DATA &B0000_0000, &B0000_0011, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1110_0000, &B1111_1100, &B0111_1111, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1100_0000, &B0000_0000 ' 29
DATA &B0000_0000, &B0000_0110, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B1100_0000, &B0000_0001, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0110_0000, &B0000_0000 ' 30
DATA &B0000_0000, &B0000_1100, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0000_0000, &B0011_0000, &B0000_0000 ' 31
DATA &B0000_0000, &B1111_1000, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B1111_1111, &B0001_1111, &B0000_0000 ' 32
' Байтов:512

Программа для рисования тоже с форума. Уже не найду где по-моему где бегущая строка.
Pixelizator20

0

83

Сохраню себе, на всякий случай
В одном проекте пришлось перевернуть плату с дисплеем на 180 градусов.
Чертыхнулся, но всё получилось
Шрифты 8*8 точек
8 строк по 16 символов в каждой.
Реализованы только заглавные буквы. Вместо некоторых символов сделаны "под себя".

Писалось на скорую руку, оптимизируйте на здоровье ))

Ps
проверено в версиях BASCOM 2079-2085

Код:
regfile = "m16adef.dat"                ' ПЕРЕВЕРНУТЫЙ Дисплей!!!
$crystal = 8000000
$hwstack = 64
$swstack = 64
$framesize = 64


Dim Tmp As Byte

Dim Font_bold , Invers_font As Byte
Dim Lcd_lf , Lcd_rt , Glcd_data As Byte
Dim Lcd_w1 , Lcd_w2 As Word
Dim Lcdstr$ As String * 16 , Simvol_1$ As String * 1 , Simvol_2$ As String * 1
Dim Lcdx , Lcdy , X_lcd , Y_lcd , Lcd_cnt , Lcd_bg , Lcd_asc , Lcd_tmp As Byte



'Графический ЖКИ 128*64 с контроллером ST7920
'Подключено последовательной шиной, вывод 15 (Psb) подключить на минус. Вывод 4  на +5в
Sid_glcd Alias Portc.4 : Config Sid_glcd = Output       ' data. Вывод ЖКИ 5, (R/W)
Sclk_glcd Alias Portc.5 : Config Sclk_glcd = Output       ' clock. Вывод ЖКИ 6, (E)
Gosub Init_st7920                       ' ---  Инициализация ST7920
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Gosub Lcdimgcls                         ' очистка графической памяти ЖКИ

Lcdstr$ = "ПРИВЕТ, АНДРЕЙ!" : Y_lcd = 7 : X_lcd = 0 : Gosub Print_lcd

Lcdstr$ = "ПРОВЕРКА ST-7920" : Y_lcd = 6 : X_lcd = 0 : Font_bold = 1 : Gosub Print_lcd

Lcdstr$ = "АВТОР: ДАНИЛИН А" : Y_lcd = 4 : X_lcd = 0 : Gosub Print_lcd
Lcdstr$ = "+7 930 828-47-48" : Y_lcd = 3 : X_lcd = 0 : Font_bold = 1 : Gosub Print_lcd
Lcdstr$ = "PIC-AVR@YA.RU <" : Y_lcd = 1 : X_lcd = 0 : Invers_font = 1 : Gosub Print_lcd
Lcdstr$ = "РОССИЯ, С.ПОСАД" : Y_lcd = 0 : X_lcd = 0 : Gosub Print_lcd

End

'======================================================================
Print_lcd:                              ' по вертикали 0-7 симв., по гориз.- 0-7 блоков
  Y_lcd = Y_lcd + 1

  ' Преобразуем номера позиции в физический адрес памяти ЖКИ
  If Y_lcd >= 5 Then                    ' нижняя физическая половина ЖКИ
    Y_lcd = Y_lcd - 4
    X_lcd = X_lcd + 15
  Else
    X_lcd = 7 - X_lcd
  End If

  Lcdx = X_lcd + 128

  Y_lcd = Y_lcd * 8 : Y_lcd = Y_lcd + 127

  For Lcd_cnt = 1 To Len(lcdstr$)
    Simvol_1$ = Mid(lcdstr$ , Lcd_cnt , 1) : Lcd_asc = Asc(simvol_1$) -32       ' До "пробела" нет символов
    If Lcd_asc > 159 Then Lcd_asc = Lcd_asc - 101       ' Убрали из таблицы маленькие английские и русские
    Lcd_w1 = Lcd_asc * 8                ' Адрес левого символа

    Incr Lcd_cnt
    Simvol_2$ = Mid(lcdstr$ , Lcd_cnt , 1) : Lcd_asc = Asc(simvol_2$) -32
    If Lcd_asc > 159 Then Lcd_asc = Lcd_asc - 101       ' Убрали из таблицы маленькие английские и русские
    Lcd_w2 = Lcd_asc * 8                ' Адрес правого символа

    Lcdy = Y_lcd
    For Lcd_bg = 0 To 7                 '  8 по вертикали
      Lcd_rt = Lookup(lcd_w1 , Shrift_8x8)
      If Font_bold = 1 Then             ' делаем символы жирными - копируем точку правее
        Lcd_tmp = Lcd_rt : Shift Lcd_tmp , Right , 1
        Lcd_rt = Lcd_rt Or Lcd_tmp
      End If
      If Invers_font = 1 Then Toggle Lcd_rt       ' Инверсия символа и фона

      Lcd_lf = Lookup(lcd_w2 , Shrift_8x8)
      If Font_bold = 1 Then             ' делаем символы жирными - копируем точку правее
        Lcd_tmp = Lcd_lf : Shift Lcd_tmp , Right , 1
        Lcd_lf = Lcd_lf Or Lcd_tmp
      End If
      If Invers_font = 1 Then Toggle Lcd_rt       '      ' Инверсия символа и фона

      ' левая половина блока - Lf, правая половина блока = Rt
      Glcd_data = Lcdy : Gosub Lcdcommand
      Glcd_data = Lcdx : Gosub Lcdcommand       '   X=16      16 точек по горизонтали


      If Simvol_2$ = "" Then
        Glcd_data = 0
      Else
        Glcd_data = Lcd_lf
        Gosub Zerkalo_baita             ' отзеркалим байт
      End If
      Gosub Lcdwrite

      Glcd_data = Lcd_rt
      Gosub Zerkalo_baita               ' отзеркалим байт
      Gosub Lcdwrite

      Decr Lcdy
      Incr Lcd_w1 : Incr Lcd_w2
    Next
    Decr Lcdx

  Next
  Font_bold = 0
  Invers_font = 0
Return


'=========================================================
Lcdimgcls:                              ' --  Очистка графической памяти ST7920  --
  For Lcdx = &H80 To &H8F
    For Lcdy = &H80 To &H9F
      Glcd_data = Lcdy : Gosub Lcdcommand
      Glcd_data = Lcdx : Gosub Lcdcommand
      Glcd_data = 0
      Gosub Lcdwrite : Gosub Lcdwrite
    Next
  Next
Return

' ============================================================
Zerkalo_baita:
  Lcd_tmp.0 = Glcd_data.7
  Lcd_tmp.1 = Glcd_data.6
  Lcd_tmp.2 = Glcd_data.5
  Lcd_tmp.3 = Glcd_data.4

  Lcd_tmp.4 = Glcd_data.3
  Lcd_tmp.5 = Glcd_data.2
  Lcd_tmp.6 = Glcd_data.1
  Lcd_tmp.7 = Glcd_data.0

  Glcd_data = Lcd_tmp
Return


'=====================================================================================================
Lcdcommand:                             ' Записать команду
  Lcd_tmp = &B11111000                  ' Команда RW=0 RS=0
  Goto Lcd_sending


Lcdwrite:                               ' Записать данные
  Lcd_tmp = &B11111010
'  Goto Lcd_sending                      ' данные RW=0 RS=1


Lcd_sending:
  Lcd_asc = 8                           ' Сколько бит передать
  Gosub Lcd_tx

  Lcd_asc = 4                           ' Сколько бит передать

  Lcd_tmp = Glcd_data : Gosub Lcd_tx    ' передаём Старшие 4 бита MSB
  Lcd_tmp = 0 : Gosub Lcd_tx            ' передаём 4 нуля

  Lcd_tmp = Glcd_data : Shift Lcd_tmp , Left , 4
  Gosub Lcd_tx                          ' передаём младшие 4 бита LSB

  Lcd_tmp = 0 : Gosub Lcd_tx            ' передаём 4 нуля

  Sclk_glcd = 0 : Sid_glcd = 0
Return

Lcd_tx:
  Shiftout Sid_glcd , Sclk_glcd , Lcd_tmp , 1 , Lcd_asc       ' Dat, Clock, Var, Option[, bits, delay]
Return


'========================================================
Init_st7920:                            ' ---  Инициализация ST7920
  Sclk_glcd = 0 : Sid_glcd = 0
  Waitms 50                             ' обязательно. Для ЖКИ - 100ms
  Glcd_data = &B_0011_0100 : Gosub Lcdcommand       ' EXTENDEN instruction
  Glcd_data = &B_0011_0000 : Gosub Lcdcommand       ' GRAGIC display Off
  Glcd_data = &B_0000_0110 : Gosub Lcdcommand       ' Entry Mode Set
  Glcd_data = &B_0000_1100 : Gosub Lcdcommand       ' Выкл Курсор и мигание символа
  Glcd_data = &B_0000_0001 : Gosub Lcdcommand       ' Clear Text Display
  Waitms 3
  Glcd_data = &B_0011_0100 : Gosub Lcdcommand       ' EXTENDEN instruction
  Glcd_data = &B_0011_0110 : Gosub Lcdcommand       ' GRAGIC display On
Return


'=========================================================
' Эта строка обязана быть последней в коде программы!
$include "font-8x8_big_eng_rus.inc"     ' Загрузка шрифтов

отдельно шрифты font-8x8_big_eng_rus.inc:

Код:
Shrift_8x8:

   Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00       '  code 32 ( )
   Data &H10 , &H10 , &H10 , &H10 , &H10 , &H00 , &H10 , &H00       '  code 33 (!)
   Data &H14 , &H14 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00       ' Code 34(")
   Data &H28 , &H7C , &H40 , &H78 , &H40 , &H40 , &H7C , &H00       '  code 35 (Ё вместо #)
   Data &H04 , &H0E , &H1F , &H00 , &H00 , &H1F , &H0E , &H04       '  code 36 ($ Вверх и Вниз)
   Data &H64 , &H68 , &H08 , &H10 , &H20 , &H2C , &H4C , &H00       '  code 37 (%)
   Data 16 , 56 , 124 , 254 , 16 , 16 , 16 , 0       '  code 38 (^ Вверх  вместо &)
   Data 16 , 16 , 254 , 124 , 56 , 16 , 0 , 0       '  code 39 (v Вниз вместо ')

   Data 255 , 255 , 255 , 0 , 0 , 0 , 0 , 0       '  code 40 (ПОЛОСКА вверху вместо ()
   Data 0 , 0 , 0 , 0 , 255 , 255 , 255 , 0       '  code 41 (ПОЛОСКА внизу вместо ))
   Data 255 , 255 , 255 , 0 , 255 , 255 , 255 , 0       '  code 42 (ПОЛОСКА широкая вместо *)

   Data &H00 , &H08 , &H08 , &H3E , &H08 , &H08 , &H00 , &H00       '  code 43 (+)
   Data &H00 , &H00 , &H00 , &H00 , &H00 , &H20 , &H20 , &H40       '  code 44 (,)
   Data &H00 , &H00 , &H00 , &H3E , &H00 , &H00 , &H00 , &H00       '  code 45 (-)
   Data &H00 , &H00 , &H00 , &H00 , &H00 , &H10 , &H10 , &H00       '  code 46 (.)
   Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H7E , &H00       '  code 47 (_ вместо /)

   Data 28 , 38 , 34 , 34 , 34 , 50 , 28 , 0       '  code 48 (0)
   Data 8 , 24 , 8 , 8 , 8 , 8 , 28 , 0 '  code 49 (1)
   Data 28 , 34 , 2 , 4 , 8 , 16 , 62 , 0       '  code 50 (2)
   Data 28 , 2 , 2 , 12 , 2 , 2 , 60 , 0       '  code 51 (3)
   Data 4 , 12 , 20 , 36 , 62 , 4 , 4 , 0       '  code 52 (4)
   Data 60 , 32 , 32 , 60 , 2 , 2 , 60 , 0       '  code 53 (5)
   Data 28 , 34 , 32 , 60 , 34 , 34 , 28 , 0       '  code 54 (6)
   Data 62 , 2 , 4 , 8 , 16 , 16 , 16 , 0       '  code 55 (7)
   Data 28 , 34 , 34 , 28 , 34 , 34 , 28 , 0       '  code 56 (8)
   Data 28 , 34 , 34 , 30 , 2 , 2 , 28 , 0       '  code 57 (9)

   Data &H00 , &H10 , &H10 , &H00 , &H10 , &H10 , &H00 , &H00       '  code 58 (:)

Data &B_10000000 '   code 59 ( 'C вместо ;  )
Data &B_10011100 
Data &B_00100010 
Data &B_00100000 
Data &B_00100000 
Data &B_00100010 
Data &B_00011100 
Data &B_00000000       

   Data &H00 , &H06 , &H1E , &H7E , &H7E , &H1E , &H06 , &H00       ' code 60( огромный  < )
   Data &H00 , &H00 , &HFC , &H00 , &HFC , &H00 , &H00 , &H00       ' code 61( = )
   'Data &H00 , &H60 , &H78 , &H7E , &H7E , &H78 , &H60 , &H00       'code 62( огромный  > )
Data &B_00001000   '   >
Data &B_00001100   
Data &B_00001110   
Data &B_00111111   
Data &B_00001110   
Data &B_00001100   
Data &B_00001000   
Data &B_00000000   



   Data &H38 , &H44 , &H04 , &H08 , &H10 , &H00 , &H10 , &H00       '  code 63 (?)

    Data &H1C , &H22 , &H4D , &H55 , &H55 , &H4E , &H20 , &H1C       '  code 64 (@)

   Data &H18 , &H18 , &H24 , &H24 , &H7E , &H42 , &H42 , &H00       '  code 65 (A)
   Data &H70 , &H48 , &H48 , &H78 , &H44 , &H44 , &H78 , &H00       '  code 66 (B)
   Data &H1C , &H22 , &H40 , &H40 , &H40 , &H22 , &H1C , &H00       '  code 67 (C)
   Data &H78 , &H44 , &H42 , &H42 , &H42 , &H44 , &H78 , &H00       '  code 68 (D)
   Data &H7C , &H40 , &H40 , &H78 , &H40 , &H40 , &H7C , &H00       '  code 69 (E)
   Data &H7C , &H40 , &H40 , &H78 , &H40 , &H40 , &H40 , &H00       '  code 70 (F)
   Data &H1C , &H22 , &H40 , &H4E , &H42 , &H22 , &H1E , &H00       '  code 71 (G)
   Data &H42 , &H42 , &H42 , &H7E , &H42 , &H42 , &H42 , &H00       '  code 72 (H)
   Data &H70 , &H20 , &H20 , &H20 , &H20 , &H20 , &H70 , &H00       '  code 73 (I)
   Data &H70 , &H10 , &H10 , &H10 , &H10 , &H10 , &H60 , &H00       '  code 74 (J)
   Data &H44 , &H48 , &H50 , &H60 , &H50 , &H48 , &H44 , &H00       '  code 75 (K)
   Data &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H78 , &H00       '  code 76 (L)
   Data &H42 , &H66 , &H5A , &H5A , &H42 , &H42 , &H42 , &H00       '  code 77 (M)
   Data &H42 , &H62 , &H52 , &H4A , &H46 , &H42 , &H42 , &H00       '  code 78 (N)
   Data &H18 , &H24 , &H42 , &H42 , &H42 , &H24 , &H18 , &H00       '  code 79 (O)
   Data &H78 , &H44 , &H44 , &H44 , &H78 , &H40 , &H40 , &H00       '  code 80 (P)
   Data &H18 , &H24 , &H42 , &H42 , &H4A , &H24 , &H1C , &H02       '  code 81 (Q)
   Data &H78 , &H44 , &H44 , &H78 , &H50 , &H48 , &H44 , &H00       '  code 82 (R)
   Data &H38 , &H44 , &H40 , &H38 , &H04 , &H44 , &H38 , &H00       '  code 83 (S)
   Data &H7C , &H10 , &H10 , &H10 , &H10 , &H10 , &H10 , &H00       '  code 84 (T)
   Data &H42 , &H42 , &H42 , &H42 , &H42 , &H42 , &H3C , &H00       '  code 85 (U)
   Data &H42 , &H42 , &H42 , &H24 , &H24 , &H18 , &H18 , &H00       '  code 86 (V)
   Data &H49 , &H49 , &H55 , &H55 , &H55 , &H22 , &H22 , &H00       '  code 87 (W)
   Data &H48 , &H48 , &H30 , &H30 , &H30 , &H48 , &H48 , &H00       '  code 88 (X)
   Data &H44 , &H28 , &H28 , &H10 , &H10 , &H10 , &H10 , &H00       '  code 89 (Y)
   Data &H78 , &H08 , &H10 , &H20 , &H20 , &H40 , &H78 , &H00       '  code 90 (Z)

   Data &H18 , &H18 , &H24 , &H24 , &H7E , &H42 , &H42 , &H00       ' сode 192(А)
   Data &H7C , &H40 , &H40 , &H7C , &H42 , &H42 , &H7C , &H00       '  code 193 (Б)
   Data &H78 , &H44 , &H44 , &H78 , &H44 , &H44 , &H78 , &H00       '  code 194 (В)
   Data &H7C , &H44 , &H40 , &H40 , &H40 , &H40 , &H40 , &H00       '  code 195 (Г)
   Data &H38 , &H48 , &H48 , &H48 , &H48 , &HFC , &H84 , &H00       '  code 196 (Д)
   Data &H7C , &H40 , &H40 , &H78 , &H40 , &H40 , &H7C , &H00       '  code 197 (Е)
   Data &H92 , &H92 , &H54 , &H38 , &H54 , &H92 , &H92 , &H00       ' сode 198 (Ж)
   Data &H70 , &H08 , &H08 , &H30 , &H08 , &H08 , &H70 , &H00       '  code 199 (З)
   Data &H42 , &H42 , &H46 , &H4A , &H52 , &H62 , &H42 , &H00       '  code 200 (И)
   Data &H52 , &H42 , &H46 , &H4A , &H52 , &H62 , &H42 , &H00       '  code 201 (Й)
   Data &H44 , &H48 , &H50 , &H60 , &H50 , &H48 , &H44 , &H00       '  code 202 (К)
   Data &H3C , &H64 , &H44 , &H44 , &H44 , &H44 , &HC4 , &H00       '  code 203 (Л)
   Data &HC6 , &HC6 , &HAA , &HAA , &H92 , &H92 , &H82 , &H00       '  code 204 (М)
   Data &H42 , &H42 , &H42 , &H7E , &H42 , &H42 , &H42 , &H00       '  code 205 (Н)
   Data &H18 , &H24 , &H42 , &H42 , &H42 , &H24 , &H18 , &H00       '  code 206 (О)
   Data &H7e , &H42 , &H42 , &H42 , &H42 , &H42 , &H42 , &H00       '  code 207 (П)
   Data &H78 , &H44 , &H44 , &H44 , &H78 , &H40 , &H40 , &H00       '  code 208 (Р)
   Data &H1C , &H22 , &H40 , &H40 , &H40 , &H22 , &H1C , &H00       '  code 209 (С)
   Data &H7C , &H10 , &H10 , &H10 , &H10 , &H10 , &H10 , &H00       '  code 210 (T)
   Data &H44 , &H44 , &H44 , &H3C , &H04 , &H04 , &H38 , &H00       '  code 211 (У)
   Data &H08 , &H3E , &H49 , &H49 , &H49 , &H3E , &H08 , &H00       '  code 212 (Ф)
   Data &H42 , &H24 , &H18 , &H18 , &H18 , &H24 , &H42 , &H00       '  code 213 (Х)
   Data &H44 , &H44 , &H44 , &H44 , &H44 , &H44 , &H3E , &H02       '  code 214 (Ц)
   Data &H44 , &H44 , &H44 , &H3C , &H04 , &H04 , &H04 , &H00       '  code 215 (Ч)
   Data &H49 , &H49 , &H49 , &H49 , &H49 , &H49 , &H7F , &H00       '  code 216 (Ш)
   Data &H49 , &H49 , &H49 , &H49 , &H49 , &H49 , &H7F , &H01       '  code 217 (Щ)
   Data &H70 , &H10 , &H10 , &H1C , &H12 , &H12 , &H1C , &H00       '  code 218 (Ъ)
   Data &H42 , &H42 , &H42 , &H72 , &H4A , &H4A , &H72 , &H00       '  code 219 (Ы)
   Data &H80 , &H80 , &H80 , &HF0 , &H88 , &H88 , &HF0 , &H00       '  code 220 (Ь)
   Data &H78 , &H04 , &H02 , &H3E , &H02 , &H04 , &H78 , &H00       '  code 221 (Э)
   Data &H46 , &H49 , &H49 , &H79 , &H49 , &H49 , &H46 , &H00       '  code 222 (Ю)
   Data &H3C , &H44 , &H44 , &H3C , &H24 , &H44 , &H44 , &H00       '  code 223 (Я)

Отредактировано Александр Д. (2026-04-20 17:10:41)

0

84

Для шрифта 16*16
Сам шрифт не помещается: форум ругается на большой файл((

PS
проверено в версиях BASCOM 2079-2085

Код:
$regfile = "m32adef.dat"
$crystal = 8000000
$hwstack = 128
$swstack = 128
$framesize = 128

$baud = 115200

Dim Temp As Byte
Dim Temp_w As Word

Dim Font_bold , Invers_font As Byte
Dim Lcd_m , Lcd_lf , Lcd_rt , Glcd_data , Lcd_cnt As Byte
Dim Lcdstr$ As String * 16
Dim Simvol_1$ As String * 1
Dim Lcd_w1 As Word
Dim Lcdx , Lcdy , X_lcd , Y_lcd , Lcd_temp As Byte

'Графический ЖКИ 128*64 с контроллером ST7920
'Подключено последовательной шиной, вывод 15 (Psb) подключить на минус. Вывод 4  на +5в
Sid_glcd Alias Portd.5 : Config Sid_glcd = Output           ' data
Sclk_glcd Alias Portd.7 : Config Sclk_glcd = Output         ' clock
Gosub Init_st7920                                           ' ---  Инициализация ST7920


Gosub Lcdimgcls                                             ' очистка графической памяти ЖКИ

Lcdstr$ = "ПРИВЕТ," : Y_lcd = 0 : X_lcd = 0 : Gosub Print_lcd
Lcdstr$ = " АНДРЕЙ!" : Y_lcd = 1 : X_lcd = 0 : Gosub Print_lcd
Lcdstr$ = "ST7920" : Y_lcd = 2 : X_lcd = 0 : Font_bold = 1 : Gosub Print_lcd
Lcdstr$ = "С.ПОСАД" : Y_lcd = 3 : X_lcd = 0 : Gosub Print_lcd
End

'======================================================================
Print_lcd:                                                  ' по вертикали 0-7 симв., по гориз.- 0-7 блоков
   ' Преобразуем номера позиции в физический адрес памяти ЖКИ

  Y_lcd = Y_lcd * 2

  If Y_lcd > 3 Then                                         ' нижняя половина ЖКИ
    X_lcd = X_lcd + 8
    Y_lcd = Y_lcd - 4
  End If
  Lcdx = X_lcd + 128

  Y_lcd = Y_lcd * 8 : Y_lcd = Y_lcd + 128

  For Lcd_cnt = 1 To Len(lcdstr$)
    Simvol_1$ = Mid(lcdstr$ , Lcd_cnt , 1) : Lcd_m = Asc(simvol_1$) -32       ' До "пробела" нет символов
    If Lcd_m > 159 Then Lcd_m = Lcd_m - 101                 ' Убрали из таблицы маленькие английские и русские

    Lcd_w1 = Lcd_m * 28                                     ' Адрес символа

    Lcdy = Y_lcd
    For Lcd_temp = 0 To 13                                  '  8 по вертикали
      Lcd_lf = Lookup(lcd_w1 , Shrift_14x14)                ' : Print Bin(lcd_lf) ;
      Incr Lcd_w1
      Lcd_rt = Lookup(lcd_w1 , Shrift_14x14)                ' : Print Bin(lcd_rt)

      ' левая половина блока - Lf, правая половина блока = Rt
      Glcd_data = Lcdy : Gosub Lcdcommand
      Glcd_data = Lcdx : Gosub Lcdcommand                   '   X=16      16 точек по горизонтали
      Glcd_data = Lcd_lf : Gosub Lcdwrite
      Glcd_data = Lcd_rt : Gosub Lcdwrite

      Incr Lcdy
      Incr Lcd_w1
    Next
    Incr Lcdx

  Next
  Print

  Font_bold = 0
  Invers_font = 0
Return


'=========================================================
Lcdimgcls:                                                  ' --  Очистка графической памяти ST7920  --
  Lcd_m = 0
  For Lcdx = &H80 To &H8F
    For Lcdy = &H80 To &H9F
      Glcd_data = Lcdy : Gosub Lcdcommand
      Glcd_data = Lcdx : Gosub Lcdcommand
      Glcd_data = 0 : Gosub Lcdwrite
      Glcd_data = Lcd_m : Gosub Lcdwrite
    Next
  Next
Return


'=========================================================
Lcdcommand:                                                 ' Записать команду -----------------------
  Sclk_glcd = 0 : Sid_glcd = 0

  Temp = &B11111000 : Shiftout Sid_glcd , Sclk_glcd , Temp , 1 , 8       ' Команда RW=0 RS=0
  Temp = Glcd_data : Shiftout Sid_glcd , Sclk_glcd , Temp , 1 , 4       ' передаём Старшие 4 бита MSB
  Temp = 0 : Shiftout Sid_glcd , Sclk_glcd , Temp , 1 , 4   ' передаём 4 нуля

  Temp = Glcd_data : Shift Temp , Left , 4
  Shiftout Sid_glcd , Sclk_glcd , Temp , 1 , 4              ' передаём младшие 4 бита LSB
  Temp = 0 : Shiftout Sid_glcd , Sclk_glcd , Temp , 1 , 4   ' передаём 4 нуля

  Sclk_glcd = 0 : Sid_glcd = 0
Return


'========================================================
Lcdwrite:                                                   ' Записать данные -----------------------
  Sclk_glcd = 0 : Sid_glcd = 0

  Temp = &B11111010 : Shiftout Sid_glcd , Sclk_glcd , Temp , 1 , 8       ' данные RW=0 RS=1
  Temp = Glcd_data : Shiftout Sid_glcd , Sclk_glcd , Temp , 1 , 4       ' передаём Старшие 4 бита MSB
  Temp = 0 : Shiftout Sid_glcd , Sclk_glcd , Temp , 1 , 4   ' передаём 4 нуля

  Shift Glcd_data , Left , 4 : Temp = Glcd_data
  Shiftout Sid_glcd , Sclk_glcd , Temp , 1 , 4              ' передаём младшие 4 бита LSB

  Temp = 0 : Shiftout Sid_glcd , Sclk_glcd , Temp , 1 , 4   ' передаём 4 нуля

  Sclk_glcd = 0 : Sid_glcd = 0
Return


'========================================================
Init_st7920:                                                ' ---  Инициализация ST7920
  Sclk_glcd = 0 : Sid_glcd = 0
  Waitms 100                                                ' обязательно
  Glcd_data = &B_0011_0100 : Gosub Lcdcommand               ' EXTENDEN instruction
  Glcd_data = &B_0011_0000 : Gosub Lcdcommand               ' GRAGIC display Off
  Glcd_data = &B_0000_0110 : Gosub Lcdcommand               ' Entry Mode Set
  Glcd_data = &B_0000_1100 : Gosub Lcdcommand               ' Выкл Курсор и мигание символа
  Glcd_data = &B_0000_0001 : Gosub Lcdcommand               ' Clear Text Display
  Waitms 3
  Glcd_data = &B_0011_0100 : Gosub Lcdcommand               ' EXTENDEN instruction
  Glcd_data = &B_0011_0110 : Gosub Lcdcommand               ' GRAGIC display On
Return


'=========================================================
' Эта строка обязана быть последней в коде программы!
$include "font-14x14_big_eng_rus.inc"                       ' Загрузка шрифтов

Отредактировано Александр Д. (2024-03-20 07:57:03)

0

85

а внутри файла нет?
Хм.
не из той папки скопировал, пардон!

0

86

обновил код для перевернутого экрана со шрифтом 8*8, была недоработка.

+1

87

Рисование графика 0-31, в нижней части экрана
При подключении через SPI нет возможности читать GRAM в дисплее, поэтому сделал в МК маленький буфер 64 байта и через него работал.

https://upforme.ru/uploads/0000/25/b8/439/t437482.jpg

Код:
$regfile = "m16adef.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 64
$framesize = 64


Dim Tmp As Byte

Dim Disp_w As Word
Dim Lcd_rt As Byte At Disp_w Overlay
Dim Lcd_lf As Byte At Disp_w + 1 Overlay

Dim Font_bold , Invers_font , Glcd_data As Byte
Dim Lcd_w1 , Lcd_w2 As Word
Dim Lcdstr$ As String * 16 , Simvol_1$ As String * 1 , Simvol_2$ As String * 1
Dim Lcdx , Lcdy , X_lcd , Y_lcd , Lcd_cnt , Lcd_bg , Lcd_asc , Lcd_tmp As Byte

Dim Temp_massiv_9bait(9) As Byte , Znak_temperatury As Byte       ' для чтения 1wire
Dim Temperatura_single As Single
Dim Vremya , Uroven , Shagi As Byte
Dim Gradus , Nagrev , T_min , T_max As Byte

Dim Massiv(31) As Word

Const T_minus = 45                      ' --

1wire_in Alias Pinb.4 : 1wire_out Alias Portb.4
Config 1wire = 1wire_out                ' DS18B20 и резистор 4,7 ком на +5в питания


'Графический ЖКИ 128*64 с контроллером ST7920
'Подключено последовательной шиной, вывод 15 (Psb) подключить на минус. Вывод 4  на +5в
Sid_glcd Alias Portc.4 : Config Sid_glcd = Output       ' data. Вывод ЖКИ 5, (R/W)
Sclk_glcd Alias Portc.5 : Config Sclk_glcd = Output       ' clock. Вывод ЖКИ 6, (E)
Gosub Init_st7920                       ' ---  Инициализация ST7920
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

T_min = 255 : T_max = 0


Do
  Gosub Lcdimgcls                       ' очистка графической памяти ЖКИ

  Lcdstr$ = "ТЕМПЕРАТУРА:-- ;" : Y_lcd = 0 : X_lcd = 0 : Gosub Print_lcd

' Вертикальная линия, в левом углу
  For Tmp = 128 To 159                  ' Сверху вниз
    Glcd_data = Tmp : Gosub Lcdcommand  ' 128-159 Y= вертикальная колонка 2*16 Бит
    Glcd_data = 136 : Gosub Lcdcommand  ' 136-143 X= нижний левый угол дисплея

    Glcd_data = 128 : Gosub Lcdwrite    ' Левая часть
    Glcd_data = 0 : Gosub Lcdwrite      ' Правая часть
  Next

' Горизонтальная линия слева направо, внизу
  For Tmp = 136 To 143
    Glcd_data = 159 : Gosub Lcdcommand  ' 128-159 = вертикальная колонка 2*16 Бит
    Glcd_data = Tmp : Gosub Lcdcommand  ' 136-143 = нижний левый угол дисплея

    Glcd_data = 255 : Gosub Lcdwrite    ' Левая часть
    Glcd_data = 255 : Gosub Lcdwrite    ' Правая часть
  Next

  Gosub Ochistka_massiva
  Uroven = 0


  For Vremya = 0 To 127
    Gosub Zapusk_izmereniya_temperatury ' Запуск измерения температуры ds18b20
    Waitms 999
    Gosub Zamer_temperaturi             ' Считаем температуру в помещении
    Lcdstr$ = Str(gradus) : Y_lcd = 0 : X_lcd = 6 : Font_bold = 1 : Gosub Print_lcd

    If Gradus < T_min Then T_min = Gradus
    If Gradus > T_max Then T_max = Gradus
    Lcdstr$ = "МИН:" + Str(t_min) + "; МАКС:" + Str(t_max) + ";" : Y_lcd = 2 : X_lcd = 0 : Gosub Print_lcd

    Nagrev = Gradus
    If Gradus > 22 Then Nagrev = Gradus - 22
    If Nagrev > 31 Then Nagrev = 31

    Lcd_tmp = 15 - Shagi
    Massiv(nagrev).lcd_tmp = 1
    Disp_w = Massiv(nagrev)

    If Vremya < 16 Then                 ' восстановим вертикальную линию слева
      Lcd_lf = &B_1000_0000 Or Lcd_lf
    End If

    Glcd_data = 159 - Nagrev : Gosub Lcdcommand       ' 128-159 Y= вертикальная колонка 2*16 Бит
    Glcd_data = 136 + Uroven : Gosub Lcdcommand       ' 136-143 X= нижний левый угол дисплея

    Glcd_data = Lcd_lf : Gosub Lcdwrite ' Левая часть
    Glcd_data = Lcd_rt : Gosub Lcdwrite ' Правая часть


    Incr Shagi
    If Shagi > 15 Then
      Shagi = 0
      Incr Uroven
      Gosub Ochistka_massiva
    End If
  Next

Loop

End



'---------------------------------------------------------------------------------------------------
Ochistka_massiva:
  For Tmp = 1 To 31
    Massiv(tmp) = 0
  Next
Return


'---------------------------------------------------------------------------------------------------
Zapusk_izmereniya_temperatury:
  1wreset                               ' Инициализация шины 1Wire
  1wwrite &HCC                          ' Выдаем команду чтения ПЗУ
  1wwrite &H4E                          ' Установим разрядность термодатчика
  1wwrite 0
  1wwrite 0

  1wwrite &H1F                          'Configuration Register 9-BIT Mode 0.5°       94 mS

  1wreset                               ' Инициализация шины 1Wire
  1wwrite &HCC                          ' Выдаем команду чтения ПЗУ
  1wwrite &H44                          ' Запуск измерения
Return

'---------------------------------------------------------------------------------------------------
Zamer_temperaturi:                      ' Измеряем температуру
  1wreset                               ' Инициализация шины 1Wire
  1wwrite &HCC                          ' Команда чтения ПЗУ
  1wwrite &HBE                          ' Команда чтения ОЗУ датчика  Ds18b20

  Temp_massiv_9bait(1) = 1wread(9)      ' Принимаем 8 байт данных  во временный буфер
  Gradus = 255
  Znak_temperatury = 0

  If Err = 0 Then                       ' Если получили ответ датчика без ошибок

    If Temp_massiv_9bait(9) = Crc8(temp_massiv_9bait(1) , 8) Then       '   Проверяем CRC полученных данных

      ' Проверяем на отрицательную температуру. 248 в десятичном, 11111000 в двоичном.
      If Temp_massiv_9bait(2) >= 248 Then       ' Если температура отрицательная – вычитаем из &HFF
        Temp_massiv_9bait(1) = &HFF - Temp_massiv_9bait(1)
        Temp_massiv_9bait(2) = &HFF - Temp_massiv_9bait(2)
        Znak_temperatury = T_minus      '  -   температура отрицательная
      End If

      Gradus = Temp_massiv_9bait(1)
      Gradus = Tmp And &B00001111       ' оставим 4 младших бита = Т после запятой

      Shift Temp_massiv_9bait(1) , Right , 4       ' Сдвигаем первый байт вправо на 4 бита
      Shift Temp_massiv_9bait(2) , Left , 4       ' Сдвигаем второй байт влево на 4 бита

      Gradus = Temp_massiv_9bait(1) + Temp_massiv_9bait(2)       ' Формируем целую часть температуры
      Temperatura_single = Tmp * 0.0625 ' Формируем дробную часть

      Temperatura_single = Tmp + Temperatura_single       ' Итоговая температура

      If Znak_temperatury = T_minus Then       '  -   температура отрицательная
        Temperatura_single = 0 - Temperatura_single       ' Для тестов, чтобы получить отрицательную температуру
        Gradus = 0
      End If
    End If
  End If                                '  If Err = 0
Return


'======================================================================
Print_lcd:                              ' по вертикали 0-7 симв., по гориз.- 0-7 блоков
   ' Преобразуем номера позиции в физический адрес памяти ЖКИ

  If Y_lcd > 3 Then                     ' нижняя половина ЖКИ
    X_lcd = X_lcd + 8
    Y_lcd = Y_lcd - 4
  End If
  Lcdx = X_lcd + 128

  Y_lcd = Y_lcd * 8 : Y_lcd = Y_lcd + 128

  For Lcd_cnt = 1 To Len(lcdstr$)
    Simvol_1$ = Mid(lcdstr$ , Lcd_cnt , 1) : Lcd_asc = Asc(simvol_1$) -32       ' До "пробела" нет символов
    If Lcd_asc > 159 Then Lcd_asc = Lcd_asc - 101       ' Убрали из таблицы маленькие английские и русские
    Lcd_w1 = Lcd_asc * 8                ' Адрес левого символа

    Incr Lcd_cnt
    Simvol_2$ = Mid(lcdstr$ , Lcd_cnt , 1) : Lcd_asc = Asc(simvol_2$) -32
    If Lcd_asc > 159 Then Lcd_asc = Lcd_asc - 101       ' Убрали из таблицы маленькие английские и русские
    Lcd_w2 = Lcd_asc * 8                ' Адрес правого символа

    Lcdy = Y_lcd
    For Lcd_bg = 0 To 7                 '  8 по вертикали
      Lcd_lf = Lookup(lcd_w1 , Shrift_8x8)
      If Font_bold = 1 Then             ' делаем символы жирными - копируем точку правее
        Lcd_tmp = Lcd_lf : Shift Lcd_tmp , Right , 1
        Lcd_lf = Lcd_lf Or Lcd_tmp
      End If
      If Invers_font = 1 Then Toggle Lcd_lf       ' Инверсия символа и фона

      Lcd_rt = Lookup(lcd_w2 , Shrift_8x8)
      If Font_bold = 1 Then             ' делаем символы жирными - копируем точку правее
        Lcd_tmp = Lcd_rt : Shift Lcd_tmp , Right , 1
        Lcd_rt = Lcd_rt Or Lcd_tmp
      End If
      If Invers_font = 1 Then Toggle Lcd_rt       '      ' Инверсия символа и фона

      ' левая половина блока - Lf, правая половина блока = Rt
      Glcd_data = Lcdy : Gosub Lcdcommand
      Glcd_data = Lcdx : Gosub Lcdcommand       '   X=16      16 точек по горизонтали

      Glcd_data = Lcd_lf : Gosub Lcdwrite

      If Simvol_2$ <> "" Then
        Glcd_data = Lcd_rt
        Gosub Lcdwrite
      End If

      Incr Lcdy
      Incr Lcd_w1 : Incr Lcd_w2
    Next

    Incr Lcdx
  Next

  Font_bold = 0 : Invers_font = 0
Return


'=========================================================
Lcdimgcls:                              ' --  Очистка графической памяти ST7920  --
  For Lcdx = &H80 To &H8F               ' 128-135 = верх, 136-143 = низ
    For Lcdy = &H80 To &H9F             ' 128-159
      Glcd_data = Lcdy : Gosub Lcdcommand
      Glcd_data = Lcdx : Gosub Lcdcommand
      Glcd_data = 0
      Gosub Lcdwrite : Gosub Lcdwrite
    Next
  Next
Return


'=====================================================================================================
Lcdcommand:                             ' Записать команду
  Lcd_tmp = &B11111000                  ' Команда RW=0 RS=0
  Goto Lcd_sending


Lcdwrite:                               ' Записать данные
  Lcd_tmp = &B11111010
'  Goto Lcd_sending                      ' данные RW=0 RS=1


Lcd_sending:
  Lcd_asc = 8                           ' Сколько бит передать
  Gosub Lcd_tx

  Lcd_asc = 4                           ' Сколько бит передать

  Lcd_tmp = Glcd_data : Gosub Lcd_tx    ' передаём Старшие 4 бита MSB
  Lcd_tmp = 0 : Gosub Lcd_tx            ' передаём 4 нуля

  Lcd_tmp = Glcd_data : Shift Lcd_tmp , Left , 4
  Gosub Lcd_tx                          ' передаём младшие 4 бита LSB

  Lcd_tmp = 0 : Gosub Lcd_tx            ' передаём 4 нуля

  Sclk_glcd = 0 : Sid_glcd = 0
Return

Lcd_tx:
  Shiftout Sid_glcd , Sclk_glcd , Lcd_tmp , 1 , Lcd_asc       ' Dat, Clock, Var, Option[, bits, delay]
Return


'========================================================
Init_st7920:                            ' ---  Инициализация ST7920
  Sclk_glcd = 0 : Sid_glcd = 0
  Waitms 50                             ' обязательно
  Glcd_data = &B_0011_0100 : Gosub Lcdcommand       ' EXTENDEN instruction
  Glcd_data = &B_0011_0000 : Gosub Lcdcommand       ' GRAGIC display Off
  Glcd_data = &B_0000_0110 : Gosub Lcdcommand       ' Entry Mode Set
  Glcd_data = &B_0000_1100 : Gosub Lcdcommand       ' Выкл Курсор и мигание символа
  Glcd_data = &B_0000_0001 : Gosub Lcdcommand       ' Clear Text Display
  Waitms 3
  Glcd_data = &B_0011_0100 : Gosub Lcdcommand       ' EXTENDEN instruction
  Glcd_data = &B_0011_0110 : Gosub Lcdcommand       ' GRAGIC display On
Return


'=========================================================
' Эта строка обязана быть последней в коде программы!
$include "font-8x8_big_eng_rus.inc"     ' Загрузка шрифтов

Отредактировано Александр Д. (2026-04-22 08:41:14)

+1

88

два графика: вверху - АЦП, внизу - температура с DS18B20

https://upforme.ru/uploads/0000/25/b8/439/t711823.jpg

Код:
$regfile = "m16adef.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 64
$framesize = 64


Dim Tmp As Byte
Dim Tmp_w As Word

Dim Disp_w As Word
Dim Lcd_rt As Byte At Disp_w Overlay
Dim Lcd_lf As Byte At Disp_w + 1 Overlay

Dim Font_bold , Invers_font , Glcd_data As Byte
Dim Lcd_w1 , Lcd_w2 As Word
Dim Lcdstr$ As String * 16 , Simvol_1$ As String * 1 , Simvol_2$ As String * 1
Dim Lcdx , Lcdy , X_lcd , Y_lcd , Lcd_cnt , Lcd_bg , Lcd_asc , Lcd_tmp As Byte

Dim Temp_massiv_9bait(9) As Byte , Znak_temperatury As Byte       ' для чтения 1wire
Dim Temperatura_single As Single
Dim Vremya , Uroven , Shagi As Byte
Dim Gradus , Nagrev , T_min , T_max As Byte

Dim Adc_soprotivlen As Byte

Dim Provodimost_m(31) As Word
Dim Temperatura_m(31) As Word

Const T_minus = 45                      ' --

1wire_in Alias Pind.3 : 1wire_out Alias Portd.3
'1wire_in Alias Pinb.4 : 1wire_out Alias Portb.4
Config 1wire = 1wire_out                ' DS18B20 и резистор 4,7 ком на +5в питания

Config Adc = Single , Prescaler = Auto , Reference = Avcc : Start Adc       ' Настройка АЦП
Config Porta.5 = Input : Porta.5 = 0    '


'Графический ЖКИ 128*64 с контроллером ST7920
'Подключено последовательной шиной, вывод 15 (Psb) подключить на минус. Вывод 4  на +5в
Sid_glcd Alias Portc.4 : Config Sid_glcd = Output       ' data. Вывод ЖКИ 5, (R/W)
Sclk_glcd Alias Portc.5 : Config Sclk_glcd = Output       ' clock. Вывод ЖКИ 6, (E)
Gosub Init_st7920                       ' ---  Инициализация ST7920
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

T_min = 255 : T_max = 0


Do
  Gosub Lcdimgcls                       ' очистка графической памяти ЖКИ

  Lcd_bg = 128 : Gosub Razmetka_displeya       ' Если Lcd_bg = 128, то это верх
  Lcd_bg = 136 : Gosub Razmetka_displeya       ' Если Lcd_bg = 136, то это низ

  Gosub Ochistka_massiva
  Uroven = 0

'  Lcdstr$ = "--" : Y_lcd = 0 : X_lcd = 0 : Font_bold = 0 : Gosub Print_lcd
  Lcdstr$ = "--;" : Y_lcd = 4 : X_lcd = 0 : Font_bold = 0 : Gosub Print_lcd


  For Vremya = 0 To 127
    Gosub Zapusk_izmereniya_temperatury ' Запуск измерения температуры ds18b20

    Gosub Zamer_soprotivleniya          ' Измерим сопротивление
    Lcdstr$ = Str(adc_soprotivlen) + " " : Y_lcd = 0 : X_lcd = 0 : Font_bold = 0 : Gosub Print_lcd

    If Adc_soprotivlen > 31 Then Adc_soprotivlen = Adc_soprotivlen / 2       '31

    If Adc_soprotivlen < 2 Then Adc_soprotivlen = 2

    Lcd_tmp = 15 - Shagi
    Provodimost_m(adc_soprotivlen).lcd_tmp = 1
    Disp_w = Provodimost_m(adc_soprotivlen)

    If Vremya < 16 Then                 ' восстановим вертикальную линию слева
      Lcd_lf = &B_1000_0000 Or Lcd_lf
    End If

    Glcd_data = 159 - Adc_soprotivlen : Gosub Lcdcommand       ' 128-159 Y= вертикальная колонка 2*16 Бит
    Glcd_data = 128 + Uroven : Gosub Lcdcommand       ' 128-135 X= по центру дисплея

    Glcd_data = Lcd_lf : Gosub Lcdwrite ' Левая часть
    Glcd_data = Lcd_rt : Gosub Lcdwrite ' Правая часть



    Waitms 998
    Gosub Zamer_temperaturi             ' Считаем температуру в помещении
    Lcdstr$ = Str(gradus) : Y_lcd = 4 : X_lcd = 0 : Font_bold = 1 : Gosub Print_lcd

'    If Gradus < T_min Then T_min = Gradus
'    If Gradus > T_max Then T_max = Gradus
'    Lcdstr$ = "МИН:" + Str(t_min) + "; МАКС:" + Str(t_max) + ";" : Y_lcd = 2 : X_lcd = 0 : Gosub Print_lcd

    Nagrev = Gradus
    If Gradus > 22 Then Nagrev = Gradus - 22
    If Nagrev > 31 Then Nagrev = 31

    Lcd_tmp = 15 - Shagi
    Temperatura_m(nagrev).lcd_tmp = 1
    Disp_w = Temperatura_m(nagrev)

    If Vremya < 16 Then                 ' восстановим вертикальную линию слева
      Lcd_lf = &B_1000_0000 Or Lcd_lf
    End If

    Glcd_data = 159 - Nagrev : Gosub Lcdcommand       ' 128-159 Y= вертикальная колонка 2*16 Бит
    'Glcd_data = 128 + Uroven : Gosub Lcdcommand       ' 128-135 X= по центру дисплея
    Glcd_data = 136 + Uroven : Gosub Lcdcommand       ' 136-143 X= нижний левый угол дисплея

    Glcd_data = Lcd_lf : Gosub Lcdwrite ' Левая часть
    Glcd_data = Lcd_rt : Gosub Lcdwrite ' Правая часть


    Incr Shagi
    If Shagi > 15 Then
      Shagi = 0
      Incr Uroven
      Gosub Ochistka_massiva
    End If
  Next

Loop




'---------------------------------------------------------------------------------------------------
Zamer_soprotivleniya:                   ' Измерим сопротивление
  Tmp_w = Getadc(5)
  Shift Tmp_w , Right , 3               '

  Adc_soprotivlen = Tmp_w
Return


'---------------------------------------------------------------------------------------------------
Razmetka_displeya:                      ' Если Lcd_bg = 128, то это верх
' Вертикальная линия. Слева
  For Tmp = 129 To 158                  ' Сверху вниз
    Glcd_data = Tmp : Gosub Lcdcommand  ' 128-159 Y= вертикальная колонка 2*16 Бит
    Glcd_data = Lcd_bg : Gosub Lcdcommand       ' 136-143 X= нижний левый угол дисплея

    Glcd_data = 128 : Gosub Lcdwrite    ' Левая часть
    Glcd_data = 0 : Gosub Lcdwrite      ' Правая часть
  Next

  Lcd_cnt = Lcd_bg + 7
' Горизонтальная линия. Внизу
  For Tmp = Lcd_bg To Lcd_cnt           ' 128-135 = Вверху, Tmp = 136-143 = Внизу
    Glcd_data = 158
    If Lcd_bg = 136 Then Glcd_data = 159
    Gosub Lcdcommand                    ' 128-159 = вертикальная колонка 2*16 Бит

    Glcd_data = Tmp : Gosub Lcdcommand  ' 136-143 = нижний левый угол дисплея

    Glcd_data = 255 : Gosub Lcdwrite    ' Левая часть
    Glcd_data = 255 : Gosub Lcdwrite    ' Правая часть
  Next
Return


'---------------------------------------------------------------------------------------------------
Ochistka_massiva:
  For Tmp = 1 To 31
    Provodimost_m(tmp) = 0
    Temperatura_m(tmp) = 0
  Next
Return


'---------------------------------------------------------------------------------------------------
Zapusk_izmereniya_temperatury:
  1wreset                               ' Инициализация шины 1Wire
  1wwrite &HCC                          ' Выдаем команду чтения ПЗУ
  1wwrite &H4E                          ' Установим разрядность термодатчика
  1wwrite 0
  1wwrite 0

  1wwrite &H1F                          'Configuration Register 9-BIT Mode 0.5°       94 mS

  1wreset                               ' Инициализация шины 1Wire
  1wwrite &HCC                          ' Выдаем команду чтения ПЗУ
  1wwrite &H44                          ' Запуск измерения
Return

'---------------------------------------------------------------------------------------------------
Zamer_temperaturi:                      ' Измеряем температуру
  1wreset                               ' Инициализация шины 1Wire
  1wwrite &HCC                          ' Команда чтения ПЗУ
  1wwrite &HBE                          ' Команда чтения ОЗУ датчика  Ds18b20

  Temp_massiv_9bait(1) = 1wread(9)      ' Принимаем 8 байт данных  во временный буфер
  Gradus = 255
  Znak_temperatury = 0

  If Err = 0 Then                       ' Если получили ответ датчика без ошибок

    If Temp_massiv_9bait(9) = Crc8(temp_massiv_9bait(1) , 8) Then       '   Проверяем CRC полученных данных

      ' Проверяем на отрицательную температуру. 248 в десятичном, 11111000 в двоичном.
      If Temp_massiv_9bait(2) >= 248 Then       ' Если температура отрицательная – вычитаем из &HFF
        Temp_massiv_9bait(1) = &HFF - Temp_massiv_9bait(1)
        Temp_massiv_9bait(2) = &HFF - Temp_massiv_9bait(2)
        Znak_temperatury = T_minus      '  -   температура отрицательная
      End If

      Tmp = Temp_massiv_9bait(1) : Tmp = Tmp And &B00001111       ' оставим 4 младших бита= Т после запятой
      Temperatura_single = Tmp * 0.0625 ' Формируем дробную часть

      Shift Temp_massiv_9bait(1) , Right , 4       ' Сдвигаем первый байт вправо на 4 бита
      Shift Temp_massiv_9bait(2) , Left , 4       ' Сдвигаем второй байт влево на 4 бита
      Gradus = Temp_massiv_9bait(1) + Temp_massiv_9bait(2)       ' Формируем целую часть температуры

      Temperatura_single = Tmp + Temperatura_single       ' Итоговая температура

      If Znak_temperatury = T_minus Then       '  -   температура отрицательная
        Temperatura_single = 0 - Temperatura_single       ' Для тестов, чтобы получить отрицательную температуру
        Gradus = 0
      End If
    End If
  End If                                '  If Err = 0
Return


'======================================================================
Print_lcd:                              ' по вертикали 0-7 симв., по гориз.- 0-7 блоков
   ' Преобразуем номера позиции в физический адрес памяти ЖКИ

  If Y_lcd > 3 Then                     ' нижняя половина ЖКИ
    X_lcd = X_lcd + 8
    Y_lcd = Y_lcd - 4
  End If
  Lcdx = X_lcd + 128

  Y_lcd = Y_lcd * 8 : Y_lcd = Y_lcd + 128

  For Lcd_cnt = 1 To Len(lcdstr$)
    Simvol_1$ = Mid(lcdstr$ , Lcd_cnt , 1) : Lcd_asc = Asc(simvol_1$) -32       ' До "пробела" нет символов
    If Lcd_asc > 159 Then Lcd_asc = Lcd_asc - 101       ' Убрали из таблицы маленькие английские и русские
    Lcd_w1 = Lcd_asc * 8                ' Адрес левого символа

    Incr Lcd_cnt
    Simvol_2$ = Mid(lcdstr$ , Lcd_cnt , 1) : Lcd_asc = Asc(simvol_2$) -32
    If Lcd_asc > 159 Then Lcd_asc = Lcd_asc - 101       ' Убрали из таблицы маленькие английские и русские
    Lcd_w2 = Lcd_asc * 8                ' Адрес правого символа

    Lcdy = Y_lcd
    For Lcd_bg = 0 To 7                 '  8 по вертикали
      Lcd_lf = Lookup(lcd_w1 , Shrift_8x8)
      If Font_bold = 1 Then             ' делаем символы жирными - копируем точку правее
        Lcd_tmp = Lcd_lf : Shift Lcd_tmp , Right , 1
        Lcd_lf = Lcd_lf Or Lcd_tmp
      End If
      If Invers_font = 1 Then Toggle Lcd_lf       ' Инверсия символа и фона

      Lcd_rt = Lookup(lcd_w2 , Shrift_8x8)
      If Font_bold = 1 Then             ' делаем символы жирными - копируем точку правее
        Lcd_tmp = Lcd_rt : Shift Lcd_tmp , Right , 1
        Lcd_rt = Lcd_rt Or Lcd_tmp
      End If
      If Invers_font = 1 Then Toggle Lcd_rt       '      ' Инверсия символа и фона

      ' левая половина блока - Lf, правая половина блока = Rt
      Glcd_data = Lcdy : Gosub Lcdcommand
      Glcd_data = Lcdx : Gosub Lcdcommand       '   X=16      16 точек по горизонтали

      Glcd_data = Lcd_lf : Gosub Lcdwrite

      If Simvol_2$ <> "" Then
        Glcd_data = Lcd_rt
        Gosub Lcdwrite
      End If

      Incr Lcdy
      Incr Lcd_w1 : Incr Lcd_w2
    Next

    Incr Lcdx
  Next

  Font_bold = 0 : Invers_font = 0
Return


'=========================================================
Lcdimgcls:                              ' --  Очистка графической памяти ST7920  --
  For Lcdx = &H80 To &H8F               ' 128-135 = верх, 136-143 = низ
    For Lcdy = &H80 To &H9F             ' 128-159
      Glcd_data = Lcdy : Gosub Lcdcommand
      Glcd_data = Lcdx : Gosub Lcdcommand
      Glcd_data = 0
      Gosub Lcdwrite : Gosub Lcdwrite
    Next
  Next
Return


'=====================================================================================================
Lcdcommand:                             ' Записать команду
  Lcd_tmp = &B11111000                  ' Команда RW=0 RS=0
  Goto Lcd_sending


Lcdwrite:                               ' Записать данные
  Lcd_tmp = &B11111010
'  Goto Lcd_sending                      ' данные RW=0 RS=1


Lcd_sending:
  Lcd_asc = 8                           ' Сколько бит передать
  Gosub Lcd_tx

  Lcd_asc = 4                           ' Сколько бит передать

  Lcd_tmp = Glcd_data : Gosub Lcd_tx    ' передаём Старшие 4 бита MSB
  Lcd_tmp = 0 : Gosub Lcd_tx            ' передаём 4 нуля

  Lcd_tmp = Glcd_data : Shift Lcd_tmp , Left , 4
  Gosub Lcd_tx                          ' передаём младшие 4 бита LSB

  Lcd_tmp = 0 : Gosub Lcd_tx            ' передаём 4 нуля

  Sclk_glcd = 0 : Sid_glcd = 0
Return

Lcd_tx:
  Shiftout Sid_glcd , Sclk_glcd , Lcd_tmp , 1 , Lcd_asc       ' Dat, Clock, Var, Option[, bits, delay]
Return



'========================================================
Init_st7920:                            ' ---  Инициализация ST7920
  Sclk_glcd = 0 : Sid_glcd = 0
  Waitms 50                             ' обязательно
  Glcd_data = &B_0011_0100 : Gosub Lcdcommand       ' EXTENDEN instruction
  Glcd_data = &B_0011_0000 : Gosub Lcdcommand       ' GRAGIC display Off
  Glcd_data = &B_0000_0110 : Gosub Lcdcommand       ' Entry Mode Set
  Glcd_data = &B_0000_1100 : Gosub Lcdcommand       ' Выкл Курсор и мигание символа
  Glcd_data = &B_0000_0001 : Gosub Lcdcommand       ' Clear Text Display
  Waitms 3
  Glcd_data = &B_0011_0100 : Gosub Lcdcommand       ' EXTENDEN instruction
  Glcd_data = &B_0011_0110 : Gosub Lcdcommand       ' GRAGIC display On
Return


'=========================================================
' Эта строка обязана быть последней в коде программы!
$include "font-8x8_big_eng_rus.inc"     ' Загрузка шрифтов

0


Вы здесь » Программирование ATMEL в BASCOM. » Дисплеи и индикация » ST7920 графический ЖКИ 128*64 и Bascom