Представьте себе, я её ещё не сдал, тормозят меня по страшному
Такой простой проект растянул на больше, чем пол года и двигается он, когда сам беру в руки сварочник, болгарку, шуруповёрт, краску, ключи и т.д., а когда завершу всё это слесарное, меня начинаю теребить "Почему это не работает" и на программу вообще не отводят время.
ST7920 графический ЖКИ 128*64 и Bascom
Сообщений 61 страница 88 из 88
Поделиться612015-07-28 20:01:38
Поделиться622015-07-28 22:55:27
Совет на будущее :
Заведи блокнотик, и записывай числа обещанные, сроки, и обещалки.
Потом когда спрашивают- достаешь блокнотик, и начинаешь спрашивать- Вы вот мне такого-то числа обещали к такому-то числу (вставить нужное). И Где ?
99% вопросов отпадают.
Поделиться632015-07-31 23:39:06
Блокнот это тема!!!
Кстати, а вот, работа LCD экрана в действии, отснял видео. Перетащили это чудовище на рабочее место.
Даже премию не дали, пусть сами инструкции пишут. 
Поделиться642015-08-01 04:20:20
Зачетно вышло
Поделиться652015-08-01 21:52:13
Неплохо бы вместо музыки комментарий происходящих событий послушать.
Поделиться662015-08-01 22:12:15
Титанический труд.
Без премии должно каждый месяц требовать профилактики ))) С паролем 
Отредактировано Skull (2015-08-01 22:13:30)
Поделиться672015-08-16 19:12:21
Короче теперь пол завода на меня зубы точат. Стенд выявил кучу брака по одной технологической линии. Хоть и мерит о низкое давление 0.4-1.4кг/см датчиком на 200кг/см, всё-же браку увидел очень много. Представляю, если начальство соизволит всё-же раздобыть мне 4 клапана высокого давления и два цифровых датчика давления на 8кг/см, браку будет все 90%. Грубо говоря имели меня целых два дня, оскорбляли, унижали, в итоге настоял на разборке изделия.
Изделие разобрали - брак, второе разобрали - брак и так 100шт. пришлось перебирать.
Теперь ходят и говорят: "Всё нормально было, пока это г.. не поставили".
Сейчас сам тестирую всё, но чувствую, когда будут тестировать они, брак будут отправлять и не будут перебирать, а если настою на видео наблюдении, то на заводе буду самым плохим человеком 
Поделиться682015-08-16 19:21:33
Неплохо бы вместо музыки комментарий происходящих событий послушать.
Это скоро, обзаведусь нормальной камерой.
Процесс примерно такой:
- Закрыть деврь. (проверить закрытие)
- Зажать цилиндр (определить присутствие)
- Подвести головки низкого давления
- Прижать головку низкого давления
- Подвести головку высокого давления
- Прижать головку высокого давления
- Включить гидравлический насос
- Прокачать N кол-во раз, в момент прокачки измерить время нажатия и возврата поршней изделия
- Закрыть клапаны высокого давления и сделать паузу для выравнивания давления до измерения
- Нажать сильно на поршни изделие для получения высокого давления 120кг/см, если давления небыло в любой камере, открыть клапана, переобжать головки высокого и низкого давления, поцокать клапанами и перейти к прокачки, второй раз просто вывести ошибку отсутствия давления.
- Отжать поршни и сделать паузу для выравнивания давления.
- Измерить остаточное низкое давление (целое шаманство)
- Прочистить изделие, удалить жидкости
- Проанализировать массивы, найти потери в высоком давлении за последние 15 сек.
- Найти минимумы и максимум
- Вывести результат (как графический, так и текстовый)
В сервисном меню можно проверить все выходы и входы, в том числе и АЦП
В меню настройке можно всё настроить, временные велечины (сколько жадть при закрытии, сколько дать времени на подвод головки, сколько циклов прокачки), настройка делителя АЦП, настройки фильтров и анализ данных низкого давления и т.д.
Поделиться692015-08-16 21:08:16
Стенд выявил кучу брака по одной технологической линии.
Из-за халатного отношения к работе или из-за дефектов оборудования на котором производят изделия?
Поделиться702015-08-16 23:58:44
"Всё нормально было, пока это г.. не поставили".
Как это знакомо )))) Когда я поставил на родном хлебозаводе счетчики изделий меня даже водители бить собирались ))))
А потом началась компания по дискредитации счетчика- его и тестом залепливали, и со штанги сбивали, провода резали (ессно- случайно- само перетерлось). Но самое забавное- стоит отойти он начинал неправильно считать )) Вот неправильно и все тут ) Пока стоит проверяющий рядом- считает тютя в тютю, отвернулся- расхождение в сотню-две булок хлеба ))
Так что жди встречи за проходной ))) Я отмазался только тем, что сказал "Какая разница- кто делает ? Если начальство озадачилось- счетчик там будет. А кто его сделает- неважно" Вроде подействовало.
А потом наняли новую охрану и она так прижала местных деятелей, что счетчики у них перестали быть основной проблемой ))
Советую запастись терпением и отмазкой почему это делаешь именно ты )) И готовься к дискредитационной компании. Возможно твой стенд повредят.
Поделиться712015-08-17 19:14:58
Короче теперь пол завода на меня зубы точат. Стенд выявил кучу брака по одной технологической линии
Знакомая история, сочувствую.
Поделиться722016-08-22 09:17:03
Ребята, всем привет!
Никто еще не пробовал оформить все вышесказанное про ST7920 в виде библиотеки для BASCOM-а? Сам я не пробовал - просто не умею я писать библиотеки
. Может кто-то уже занимался подобным вопросом? А то я поназаказывал на ALIEXPRESS всяких дисплеев, а лежат-то они теперь мертвым грузом... А у меня такие планы на них были...
Поделиться732016-08-26 13:41:03
А потом началась компания по дискредитации счетчика
У меня тоже самое было как под копирку на предприятии где раньше работал. Видимо проблема очень типичная!
Поделиться742016-12-03 13:22:50
Подтверждаю! На Xmega работает исправно от логического уровня 3.3 вольта 
Поделиться752017-07-05 21:41:10
Если у кого будет шум на матрице, 4,7к. на шине данных спасают.
Поделиться762018-08-09 13:50:04
Ev3658 а как подключен Ваш LCD , параллельно или по последовательной шине , и библиотекой не поделитесь с сообществом ?
Поделиться772020-10-30 23:47:18
Ev3658 библиотекой для ST7920 поделится можете? Не получается вывести штифты в графическом режиме.
Поделиться782020-11-01 10:39:08
я не делал библиотекой, использую как подпрограмму: ST7920 графический ЖКИ 128*64 и Bascom
Поделиться792020-11-02 22:45:40
Ev3658 библиотекой для ST7920 поделится можете? Не получается вывести штифты в графическом режиме.
Использую по разному, экран в целом тормозной, с кнопочным интерфейсом так вообще не вариант.
В начале программы:
$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)
Поделиться802020-11-08 14:34:05
Ev3658 Большое спасибо! Разобрался. Вывод картинки также
оформил подпрограммой. Картинки готовлю в FastLCD.
Екран действительно тормозной!
Поделиться812020-11-10 03:54:13
...Картинки готовлю в FastLCD.
....
Я написал как-то простую программу, исходник блин потерял, но она позволяет мне очень быстро генерировать всё что захочу в блок DATA.
Вот: https://yadi.sk/d/bsZ_21wIzl_ugw
(он из темы - Led матрица 32*16 для бегущей строки)
Поделиться822021-11-29 15:54:13
Не много причёсанный вариант. Основу брал с этой ветки.
'( 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
Поделиться832024-03-19 21:28:08
Сохраню себе, на всякий случай
В одном проекте пришлось перевернуть плату с дисплеем на 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)
Поделиться842024-03-19 21:32:21
Для шрифта 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)
Поделиться852024-03-20 07:55:36
а внутри файла нет?
Хм.
не из той папки скопировал, пардон!
Поделиться862026-04-20 17:11:20
обновил код для перевернутого экрана со шрифтом 8*8, была недоработка.
Поделиться872026-04-22 08:37:59
Рисование графика 0-31, в нижней части экрана
При подключении через SPI нет возможности читать GRAM в дисплее, поэтому сделал в МК маленький буфер 64 байта и через него работал.
$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)
Поделиться882026-04-27 11:22:55
два графика: вверху - АЦП, внизу - температура с DS18B20
$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" ' Загрузка шрифтов


