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

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

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

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



I2c display

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

1

Попался мне в руки старый дисплей, общается он по i2c. Дисплей 10ти знаковый, однострочный, на плате надпись 1999года выпуска. Где он раньше стоял, даже не знаю. Даташита на контроллер дисплея нет. Воообще нет. Немного поюзав его 25тинькой, понял, что байты символов дисплея не стандартные как у дисплея 1602. И засылаются символы вот по этому коду:

Код:

Do
I2cstart 
I2cwbyte &H9B 'Адрес дисплея

I2cwbyte &H85 'буква B
I2cwbyte &H40 ' "пробел"
I2cwbyte &H85 'буква B
I2cwbyte &H40 ' "пробел"
I2cwbyte &H85 'буква B
I2cwbyte &H40 ' "пробел"
I2cwbyte &H85 'буква B
I2cwbyte &H40 ' "пробел"
I2cwbyte &H85 'буква B
I2cwbyte &H40 ' "пробел"

I2cstop 

Loop
End


на экране видим вот такую надпись "B B B B B "

Вопрос: как на такой дисплей отправить текст целиком? Без кодов символов типа &Н85.
Наверно нужно что-то типа этого:

Код:
dim A as string*10
A="welcome"
Do
I2cstart
I2cwbyte &H9B
I2cwbyte A
I2cstop
Loop
End

но такой вариант не годится, дисплей ничего не кажет
Подскажите, пожалуйста)

Отредактировано Octav (2017-03-12 11:12:10)

0

2

Можно так:

Text = "Bascom test"

I2cstart
I2cwbyte &H9B   'Адрес дисплея

For N = 1 To Len(text)
    Buff = Mid(text , N , 1)
    I2cwbyte Asc(buff)                                       
Next

I2cstop

0

3

Yuriy.pv
дисплей не показывает

Код:
Dim Tx As String * 10
Tx = "bascomTest"
Dim N As Byte
DO
I2cstart
I2cwbyte &H9B
For N = 1 To Len(tx)
Tx = Mid(tx , N , 1)
I2cwbyte Asc(tx)
Next
I2cstop
LOOP

0

4

А вот с таким кодом заработало)))

Код:
Dim Tx As String * 10 , N As Byte
Tx = "bbbbbbbbbb"
Dim Tex(10) As String * 1
Start Adc
Do
I2cstart
I2cwbyte &H9B
For N = 1 To 10
Tex(n) = Mid(tx , N , 1)
I2cwbyte Tex(n)
Next
I2cstop
Loop

НО!!! На экране выводятся НЕ буквы "bbbbbbbbbb",
на экране цифры!! "1111111111"
Как я уже говорил, коды символов современных ASCII
не совпадают с теми что в памяти дисплея
Можно ли их как перекодировать???

0

5

не знаю как воспринимает ваш дисплей строковые данные

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

Tex(n) = Mid(tx , N , 1)
I2cwbyte Tex(n)

да и вообще I2cwbyte  может такое передать..

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

А вот с таким кодом заработало)))

НО!!! На экране выводятся НЕ буквы "bbbbbbbbbb",
на экране цифры!! "1111111111"
Как я уже говорил, коды символов современных ASCII
не совпадают с теми что в памяти дисплея
Можно ли их как перекодировать???


только свою таблицу делать, хотя стандарты должны быть, это ж не самопал..

0

6

А если так ?

...
Dim A As Byte
Dim Tex(10) As String * 1
Start Adc
Do
I2cstart
I2cwbyte &H9B
For N = 1 To 10
Tex(n) = Mid(tx , N , 1)
A = Asc(Tex(n)) + ???
I2cwbyte A
...

Отредактировано Nord (2017-03-13 18:58:08)

0

7

Yuriy.pv
А есть какое-нибудь руководство по созданию? может у меня получится

Nord
Я нечто подобное пробовал, правда результат не дало,  но  я ещё попытаюсь

0

8

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

Я нечто подобное пробовал, правда результат не дало,  но  я ещё попытаюсь

Я когда изучал содержимое знакогенератора дисплея с китайским наполнением в цикле выводил в двух строках код символа и сам символ.
Паузы между выводом в 5 сек вполне хватало для записи (и зарисовки) на листочек увиденного...

В вашем случае можно выводить их поочередно: код-пауза-символ ... пауза ... код-пауза-символ ...

Топорно, конечно, но за 5-7мин будете знать весь знакогенератор.

0

9

можно через case

select case символ

case 66: символ= &H85     'буква B
...
...
end select

0

10

Yuriy.pv написал(а):

можно через case
            select case символ
             case 66: символ= &H85     'буква B ... ...end select

Способ не важен, главное - увидеть на дисплее код символа и сам символ.
Просто число, 38 например, дисплей покажет ?
Или число тоже надо по одной цифре выводить ? ;)

0

11

А такой вариант попробуйте

Dim Buff As String * 1
Dim text As String * 10
Dim len_ as byte
Dim N as byte
Dim temp as byte

text = "test"
Len_=Len(text)

I2cstart
I2cwbyte &H9B   'Адрес дисплея

For N = 1 To Len_
    Buff = Mid(text , N , 1)
    temp=Asc(buff)
    temp=Hex(temp)     
    I2cwbyte temp
   waitms 10                                       
