Програмування виводу на індикатор Bascom-8051

Компілятор Bascom забезпечує виведення на символьний індикатор значень числових змінних і символьних рядків у всіх можливих варіантах Синтаксис операторів виводу даних і команд управління курсором досить простий і не вимагає додаткових, більш докладних пояснень, чому це зроблено вище Однак потрібно зауважити, що побудова системи відображення даних є більш складним завданням, ніж застосування послідовності операторів виводу Проектовані пристрої з символьним індикатором повинні відповідати вимогам ергономіки, що включає обовязкове форматування і позиціонування виведених цифрових даних і повідомлень З урахуванням цього, розглянемо практичні питання побудови та програмування системи відображення інформації Як звичайно, перед початком програмування потрібно розробити план системи відображення, що включає в себе наступні складові, перелічені в порядку черговості:

а) визначити число і розрядність, відображуваних параметрів (числових) Необхідно, хоча б приблизно, визначити формати відображення даних, щоб зарезервувати місце для десяткового дробу, знака полярності та прогалин-роздільників При відображенні числових даних потрібно рішуче позбавлятися

від надмірності – виключати незначущі розряди (за межами точності або нестабільні)

б) визначити номенклатуру і число, одночасно відображуваних параметрів (змінних)

в) визначити атрибути зображення (вибрати повідомлення або символи розмірності числових параметрів, роздільників полів даних, вибрати або розробити спеціальні символи)

г) придумати всі текстові повідомлення таким чином, щоб вони були короткими, приблизно однієї довжини і зрозумілі Настійно рекомендується застосовувати тільки латинський алфавіт тому, що коди

кириличних шрифтів і наборів символів (вище 7Fh) відрізняються у різних виготовлювачів індикаторів

д) визначити число і розташування полів даних Для правильного сприйняття інформації, що відображається розташування і розмір полів даних повинен бути фіксованим, включаючи і поле для текстових повідомлень Так як текстові повідомлення зазвичай зявляються на короткий час (постійно не відображаються), краще їх розміщувати на полях малозначних (другорядних) параметрів і таким чином економити місце Найбільш важливі параметри потрібно розташовувати в середині робочого поля Менш важливі повідомлення по краях, на периферії З огляду на те, що всі символи мають однаковий розмір, для поліпшення сприйняття, розмір полів більш важливих параметрів (повідомлень) повинен бути більше, ніж у менш важливих навіть шляхом використання абревіатур останніх В якості роздільників полів даних рекомендується застосовувати прогалини і (або) спеціальні знаки у вигляді вертикальних і горизонтальних пунктирних ліній

е) провести вибір типу символьного індикатора Краще застосовувати модулі індикації стандартних розмірів і найбільш вживаних форматів (у порядку переваги): 16 символів х 2 рядки, 20 х 2, 20 х 4, 16 х 1, 24 х 2, 40 х 4 Вони доступніші, завжди дешевше, мають кращі світлотехнічні параметри (частіше удосконалюються в процесі виробництва) Індикатори унікальних типорозмірів, як правило, тільки заявлені виробником і виробляються за спеціальним замовленням Краще використовувати індикатори зі світлодіодним підсвічуванням (вони дає постійну контрастність зображення при будь-якому освітленні) з чорними знаками на жовтому полі – виконання для стандартного температурного діапазону Не рекомендується без необхідності застосовувати індикатори, призначені для розширеного температурного діапазону (вони мають помітно меншу контрастність і кут видимості)

ж) важливо вибрати спосіб підключення індикатора до мікроконтролера При інтенсивному використанні індикатора, наприклад, для випадків повного оновлення всіх даних індикатора кілька раз в секунду (це характерно для вимірювальних систем), і для модулів з числом знайомий більше 32 необхідне застосування 8-розрядної шини, інакше регенерація зображення стане помітною (зявляється ефект зниження контрастності і «паразитного світіння» невикористовуваних знакомест)

з) ще раз змоделювати (на папері) можливість розташування і читаність на обраному індикаторі всіх можливих повідомлень при всіх можливих комбінаціях і режимах Уточнити формати індикації параметрів, текстові повідомлення, атрибути, абревіатури, намагаючись максимально використовувати загальноприйняті позначення і терміни

