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

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

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

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



LCD BC1602

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

1

HELP!!! у меня неработает ЖКИ по 4 битной шине, как в bascome сконфигурировать ЖКИ по 8 битной шине.....
вот мой код

Код:
'---------------------------Тип_микроконтроллера--------------------------------
$regfile = "m16def.dat"
$crystal = 4000000
'----------------------------Конфигурация_ЖКИ-----------------------------------

Config Lcdbus = 8
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , Rs = Porta.2 , E = Porta.3

Config Lcd = 16 * 2
Cursor Off
Cls

Set Portb.0
Set Portb.1
Set Porta.0
Set Porta.1
Cn Alias Pinb.0
Cv Alias Pina.0
Vv Alias Pinb.1
M Alias Pina.1
Out_thermostat Alias Portb.4
Config 1wire = Portc.4
Config Pinb.2 = Output
Config Out_thermostat = Output

-1

2

Два метода
А.

1. Скачать с сайта уже частично переведенный файл справки
2. сохранить его в папку, в которую установлен BASCOM
3. Запустить Bascom
4. Открыть вашу программу, выбрать курсором команду Config и нажать волшебную кнопку F1 (ПОМОГАЕТ! проверено!)
5. Выбрать CONFIG LCDBUS
6. почитать, подумать, в программе изменить 8 на 4
7. изменить выводы LCD (старшие 4 бита)

8. Посмотреть код программы, подумать: а как МК узнает, что мои выводы настроены на вход или на выход?
Наверное надо указать это микроконтроллеру, или командой DDRx , или сомандой config PortX (где х - имя порта)

нажать F7 - откомпилировать\

радоваться результатам

0

3

у меня был случай с mega 164p
работаю с лсд по 4 проводам, все правильно конфигурю, лсд нивкакую, хотя на ассемблере все работает.
открываю cfg файл. а там ножки несоответствуют указываемым.
в итгоге, пока заново не создал проект, по новой все не указал не заработало.

0

4

8. Посмотреть код программы, подумать: а как МК узнает, что мои выводы настроены на вход или на выход?
Наверное надо указать это микроконтроллеру, или командой DDRx , или сомандой config PortX (где х - имя порта)

прошу больно не бить по голове :flirt: ,я только учусь программить....если можно кусочек исходника,я сразу разбирусь :hobo:

0

5

команда простая: Config PortX= Input или Output
На ввод или вывод соответственно
это для всего порта

если для отдельной ноги, то Config PortX.N= Input
где N - номер бита

0

6

команда простая: Config PortX= Input или Output

тобиш должно быть так

Код:
config portd=output

а если судить по HELPу,то так

Код:
Config Lcdpin = Pin , Port = Portd , Rs = Porta.2 , E = Porta.3

но в обоях случаях протеус ничего невыводит на lcd
голова взрывается %-)

0

7

вот код....так сказать для общей картины

Код:
'---------------------------Òèï_ìèêðîêîíòðîëëåðà--------------------------------
$regfile = "m16def.dat"
$crystal = 4000000
'----------------------------Êîíôèãóðàöèÿ_ÆÊÈ-----------------------------------
Config Portd = Output
Config Lcdbus = 8
Config Lcdpin = Pin , Rs = Porta.2 , E = Porta.3
Config Lcd = 16 * 2
Cursor Off
Cls
Set Portb.0
Set Portb.1
Set Porta.0
Set Porta.1
Cn Alias Pinb.0
Cv Alias Pina.0
Vv Alias Pinb.1
M Alias Pina.1
Out_thermostat Alias Portb.4
Config 1wire = Portc.4
Config Pinb.2 = Output
Config Out_thermostat = Output


'-----------------------------Äîïîëíèòåëüíûå_ñèìâîëû----------------------------
Deflcdchar 0 , 2 , 5 , 2 , 32 , 32 , 32 , 32 , 32

'------------------------------Ïåðåìåííûå---------------------------------------
Dim J1 As Byte
Dim M1 As Byte
Dim D1 As Byte
Dim H1 As Byte
Dim Min1 As Byte
Dim Aa As Byte
Dim X1 As Byte
Dim Weekday As Byte
Dim Pos As Byte
Dim Digit As Byte
Dim Incoming As String * 8
Dim I As Byte
Dim Stroka As String * 8
Dim Style As Byte
Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Signtemperatura As String * 1
Dim Temp As Byte
Dim Faren0 As Single
Dim Faren As Byte
Dim T2 As Byte
Dim Celsium As String * 5
Dim Fahrenhei As String * 5
Dim Ee_thermosetting As Eram Integer
Dim Ee_gisterzis As Eram Integer
Dim Thermo_setting As Integer
Dim Gis_setting As Integer
Dim T As Integer
Dim G As Integer
Dim Nag As String * 11
'------------------------------------Ïðîöåäóðû----------------------------------
Declare Sub Enterdatetime()
Declare Sub Getkey()
Declare Sub Menu()
Declare Sub Style
Declare Sub Style1
Declare Sub Gettemp
Declare Sub Thermocontrol()