Next

I2cstop

0

12

Nord
да,  Я все символы прочел, число 38: 3=&h67, 8=&h70

Yuriy.pv
спасибо, попробую.

Я решил этот дисплей воткнуть в блок питания чтоб  напругу показывал.

0

13

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

Nordда,  Я все символы прочел, число 38: 3=&h67, 8=&h70

Я правильно понял, что для вывода на дисплей числа "38" требуется поочередно слать "3" и "8", а то еще и задом наперед ?
Прикольно...
Тогда как напругу на БП показывать ? ;)
Конвертить в строку и посимвольно...? ;)

0

14

Nord
да, видимо это единственный вариант :D

Отредактировано Octav (2017-03-13 21:49:34)

0

15

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

да, видимо это единственный вариант

Занятная игрушка... ;)
А позиционирование (Locate) он как-то поддерживает ?
Не пробовалась такая возможность ?

0

16

Nord
вроде как нет, но я в качестве эксперимента попробую

0

17

Кстати, я вот что заметил, поскольку дисплей имеет десять знакомест, то и засылать в него нужно строго 10байт, то есть (может из-за неграмотности криво обьясню) допустим засылаем в него "Test" - 4буквы - 4 байта, до десяти не хватает 6байт - итог: дисплей ничего не покажет

0

18

Готово парни)))) написал черновой код, теперь дисплей кажет то что мне нужно
А именно буковки из строчки "Tx"))) Сфоткал бы, да камера треснута на мобиле
Создал библиотеку, немного подправил код и собственно теперь он такой))))

Код:
Dim Tx As String * 10 , N As Byte , F As Byte
Tx = "ABCDEFGHIJ"
Dim Tex(10) As String * 1
Declare Sub Libr
Dim Z As Byte
Do
I2cstart
I2cwbyte &H9B    'addres
For N = 1 To 10
Tex(n) = Mid(tx , N , 1)
 F = Tex(n)
 Call Libr
I2cwbyte Z
Next
I2cstop
Loop
Sub Libr
If F = &H41 Then 'letter A "new" ASCII
Z = &H83            'letter A "old" ASCII
Else
If F = &H42 Then 'letter B "new" ASCII
Z = &H85           'letter B "old" ASCII
Else
If F = &H43 Then 'letter C "new" ASCII
Z = &H86            'letter C "old" ASCII
Else
If F = &H44 Then  'letter D "new" ASCII
Z = &H89            'letter D "old" ASCII
Else
If F = &H45 Then  'letter E "new" ASCII
Z = &H8A            'letter E "old" ASCII
Else
If F = &H46 Then  'letter F "new" ASCII
Z = &H8C            'letter F "old" ASCII
Else
If F = &H47 Then  'letter G "new" ASCII
Z = &H8F            'letter G "old" ASCII
Else
If F = &H48 Then  'letter H "new" ASCII
Z = &H91             'letter H "old" ASCII
Else
If F = &H49 Then   'letter I "new" ASCII
Z = &H92             'letter I "old" ASCII
Else
If F = &H4A Then  'letter J "new" ASCII
Z = &H94             'letter J "old" ASCII
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End Sub

0

19

Хм...... а как мне готовое значение АЦП в строку засунуть?
То есть:

Код:
Dim Stroka as String*4
Dim V as Single
Start adc
Do
V = Getadc(1)
--тут строки преобразования--
V = 15.2  ' переменная V=15,2 вольт
Stroka = V     ' разве так можно???
или
Stroka = "V"    ' так точно нельзя
Stroka = "15.2"    ' тоже нельзя и значение меняться не будет


Чёт я в замешательстве.... :confused:

0

20

Есть замечательные функции перевода переменных из одного вида в другой.
str(x) переводит переменную х в символьную величину
val(x) тоже самое только в числовую величину

Stroka = str(V) - вот так можно  :)

Отредактировано pavel1969 (2017-03-14 03:09:03)

0

21

Вот тут как раз удобнее использовать Select...Case, как предлагал Yuriy.pv

Подготовка строки:
- переводим значение в строку
- определяем длину получившейся строки. При применении форматирования пункт пропускаем.
- добавляем вначале и в конце пробелы, чтоб получить 10 символов
- выгоняем посимвольно в индикатор

0

22

Читаю справочник  по bascom Кулиша и что-то не могу понять как мне переписать библиотеку Libr с If-else на Select Case. Только если в каждый Сase тоже If-else прописывать. ? :dontknow:

Отредактировано Octav (2017-03-14 11:17:23)

0

23

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

Читаю справочник  по bascom Кулиша и что-то не могу понять как мне переписать библиотеку Libr с If-else на Select Case. Только если в каждый Сase тоже If-else прописывать. ?
            Отредактировано Octav (Сегодня 11:17:23)

А как иначе ? ;)

Sub Libr
Select Case F
Case &H41: Z = &H83  'letter A "new" ASCII
Case &H42: Z = &H85  'letter B "new" ASCII
...
End Select

0

24

Nord
точно!!!! Select case F! А я думал select case Z и ведь подозревал что не логично как-то  :D
Спасибо :cool:

0

25

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

А как иначе?

Data + Lookup.

0

26

Пётр написал(а):

Data + Lookup.

Это уже для продвинутых... ;)

0