Наступне питання – програмування зображень Існують два підходи до формування зображення на індикаторі:

а) щоразу при оновленні даних, очищати поле індикації і потім заповнювати його даними,

залежними від поточного стану виведених змінних Принципово те, що в цьому випадку не проводиться аналіз і виявлення змінених даних Переваги такого підходу полягають в тому, що формування і виведення даних в індикатор легко зосередити в рамках однієї універсальної процедури та

зробити регулярним, зі швидкістю зручній для сприйняття (кілька разів на секунду) При цьому процеси

формування даних і відображення даних стають незалежними і паралельними, що також дуже зручно Недолік – підвищені вимоги до швидкодії інтерфейсу індикаторного модуля і наявність короткочасного стану невизначеності даних (старе зображення стерто, а нове ще не записане) Якщо цей час перевищує 5-10 мс (більше одного періоду частоти сканування всіх сегментів), то стає видимим «мелькання» сегментів з частотою оновлення даних

б) оновлювати тільки змінюються дані Переваги такого підходу – немигаючим зображення, відсутність проблем зі способом підключення індикатора Недоліки – ускладнення програмного інтерфейсу (він розсипається на безліч процедур по числу відображуваних змінних), висновок стає нерегулярним (з частотою зміни відображуваних змінних), обробка зміни стану змінної, в свою чергу, гальмується процедурою виведення в індикатор (одиниці мілісекунд) Область застосування – індикатори з числом більше 40 знаків і системи з нерегулярним оновленням інформації, наприклад, при надходженні одиночних подій

Нижче представлена ​​велика демонстраційна програма, в якій вирішуються декілька проблем виведення цифрових даних

‘————————————————————–

‘Демонстраційна програма виведення даних в символьний індикатор

‘Показує, як формується свідчення на індикаторі

‘Вимірювального приладу – мультиметра, що працює в пяти режимах

‘І має на кожному по пять меж вимірювання Всі межі

‘Вимірювання пронумеровані від 0 до 24 (наскрізна нумерація)

‘Програма побудована так, що всі режими індикації привязані

‘До змінної Rang, визначальною номер межі Дані АЦП

‘І межа змінюються після циклу індикації (кожні 2 секунди)

‘XXX: ± XXXXXX XX три знаки режиму роботи        ^    ^ ^     ^

‘Полярності для сигналів пост струму _ | | | цифрове значення                     | | Розмірність показань                       |

‘————————————————————–

$ Large велика модель памяті

Dim B_nd As Bit біт Нові дані Dim B_tim As Bit біт Минуло 10 мс Dim Cnt As Byte лічильник мс

Dim Tmp As Byte тимчасові байтові дані

Dim Rang As Byte це номер меж

Dim Fld As Single дані АЦП – Виміряне значення

Dim Rfld As Single індіціруемие дані

Dim Temp As String * 10 тимчасова рядок

‘Увага При меншій довжині Temp програма «залазить» в стек

‘————————————————————–

‘Підключення індикатора

‘————————————————- ————- Config Lcd = 16 * 2 розмір індикатора

Config Lcdpin, Db4 = P14, Db5 = P15, Db6 = P16, Db7 = P17, E = P32, Rs = P34 лінія P33 не використовується – її треба заземлювати

‘————————————————————– Config Timer0 = Timer , Gate = Internal , Mode = 1 : Start Timer0

On Timer0 Timer_0_int Nosave вектор переривання

Enable Interrupts взагалі дозволити переривання Enable Timer0 дозволити переривання таймера 0 ! ————————————–

Start Timer0 : Cnt = 100 : Rang = 0 : B_nd = 1 : B_tim = 1

Deflcdchar 1,228,228,234,234,241,241,255,224 дельта

Deflcdchar 2,238,241,241,241,234,234,251,224 омега

Cls привести в дії нові символи

Cursor Off зробити невидимим курсор Lcd Multimeter Стартове вітання Wait 1

Mc:

Do головний цикл

If B_nd = 1 Then кожні 2 секунди индицировать

Reset B_nd : Goto Disp End If