'-----------------------------Îcíîâíîé_öèêë_ïðîãðàììû---------------------------
Style = 1
Thermo_setting = Ee_thermosetting
Gis_setting = Ee_gisterzis
If Thermo_setting < 50 Or Thermo_setting > 130 Then
Cls
Lcd "Error EEPROM"
End If
Cls
If Temp < Thermo_setting Then
T = 1
Nag = "NAGREV"
Else
T = 0
Nag = "OHLAZHDENIE"
End If
Do
Call Gettemp
Call Style
If M = 0 Then
Gosub Menu
End If
Call Thermocontrol
Loop
End
'-------------------------------------------------------------------------------

Sub Style
Select Case Style
Case 1 : Call Style1
End Select
End Sub
'-------------------------------------------------------------------------------
Sub Style1
Cls
Locate 1 , 1
Lcd Celsium ; Chr(0)
Locate 2 , 1
Lcd Nag
End Sub
'-------------------------------------------------------------------------------

Getdatetime:
Return
Setdate:
Ee_thermosetting = Thermo_setting
Return
Settime:
Ee_gisterzis = Gis_setting
Return
End
'-------------------------------------------------------------------------------
Sub Enterdatetime()
Cls
Aa = 0
X1 = Thermo_setting
Do
If X1 > 125 Then X1 = 50
If X1 < 50 Then X1 = 125
Locate 1 , 1
Lcd "[> Setup  <]"
Locate 2 , 1
Lcd "Termostat: " ; X1 ; "  "
Getkey
Thermo_setting = X1
Gosub Setdate
Loop Until Aa = 1
'-------------------------------------------
   Cls
   Aa = 0
   'X1 = 30
   X1 = Gis_setting
   Do
   If X1 > 20 Then X1 = 1
   If X1 < 1 Then X1 = 20
   Locate 1 , 1
   Lcd "[> Setup  <]"
   Locate 2 , 1
   Lcd "Gisterezis: " ; X1 ; " "
   Getkey
   Min1 = X1
   Loop Until Aa = 1


   Gis_setting = Min1

   Gosub Settime
End Sub
'-------------------------------------------------------------------------------
Sub Getkey()
   Waitms 300
   If Cv = 0 Then
    Incr X1
    Waitms 200
    End If
    If Cn = 0 Then
     Decr X1
    Waitms 200
    End If
   If Vv = 0 Then
   Aa = 1
    Waitms 200
   Else
   Aa = 0
     Waitms 200
   End If
End Sub
'-------------------------------------------------------------------------------
Sub Menu()

Aa = 0
Getkey
Enterdatetime
Cls
End Sub
End
'-------------------------------------------------------------------------------
Sub Gettemp
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 750
1wreset
1wwrite &HCC
1wwrite &HBE
Byte0 = 1wread()
Byte1 = 1wread()
If Byte1 >= 248 Then
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Signtemperatura = "-"
Else
Signtemperatura = "+"
End If
Temp = Byte0 / 16
T2 = Byte1 * 16
Temp = Temp + T2
Temp = Temp / 2
Celsium = Signtemperatura + Str(temp) + "C"
End Sub


Sub Thermocontrol()
If T = 1 Then
G = Thermo_setting + Gis_setting
G = G - 1
If Temp <= G Then
Out_thermostat = 1
Else
Out_thermostat = 0
T = 0
Nag = "OHLAZHDENIE"
End If
End If
If T = 0 Then
If Temp <= Thermo_setting Then
 T = 1
 Nag = "NAGREV"
End If
End If
End Sub

0

8

Судя по даташиту у этого дисплея контроллер KS0066. В настройках нашел только:

Код:
Syntax

CONFIG LCD = LCDtype , CHIPSET=KS077 | Dogm163v5 | DOG163V3 | DOG162V5 | DOG162V3 [,CONTRAST=value] 

Remarks

LCDtype    The type of LCD display used. This can be :
                40 * 4,16 * 1, 16 * 2, 16 * 4, 16 * 4, 20 * 2 or 20 * 4 or 16 * 1a or 20*4A.
                Default 16 * 2 is assumed.
 
Chipset   KS077
              Most text based LCD displays use the same chip from Hitachi. But some use the KS077 which is highly compatible but needs an additional function register
              to be set. This parameter will cause that this register is set when you initialize the display.
 
CHIPSET   DOGM
                The DOGM chip set uses a special function register that need to be set.
                The 16 x 2 LCD displays need DOG162V3 for 3V operation or DOG162V5 for 5V operation.
                The 16 x 3 LCD displays need DOG163V3 for 3V operation or Dogm163v5 for 5V operation
 
CONTRAST   
                   The optional contrast parameter is only supported for the EADOG displays. By default a value from the manufacture is used. But you might want to
                   override this value with a custom setting.

Отредактировано max (2011-04-18 20:18:26)

0

9

дисплей bc1602G ,он действительно на KS0066.....а то существенно??!!и как мне выйте из положения......плиз,гуру помогите

0

10

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

0

11

ПО 4 битной шине пробывал непошло,экран чистый,также как и по 8 битной шине,по схеме и печатке все точно,сам рисовал

0

12

Единственное,что с фьюзами мог напортачить,но я уже всякие варианты перебробывал.....резонатор внутриний на 4 МГц

0

13

я тут отвечал:  http://kniga.mybb.ru/viewtopic.php?id=14
смотрите с середины страницы

0

14

питанием/контрастом дисплея все ок?

0

15

извеняюсь за тупой вопрос.....а на вывод МК reset подягивающий резюк обезателен,если да то зачем

0

16

Тему можно закрывать.Сегодня за ночь наваел схемку для сегментников .Огромное спасибо PASHE за его пример I2C часов.
вот код того что получилось

Код:
'---------------------------Тип_микроконтроллера--------------------------------
$regfile = "m8def.dat"
$crystal = 4000000
'---------------------------Конфигурация портов---------------------------------
Config Portb = Output                                       'аноды
Config Portd = Output                                       'сегменты
Config 1wire = Portc.0                                      'ds18b20
A Alias Portd.5                                             'сигмент А
B Alias Portd.7                                             'сигмент В
C Alias Portd.3                                             'сигмент С
D Alias Portd.1                                             'сигмент D
E Alias Portd.0                                             'сигмент E
F Alias Portd.6                                             'сигмент F
G Alias Portd.4                                             'сигмент G
Dp Alias Portd.2                                            'сигмент Dp
Dig1 Alias Portb.3                                          'анод 1
Dig2 Alias Portb.2                                          'анод 2
Dig3 Alias Portb.1                                          'анод 3
Dig4 Alias Portb.0                                          'анод 4
Ledsettemp Alias Portb.4                                    'светодиод настроек термостата
Ledsetgis Alias Portb.5                                     'светодиод настроек гистерезиса
Out_thermostat Alias Portb.6                                'выход для исполняющего устройства
Set Portc.1
Set Portc.2
Set Portc.3
Set Portc.4
Cn Alias Pinc.2                                             'кнопка плюс
Cv Alias Pinc.3                                             'кнопка минус
Vv Alias Pinc.4                                             'кнопка ввод
M Alias Pinc.1                                              'кнопка меню
'---------------------------Переменные------------------------------------------
Dim W As Byte
Dim Z As Byte
Dim Y As Byte
Dim X As Byte
Dim Chislo(8) As Integer
Dim Dp_flag1 As Bit
Dim Dp_flag2 As Bit
Dim Dp_flag3 As Bit
Dim Dp_flag4 As Bit
Dim T1 As Integer
Dim T2 As Integer
Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Ee_thermosetting As Eram Integer                        ' Ячейка памяти в EEPROM, в которой хранится текущая поддерживаемая температура.
Dim Ee_gisterzis As Eram Integer                            ' Ячейка памяти в EEPROM, в которой хранится гистерзис.
Dim Thermo_setting As Integer                               ' Поддерживаемая термостатом температура.
Dim Gis_setting As Integer
Dim T As Integer                                            'флаг режима 1=нагрев,0=охлаждение(требуется для корректной работы гистерезиса)
Dim X1 As Byte
Dim Aa As Byte
Dim Min1 As Byte
Dim Gg As Byte
'------------------------------------Процедуры----------------------------------
Declare Sub Enterdatetime()
Declare Sub Getkey()
Declare Sub Thermocontrol()
Declare Sub Menu()
'-------------------------------Таймеры-----------------------------------------
Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse :    ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Config Timer1 = Timer , Prescale = 8 : On Timer1 Bootons :  ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Enable Interrupts : Enable Timer0 : Enable Timer1           ' разрешаем прерывания и таймер 0
'-----------------------------Основной цикл-------------------------------------
Thermo_setting = Ee_thermosetting
Gis_setting = Ee_gisterzis
If Thermo_setting < 50 Or Thermo_setting > 130 Then         ' Такие температуры не поддерживаются.
Chislo(4) = 13
Chislo(3) = 13
Waitms 1800
End If
Ledsetgis = 0
Ledsettemp = 0
Do
1wreset
Stop Timer0                                                 ' : Portd = 255
1wwrite &HCC                                                ' Выдаем команду чтения ПЗУ
1wwrite &H44                                                ' Запуск измерения
Start Timer0
Waitms 750                                                  ' Ждем окончания преобразования
1wreset
Stop Timer0                                                 ': Portd = 255
1wwrite &HCC
1wwrite &HBE                                                ' Команда чтения ОЗУ датчика
Byte0 = 1wread()                                            ' Читаем нулевой байт
Byte1 = 1wread()                                            ' Читаем первый байт
Start Timer0
If Byte1 >= 248 Then                                        ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Chislo(4) = 10
Else
Chislo(4) = 11
End If
T1 = Byte0 / 16                                             ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16                                             ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1 = T1 + T2                                                ' Формирмируем результам и выдаем его на индикатор. Команда LCD сама преобразует его в десятичный вид
T1 = T1 / 2
Chislo(1) = 12
Chislo(2) = T1 Mod 10
T2 = T1 / 10
Chislo(3) = T2 Mod 10
If T1 > 99 Then Chislo(4) = 1
Dp_flag1 = 1
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
If Pinc.1 = 0 Then
Gosub Menu
End If
' Call Thermocontrol
Loop
'-----------------------------Вывод на индикатор--------------------------------
Pulse:
Reset Watchdog
Stop Timer0                                                 ' останавливаем таймер 0
Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4
Incr W : If W > 4 Then W = 1                                ' выбираем какую цифру сейчас включать
Y = 0
Gosub Look : A = Z                                          ' переходим к подпрограмме Look, которая определяет нужно ли сейчас загорется сегменту А
Gosub Look : B = Z
Gosub Look : C = Z
Gosub Look : D = Z
Gosub Look : E = Z
Gosub Look : F = Z
Gosub Look : G = Z