If B_tim = 1 Then вважаємо 10 мс переривання

Reset B_tim : Decr Cnt

If Cnt = 0 Then

Set B_nd : Cnt = 200

Fld = Lookup(rang , _tab_mes) : Incr Rang If Rang = 25 Then

Rang = 0

End If End If

End If Loop

‘————————————————- ————- виведення даних у індикатор

Disp:

Fld = Lookup (rang, _tab_mes) вважати значення виходу

Rfld = Lookup (rang, _tab_zc) вважати масштабується константу

Rfld = Rfld * Fld обчислити в розмірності індикації

Cls очистити LCD

Gosub Lcd_attr1 вивести повідомлення про режим роботи

Tmp = Lookup (rang, _tab_polar) потрібно индицировать полярність

If Tmp = 0 Then не потрібно, якщо значення з табл = 0

$asm

Anl {rfld + 3}, # & H7f зробимо свідчення безумовно позитивними

$end Asm

Locate 1, 7 відразу поставити в позицію виведення чисел

Goto Lcd_fp і перейдемо на форматування

End If

‘Потрібно индицировать число зі знаком

Locate 1, 6 курсор в позицію виводу знаку

If Rfld < 0 Then 'яка полярність?

Goto Lcd_fn негативна – перехід

End If

Lcd + Позитивна – + на індикатор

Lcd_fp:

‘Форматування позитивного числа Вибираємо програму форматування, відповідну межі вимірювання (все це має бути записано в одну строчку або переноситься з поміччю символу подчерківателя

Goto Lcd_dat Lcd_fn:

‘Форматування негативного числа Аналогічно форматуємо,

‘Але довжина результату буде на знак більше (додасться знак мінуса)

On Rang Gosub M4

,

M2

,

M3

,

M4

,

M5

,

M4

,

M2

,

M3

,

_

M4

,

M5

,

M4

,

M2

,

M3

,

M4

,

M2

,

M4

,

_

M2

,

M3

,

M4

,

M2

,

M4

,

M2

,

M3

,

M4

,

M2

‘Відкидаємо знак мінуса і виводимо його окремо

Temp = Mid(temp , 2 , 6 ) : Lcd &quot-&quot Lcd_dat:

‘Ще одна неприємність Bascom: він не виводить незначущі нулі зліва

‘Перед десятковою крапкою крім одного Будемо виправляти і цей недолік

‘Для чого перевіримо довжину форматованої змінної

Tmp = Len(temp)

If Tmp = 5 Then довжина = 5 – відкинутий один нуль

Lcd 0 Додамо один нуль

Goto Lcd_od

End If

If Tmp = 4 Then довжина = 4 – відкинуто два нуля

Lcd 00 Додамо два нуля

Goto Lcd_od End If

If Tmp = 3 Then довжина = 3 – відкинуто три нуля

Lcd 000 Додамо три нуля

End If

Lcd_od:

Lcd Temp нарешті виводимо цифрове значення Gosub Lcd_attr2 і додаємо розмірність показань Goto Mc

‘————————————————- ————- обробка переривання таймера 0

Timer_0_int:

$asm

Mov Th0 , #&ampHD8

Mov Tl0, # & HFD вуст періоду прерів 10 мс

$end Asm

Set B_tim пройшло 10 мс

Return

‘————————————————————–

‘Підпрограма виведення повідомлення про режим роботи

Lcd_attr1:

Temp = Lookupstr (rang, _tab_att1) вважали з таблиці

Locate 1, 1: Lcd Temp: Lcd : Вивели і додали двокрапка

Return

‘————————————————- ————- підпрограма виведення повідомлення про розмірності показань Lcd_attr2:

Temp = Lookupstr (rang, _tab_att2) вважали з таблиці

Locate 1, 13: Lcd Temp вивели

Return

‘————————————————- ————- формати відображення даних мультиметра

‘DCV: ±00000 mV ±00000 V  ±00000 V  ±00000 V  ±00000 V ACV:  00000 mV  00000 V   00000 V   00000 V   00000 V Ohm:  00000 W   00000 kW  00000 kW  00000 kW  00000 MW DCI: ±00000 uA ±00000 mA ±00000 mA ±00000 mA ±00000 A ACI:  00000 uA  00000 mA  00000 mA  00000 mA  00000 A

‘————————————————- ————- підпрограми форматування показань позитивної полярності F2:

Temp = Fusing(rfld , #####) : Return F3:

Temp = Fusing(rfld , #####) : Return F4:

Temp = Fusing(rfld , #####) : Return F5:

Temp = Fusing(rfld , #####) : Return

‘Підпрограми форматування показань негативної полярності потрібне додаткове місце перед цифрами для знака мінуса M2:

Temp = Fusing(rfld , ######) : Return M3:

Temp = Fusing(rfld , ######) : Return M4:

Temp = Fusing(rfld , ######) : Return M5:

Temp = Fusing(rfld , ######) : Return

‘————————————————- ————- значення першого аттрибута – режиму вимірювань

_tab_att1:

Data &quotDCV&quot , &quotDCV&quot , &quotDCV&quot , &quotDCV&quot , &quotDCV&quot

Data &quotACV&quot , &quotACV&quot , &quotACV&quot , &quotACV&quot , &quotACV&quot Data &quotOhm&quot , &quotOhm&quot , &quotOhm&quot , &quotOhm&quot , &quotOhm&quot Data &quotDCI&quot , &quotDCI&quot , &quotDCI&quot , &quotDCI&quot , &quotDCI&quot Data &quotACI&quot , &quotACI&quot , &quotACI&quot , &quotACI&quot , &quotACI&quot

‘————————————————- ————- управління відображенням полярності: 0 – немає, 1 – є

_tab_polar:

Data

1

,

1

,

1

,

1

,

1

Data

0

,

0

,

0

,

0

,

0

Data

0

,

0

,

0

,

0

,

0

Data

1

,

1

,

1

,

1

,

1

Data

0

,

0

,

0

,

0

,

0

‘————————————————————–

‘Значення другого аттрибута – розмірності показань

_tab_att2:

Data &quot mV&quot , &quot  V&quot , &quot  V&quot , &quot  V&quot , &quot  V&quot

Data &quot mV&quot , &quot  V&quot , &quot  V&quot , &quot  V&quot , &quot  V&quot

‘Формуємо формат строкових констант з додатковим нулем даних

‘Це константи: W , kW , kW

Data & H20, & H20, 2, 0, & H20, 107, 2, 0, & H20, 107, 2, 0 це константи: kW , MW . W – це символ Омега (код 2)

Data &ampH20 , 107 , 2 , 0 , &ampH20 , 77 , 2 , 0

Data &quot uA&quot , &quot mA&quot , &quot mA&quot , &quot mA&quot , &quot  A&quot

Data &quot uA&quot , &quot mA&quot , &quot mA&quot , &quot mA&quot , &quot  A&quot

‘————————————————- ————- масштабуючі коефіцієнти, що перетворюють розмірність даних

‘До розмірності відображуваних даних з іншим становище десточкі

_tab_zc:

Data 1000 , 1 , 1 , 1 , 1 З Вольт Data 1000 , 1 , 1 , 1 , 1 З Вольт Data 1000 , 1 , 1 , 1 , 0001 З килоом

Data 1000 , 1 , 1 , 1 , 0001 З міліампер

Data 1000 , 1 , 1 , 1 , 0001 З міліампер

‘————————————————- ————- іммітіруемие виміряні значення у відповідній розмірності

_tab_mes:

Data 0001 , -19999 , -1999 , 19999 , 19999 DCV: Вольт Data 0001 , 00123 , 10000 , 10000 , 10000 ACV: Вольт Data 009999 , 19999 , 199 , 19999 , 19999 Ohm: кіло

Data 020000 , -20000 , -200 , -1900 , 200 DCI: міліампер Data 012345 , 12345 , 12345 , 12345 , 12345 ACI: міліампер ——————————————— —————–

При програмуванні виведення на індикатор (і виведення в COM-порт теж) потрібно враховувати, що завжди має місце похибка подання чисел у форматі з плаваючою точкою Похибка також виникає після арифметичних дій і перетворень в результаті невизначеності молодшого розряду мантиси, який або втрачається, або округляється Значення похибки звичайно не перевищує ± 0000012%, і набагато нижче похибки відображуваних даних При відображенні виміряних (або інших визначених) даних і записаних у форматі з плаваючою точкою, похибка подання чисел не має великого значення, тк цього не видно Однак, при індикації задаються значень чисел, наприклад, за допомогою оператора INPUT і представлених в змінних типу Single, з цим можуть виникати проблеми Наприклад, введене число 100 після обробки на індикаторі буде записано, як 99999993 З точки зору математики, нічого страшного не сталося, але для спостерігача це явище дуже неприємно і, найчастіше, незрозуміло Більш того, будучи відформатовано, що відображається значення набуде взагалі неприпустимий вигляд Наприклад, якщо, вказане вище, число 100 записати без дробової частини, то вийде 99 Щоб виключити подібні неприємності, слід застосовувати округлення чисел перед форматуванням Найпростіший метод округлення полягає в додаванні до числа значення рівного половині молодшого відображуваного розряду У нашому прикладі, щоб отримати правильне зображення, потрібно до числа 100 додати число 05 У багатьох випадках, округляти добавка може бути значно менше і, взагалі, наближатися до похибки представлення числа Так як для округлення використовується операція підсумовування, то потрібно враховувати і знак округляти числа

Розглянемо ще один спосіб форматування виведених чисел, який можна застосовувати при малому числі відображуваних розрядів (до пяти включно) Цей простий спосіб полягає в підсумовуванні відображуваного числа з іншим, свідомо великим числом, і виділенні після перетворення в символьний вид необхідної середній частині Нижче наведено приклад, що демонструє цей метод і округлення для додання зображенню суворого виду

Dim R_fld As Single

Індіціруемие дані

Dim Temp As String *

16

Тимчасова рядок

R_fld = -345678

Locate 1, 6 курсор в позицію виводу знаку

If R_fld < 0 Then 'яка полярність?

Goto Lcd_fn негативна – перехід

End If

‘Позитивне: належить відображати число в R_fld в наступному вигляді: + xxxxx

R_fld = R_fld + 1000005 додамо чимале число і добавку округлення

Temp = Str (r_fld) перетворимо в рядок

Temp = Mid (temp, 2, 6) виділимо з середини те, що потрібно – 6 символів

Lcd + Temp виведемо зі знаком полярності

Goto Lcd_e

Lcd_fn:

‘Негативне: належить відображати число в R_fld в наступному вигляді:-xxxxx R_fld = R_fld – 1000005 додамо чимале число і добавку округлення

$asm

Anl {r_fld + 3}, # & H7f зробимо свідчення безумовно позитивними

$end Asm

Temp = Str(r_fld) : Temp = Mid(temp , 2 , 6) : Lcd &quot-&quot Temp Lcd_e:

End

В останніх версіях компілятора розширені можливості функції Fusing Тепер за замовчуванням включається режим округлення і передбачена можливість додавання лідируючих нулів Однак неприємності представлення негативних чисел залишилися Коли в маску записуються лідируючі нулі, то

потрібно записати їх на один більше, ніж кількість виведених чисел перед точкою Все це демонструє

наступний приклад

$large

Dim X As Single , Y As Single , Result As Single

Dim I As Integer , Buf As String * 16

X = 142 : Y = 3157

Print X + Y = : Result = X + Y обчислення

Print Result друк результату 14569977

Buf = Fusing (result, 000000 #) Форматування рядка c округленням

Print Buf друк рядка 001452

Buf = Fusing (result, 0000 &&) З лідируючими нулями і без округлення

Print Buf друк рядка 14515 X = -12: Y = 3157

Print X + Y = : Result = X + Y обчислення

Print Result друк результату -88430004

Buf = Fusing (result, 000000 #) Форматування рядка c округленням

Print Buf друк рядка 000-88 Buf = Fusing (result, # # # # &&) Звичайне, без округлення Print Buf друк рядка -884 End

Джерело: МЛКуліш, ДОВІДНИК З ПРОГРАМУВАННЯ BASCOM-8051, Краснодар 2001

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*