Select Case W                                               ' включаем цифру которую выбрали (w). Подаем плюс на общий провод конкретной цифры
Case 1 :
If Dp_flag1 = 1 Then Reset Dp Else Set Dp
Set Dig1
Case 2 :
If Dp_flag2 = 1 Then Reset Dp Else Set Dp
Set Dig2
Case 3 :
If Dp_flag3 = 1 Then Reset Dp Else Set Dp
Set Dig3
Case 4 :
If Dp_flag4 = 1 Then Reset Dp Else Set Dp
Set Dig4
End Select

'(          ' для индикатора с общим минусом
Select Case W                                               ' включаем цифру которую выбрали (w). Подаем минус на общий провод конкретной цифры
 Case 1 :
  If Dp_flag1 = 1 Then Set Dp Else Reset Dp
 Reset Dig1
 Case 2 :
 If Dp_flag2 = 1 Then Set Dp Else Reset Dp
 Reset Dig2
 Case 3 :
 If Dp_flag3 = 1 Then Set Dp Else Reset Dp
 Reset Dig3
 Case 4 :
 If Dp_flag4 = 1 Then Set Dp Else Reset Dp
 Reset Dig4
End Select

')

Start Timer0                                                ' запускаем таймер0
Return                                                      ' возвращаемся к выполнению основной программы
Look:                                                       ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
Z = Chislo(w) * 7 : Z = Y + Z                               ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 0..1..2..3.......9, Y это номер сегмента (A=0 B=1 C=2...G=7)
Z = Lookup(z , Cifri)                                       ' выбираем из таблици включить или выключить нужный сегмент
Incr Y                                                      'Y это номер сегмента (A=0 B=1 C=2...)
Return                                                      'возвращаемся на место откуда сюда прислали

Cifri:
' таблица сегментом для семисегментников с общим плюсом      |Chislo(i)| Символ |
Data 0 , 0 , 0 , 0 , 0 , 0 , 1                              '0
Data 1 , 0 , 0 , 1 , 1 , 1 , 1                              '1
Data 0 , 0 , 1 , 0 , 0 , 1 , 0                              '2
Data 0 , 0 , 0 , 0 , 1 , 1 , 0                              '3
Data 1 , 0 , 0 , 1 , 1 , 0 , 0                              '4
Data 0 , 1 , 0 , 0 , 1 , 0 , 0                              '5
Data 0 , 1 , 0 , 0 , 0 , 0 , 0                              '6
Data 0 , 0 , 0 , 1 , 1 , 1 , 1                              '7
Data 0 , 0 , 0 , 0 , 0 , 0 , 0                              '8
Data 0 , 0 , 0 , 0 , 1 , 0 , 0                              '9
Data 1 , 1 , 1 , 1 , 1 , 1 , 0                              '10           "-"
Data 1 , 1 , 1 , 1 , 1 , 1 , 1                              '11           ""
Data 0 , 1 , 1 , 0 , 0 , 0 , 1                              '12           "C"
Data 0 , 0 , 1 , 1 , 0 , 0 , 0                              '13           "P"
Data 1 , 1 , 1 , 0 , 0 , 0 , 0                              '14           "t"
'( ' для индикатора с общим минусом
Data 1 , 1 , 1 , 1 , 1 , 1 , 0                              '0
Data 0 , 1 , 1 , 0 , 0 , 0 , 0                              '1
Data 1 , 1 , 0 , 1 , 1 , 0 , 1                              '2
Data 1 , 1 , 1 , 1 , 0 , 0 , 1                              '3
Data 0 , 1 , 1 , 0 , 0 , 1 , 1                              '4
Data 1 , 0 , 1 , 1 , 0 , 1 , 1                              '5
Data 1 , 0 , 1 , 1 , 1 , 1 , 1                              '6
Data 1 , 1 , 1 , 0 , 0 , 0 , 0                              '7
Data 1 , 1 , 1 , 1 , 1 , 1 , 1                              '8
Data 1 , 1 , 1 , 1 , 0 , 1 , 1                              '9
Data 0 , 0 , 0 , 0 , 0 , 0 , 1                              '10           "-"
Data 0 , 0 , 0 , 0 , 0 , 0 , 0                              '11           "" пусто
Data 1 , 0 , 0 , 1 , 1 , 1 , 0                              '12           "C"
Data 1 , 1 , 0 , 0 , 1 , 1 , 1                              '13           "P"
Data 0 , 0 , 0 , 1 , 1 , 1 , 1                              '14           "t"
')

'----------------Контроль температуры у управление нагрузкой--------------------
Bootons:
If T = 1 Then
Gg = Thermo_setting + Gis_setting
Gg = Gg - 1
If T1 <= Gg Then
Out_thermostat = 1
Else
Out_thermostat = 0
T = 0
End If
End If
If T = 0 Then
If T1 <= Thermo_setting Then
T = 1
End If
End If
Return
'--------------------------Сохраняем данные в EEPROM----------------------------
Getdatetime:
Return
Setdate:
Ee_thermosetting = Thermo_setting
Ledsetgis = 0
Ledsettemp = 0
Return
Settime:
Ee_gisterzis = Gis_setting
Ledsetgis = 0
Ledsettemp = 0
Return
'------------------------Настройка термостата-----------------------------------
Sub Enterdatetime()
Aa = 0
X1 = Thermo_setting
Do
Ledsetgis = 0
Ledsettemp = 1
If X1 > 120 Then X1 = 50
If X1 < 50 Then X1 = 120
Chislo(2) = X1 Mod 10
T2 = X1 / 10
Chislo(3) = T2 Mod 10
If X1 > 99 Then Chislo(4) = 1
If X1 <= 99 Then Chislo(4) = 11
Getkey
Thermo_setting = X1
Gosub Setdate
Loop Until Aa = 1
'----------------------Настройка гистерезиса------------------------------------
Aa = 0
X1 = Gis_setting
Do
Ledsetgis = 1
Ledsettemp = 0
If X1 > 20 Then X1 = 1
If X1 < 1 Then X1 = 20
Chislo(2) = X1 Mod 10
T2 = X1 / 10
Chislo(3) = T2 Mod 10
If X1 < 99 Then Chislo(4) = 11
Getkey
Min1 = X1
Loop Until Aa = 1
Gis_setting = Min1
Gosub Settime
End Sub
'-----------------------------Обработка клавиш----------------------------------
Sub Getkey()
Waitms 300
If Cv = 0 Then
Incr X1
Waitms 24
End If
If Cn = 0 Then
Decr X1
Waitms 24
End If
If Vv = 0 Then
Aa = 1
Waitms 24
Else
Aa = 0
Waitms 24
End If
End Sub
'---------------------------Нажата кнопка "МЕНЮ"--------------------------------
Sub Menu()
Aa = 0
Getkey
Enterdatetime
Cls
End Sub

0