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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » часы, термометр


часы, термометр

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

1

Вообщем пишу первую свою программу на бейсике, да и вообще первую. Программу вроде бы написал, но столкнулся с такой проблемой каждые 3 сек счет часов, а именно секунд  немного притормаживает и не могу придумать что в коде поменять, и как оптимизировать, может вам с более большим опытом что то придет в голову?

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.

Отредактировано 4ester (2012-01-05 00:30:09)

0

2

Эту тему уже изжевали, "коты" изгрызли, по косточкам разобрали.
Сначала надо познакомиться со стандартными библиотеками Bascom.
В "ds1307clock.lib" есть переменные _sec, _min, _hour, _day, _month, _year,
нужно только добавить "Dim Weekday As Byte"?.
И есть проседуры _SET_DATE и _SET_TIME.
Да и у DS1307 есть пакетный режим записи-чтения, а в прерывании от USART
нужно только принимать байты и сохранять в буфер.

0

3

порылся на форуме ничего внятного не нашел, можно небольшой примерчик?, я только недавно начал изучать этот язык  и еще толком не разобрался.

0

4

http://www.ksphome.ru/files/datasheets/DS1307.pdf
Описание DS1307 на русском.

Код:
Getdatetime:
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307

  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' Year
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 4                                                ' starting address in 1307
  I2cwbyte _day                                             ' Send Data to SECONDS
  I2cwbyte _month                                           ' MINUTES
  I2cwbyte _year                                            ' Hours
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte _sec                                             ' Send Data to SECONDS
  I2cwbyte _min                                             ' MINUTES
  I2cwbyte _hour                                            ' Hours
  I2cstop
Return

0

5

Делал давно, может пригодится:

Код:
$regfile = "m16def.dat"                                     'определяем контроллер
$crystal = 8000000                                          'внутренний генератор
$baud = 9600                                                'скорость UART
$hwstack = 32                                               'аппаратный стек
$swstack = 10                                               'програмный стек
$framesize = 40                                             'размер фрейма
$lib "lcd4.lbx"                                             'подключаем библиотеку ЖКИ
'$lib "mcsbyte.lbx"                                          'подключаем библиотеку функций
'Enable Interrupts                                           'разрешаем прерывания
'************************************ Настраиваем ЖКИ ************************************
'дисплей на контроллере HD44780  подключен к соответствующим ножкам порта,
'работает в 4-битном режиме,вывод RW заземлён,Db0-Db3 не подключены
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.3 , Db7 = Portb.4
Config Lcd = 16 * 2                                         'дисплей 2 строки по 16 символов
Cursor Off                                                  'выключить курсор
Cls                                                         'очистить дисплей
'************************************ Настраиваем DS1307 ************************************
'на эту ножку (21) подключим сигнал Sda DS1307 и подтягивающий резистор на 4,7 ком к + питания
Config Sda = Portc.1
'на эту ножку (22) подключим сигнал Scl DS1307 и подтягивающий резистор на 4,7 ком к + питания
Config Scl = Portc.0
Const Ds1307w = &HD0                                        'адрес записи данных DS1307
Const Ds1307r = &HD1                                        'адрес чтения данных DS1307
Config Clock = User                                         'работа с DS1307
'Config Clock = Soft - работа со встроенными часами
Config Date = Dmy , Separator = .                           'формат даты дд.мм.гг.
'************************************ Настраиваем DS18B20 ************************************
'на эту ножку (40) подключим DS18B20 и подтягивающий резистор на 4,7 ком к + питания
Config 1wire = Porta.0
'************************************ Настраиваем TSOP1736 ************************************
Config Rc5 = Pina.7                                         'на эту ножку (33) подключим TSOP1736
'************************************ Настраиваем Timer1 ************************************
'на выход компаатора (19) подклюен анод подсветки ЖКИ
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 1
'************************************ Настраиваем кнопки ************************************
Config Debounce = 10                                        'время задержки в мс
Config Pina.1 = Input                                       'настройка пина а1 на вход
Config Pina.2 = Input                                       'настройка пина а2 на вход
Config Pina.3 = Input                                       'настройка пина а3 на вход
Config Pina.4 = Input                                       'настройка пина а4 на вход
Config Pina.5 = Input                                       'настройка пина а5 на вход
Set Porta.1                                                 'включить внутренний подтягивающий резистор
Set Porta.2                                                 'включить внутренний подтягивающий резистор
Set Porta.3                                                 'включить внутренний подтягивающий резистор
Set Porta.4                                                 'включить внутренний подтягивающий резистор
Set Porta.5                                                 'включить внутренний подтягивающий резистор
Porta.1 = 1                                                 'на порту а1 лог. 1
Porta.2 = 1                                                 'на порту а2 лог. 1
Porta.3 = 1                                                 'на порту а3 лог. 1
Porta.4 = 1                                                 'на порту а4 лог. 1
Porta.5 = 1                                                 'на порту а5 лог. 1
Cn Alias Pina.1                                             'КНОПКА КУРСОР ВНИЗ
Cv Alias Pina.2                                             'КНОПКА КУРСОР ВЕРХ
Vv Alias Pina.3                                             'КНОПКА ВВОД
Mn Alias Pina.4                                             'КНОПКА МЕНЮ
Mn1 Alias Pina.5                                            'КНОПКА МЕНЮ1
'************************************ Декларируем функции ************************************
Declare Sub Disp                                            'функция дисплея установки даты и времени
Declare Sub Getkey()                                        'функция кнопок
'************************************ Декларируем переменные ************************************
Dim Address As Byte                                         'байт адреса Rc5
Dim A As Byte                                               'для движения текста
Dim Aa As Byte                                              'для кнопки
Dim B As Byte                                               'для инициализации ЖКИ
Dim Bweekday As Byte                                        'чтение дня недели
Dim Command As Byte                                         'байт команды Rc5
Dim Chr_code As Byte                                        'байт некоторых символов
Dim C As Byte                                               'для подсветки
Dim Dsid1(8) As Byte                                        'ID первого датчика
Dim Dsid2(8) As Byte                                        'ID второго датчика
Dim D As String * 3                                         'окончание в слове датчик(-а, -ов)
Dim H As Integer                                            'для часов
Dim I1 As Integer                                           'температура первого датчика
Dim I2 As Integer                                           'температура второго датчика
Dim I11 As Integer                                          'для Tmax1 и Tmin1                                        ' przechowuje poprzedni¦ wartoЬ temp
Dim I22 As Integer                                          'для Tmax2 и Tmin2
Dim Lsd As String * 11                                      'отображение значения подсветки
Dim Month As String * 8                                     'отображение месяца
Dim M As Integer                                            'для минут
Dim P As Byte                                               'отображение значения подсветки в %
Dim Pp As Byte                                              'для схранения в памяти значения подсветки
Dim Strweekday As String * 7                                'отображение дня недели
Dim S As String * 6                                         'конвертирование температуры
Dim Tmax1 As Integer                                        'максимальная температура1
Dim Tmin1 As Integer                                        'минимальная температура1
Dim Tmax2 As Integer                                        'максимальная температура2
Dim Tmin2 As Integer                                        'минимальная температура2
Dim Weekday As Byte                                         'байт дня недели
Dim W As Byte                                               'кол-во подклученных датчиков
'************************************ Некоторые пользовательские символы ************************************
Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32        'Знак градусов
Deflcdchar 1 , 8 , 12 , 30 , 31 , 30 , 12 , 8 , 32          'Указатель курсора
Deflcdchar 3 , 4 , 5 , 7 , 7 , 15 , 25 , 9 , 15             'Левая половина дома
Deflcdchar 4 , 32 , 16 , 24 , 28 , 30 , 19 , 18 , 18        'Правая половина дома
Deflcdchar 5 , 4 , 14 , 27 , 14 , 4 , 1 , 7 , 32            'Левая половина облака с солнцем
Deflcdchar 6 , 32 , 32 , 32 , 14 , 31 , 30 , 28 , 32        'Правая половина облака
Deflcdchar 7 , 6 , 8 , 8 , 6 , 32 , 1 , 7 , 32              'Левая половина облака с месяцем
'******************** Масимальные и минимальные значения температуры ********************
Tmin1 = 125 * 16
Tmin2 = 125 * 16
Tmax1 = -55 * 16
Tmax2 = -55 * 16
'************************************ Заставка ************************************
For C = 0 To 150
Pwm1a = C                                                   'RozjaЬnianie LCD od 0 do 100 (50% PWM)
Waitms 4
Next C
Locate 1 , 17
Lcd "«acГ-їepјoјeїp"                                        'Часы-термометр
Locate 2 , 18
Lcd "BepcёЗ 4.3.9"                                          'Версия 4.3.9
For A = 1 To 15
Shiftlcd Left
Waitms 20                                                   'Schowanie tekstu
Next A
Wait 2
For A = 1 To 15
Shiftlcd Left
Waitms 20                                                   'Schowanie tekstu
Next A
For C = 150 To 0 Step -1
Pwm1a = C                                                   'Мciemnienie LCD od 100 do 0
Waitms 4
Next C
Cls
Waitms 500
For C = 0 To 150
Pwm1a = C                                                   'RozjaЬnianie LCD od 0 do 100 (50% PWM)
Waitms 4
Next C
Locate 1 , 17
Lcd "Aіїop ѕpoeєїa"                                         'Автор проекта
Locate 2 , 17
Lcd "Ґ»ЖБєёЅ M.Ў."                                          'Илюшкин М.Г
For A = 1 To 15
Shiftlcd Left
Waitms 20                                                   'Schowanie tekstu
Next A
Wait 2
For A = 1 To 15
Shiftlcd Left
Waitms 20                                                   'Schowanie tekstu
Next A
For C = 150 To 0 Step -1
Pwm1a = C                                                   'Мciemnienie LCD od 100 do 0
Waitms 4
Next C
Gosub Rozjig
'************************************ Поиск датчиков ************************************
Cls
W = 1wirecount()                                            'Поиск всех подключенных датчиков
Locate 1 , 1
Lcd "ЁpёіeїcїіyЖ Bac!"                                      'Приветствую Вас!
Locate 2 , 1
Lcd "Ёoёcє гaїАёєoі.."                                      'Поиск датчиков..
Wait 2
Cls
Locate 1 , 1
Lcd "OІЅapy¶eЅo:"                                           'Обнаружено:
Locate 2 , 1
Lcd Hex(w)                                                  'все найденные датчики
Select Case W
Case 0 : D = "єoі"                                          'ков
Case 1 : D = "є"                                            'к
Case 2 To 4 : D = "єa"                                      'ка
Case 5 To 20 : D = "єoі"                                    'ков
Case 21 : D = "є"                                           'к
Case 22 To 24 : D = "єa"                                    'ка
Case 25 To 30 : D = "єoі"                                   'ков
Case 31 : D = "є"                                           'к
Case 32 To 34 : D = "єa"                                    'ка
Case 35 To 40 : D = "єoі"                                   'ков
Case 41 : D = "є"                                           'к
Case 42 To 44 : D = "єa"                                    'ка
Case 45 To 50 : D = "єoі"                                   'ков
End Select
Locate 2 , 4
Lcd "гaїАё" ; D                                             'датчи
Wait 3
Dsid1(1) = 1wsearchfirst()                                  'считываем семейный код первого датчика
Dsid2(1) = 1wsearchnext()                                   'считываем семейный код второго датчика
'************************************ Основной цикл программы ************************************
1:
Cls
Do

Incr B
'If B = 100 Then Initlcd
If B = 101 Then B = 0

Getrc5(address , Command)
If Address = 0 Then
Command = Command And &B01111111
End If

If Command = 12 Then Gosub Display_off

Locate 1 , 1
Lcd Time$
Locate 2 , 1
Lcd _day ; " " ; Month
If _year < 10 Then
Lcd " 200" ; _year ; "    "
Else
Lcd " 20" ; _year ; "    "
End If

Select Case _month
Case 1 : Month = "ЗЅіapЗ"                                   'января
Case 2 : Month = "дeіpa»З"                                  'февраля
Case 3 : Month = "јapїa"                                    'марта
Case 4 : Month = "aѕpe»З"                                   'апреля
Case 5 : Month = "јaЗ"                                      'мая
Case 6 : Month = "ёЖЅЗ"                                     'июня
Case 7 : Month = "ёЖ»З"                                     'июля
Case 8 : Month = "aіґycїa"                                  'августа
Case 9 : Month = "ceЅїЗІpЗ"                                 'сентабря
Case 10 : Month = "oєїЗІpЗ"                                 'октября
Case 11 : Month = "ЅoЗІpЗ"                                  'ноября
Case 12 : Month = "гeєaІpЗ"                                 'декабря
End Select

Bweekday = Dayofweek()
Strweekday = Lookupstr(bweekday , Weekdays)
Locate 1 , 10
Lcd Strweekday

Debounce Vv , 0 , Temp

Debounce Cn , 0 , Maxmin

If Mn = 0 Then
Gosub Menu
End If

If Mn1 = 0 Then
Gosub Display_off
End If

Loop
End
'************************************ Конец основного цикла программы ************************************
'************************************ Дни недели ************************************
Weekdays:
Data "ЁoЅeг. "                                              'Понед.
Data "BїopЅёє"                                              'Вторник
Data "Cpeгa  "                                              'Среда
Data "«eїіepґ"                                              'Четверг
Data "ЁЗїЅёеa"                                              'Пятница
Data "CyІІoїa"                                              'Суббота
Data "Bocєp. "                                              'Воскр.
'************************************ Подпрограмма вывода температуры на ЖКИ ************************************
Temp:
Cls
Do
'--------konwersja temp dla wszystkich dsow
   1wreset
   1wwrite &HCC
   1wwrite &H44
   Waitms 901                                               ' czekaj na konwersjъ temperatury (normalnie powinno byц 750,
                                                             'ale jest ustawione na 901, aby nie kolidowa¦o z odЬwie¬aniem sekund)

   1wreset
   1wwrite &H55
   1wverify Dsid1(1)                                        'wysy¦amy adres pierwszego czujnika
   1wwrite &HBE
   I1 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid2(1)                                        'wysylam adres drugiego czujnika
   1wwrite &HBE
   I2 = 1wread(2)
 '---------------------------------

   I1 = I1 * 10                                             'Konwersja
   I1 = I1 / 16
   S = Str(i1)
   S = Format(s , "0.0")

   I2 = I2 * 10                                             'Konwersja
   I2 = I2 / 16
   S = Str(i2)
   S = Format(s , "0.0")                                    ' Format wyЬwietlania

  Gosub Dom

  Locate 2 , 2
   Lcd Chr(6)                                               'WyЬwietlanie Znaku dnia i nocy (chodzi o symbol dworu)

   If _hour >= 6 And _hour < 21 Then
       Locate 2 , 1
       Lcd Chr(5)
       Else
       Locate 2 , 1
       Lcd Chr(7)
   End If

      If I1 >= I11 Then                                     'format wyЬwietlania 1 czujnika ds18b20 wraz ze strza¦kami
   Gosub Warunek1
   If I1 > 0 Then
   Gosub Format_wyswietlania1
   Gosub Wyswietlanie1
   Else
   Gosub Format_wyswietlania1
   Gosub Wyswietlanie1
   End If
   Else
   Gosub Warunek1
   If I1 > 0 Then
   Gosub Format_wyswietlania1
   Gosub Wyswietlanie2
   Else
   Gosub Format_wyswietlania1
   Gosub Wyswietlanie2
   End If
   End If

   If I2 >= I22 Then                                        'format wyЬwietlania 2 czujnika ds18b20 wraz ze strza¦kami
   Gosub Warunek2
   If I2 > 0 Then
   Gosub Format_wyswietlania2
   Gosub Wyswietlanie1
   Else
   Gosub Format_wyswietlania2
   Gosub Wyswietlanie1
   End If
   Else
   Gosub Warunek2
   If I1 > 0 Then
   Gosub Format_wyswietlania2
   Gosub Wyswietlanie2
   Else
   Gosub Format_wyswietlania2
   Gosub Wyswietlanie2
   End If
   End If

   If I1 < Tmin1 Then Tmin1 = I1
   If I1 > Tmax1 Then Tmax1 = I1
   If I2 < Tmin2 Then Tmin2 = I2
   If I2 > Tmax2 Then Tmax2 = I2

  If _hour = 23 And _min = 59 And _sec = 59 Then
  Tmin1 = I1
  Tmax1 = I1
  Tmin2 = I2
  Tmax2 = I2
  End If
  Debounce Vv , 0 , 1
  Loop

Format_wyswietlania1:
S = Str(i1)
S = Format(s , "0.0")
Locate 1 , 4
Return

Format_wyswietlania2:
S = Str(i2)
S = Format(s , "0.0")
Locate 2 , 4
Return

Wyswietlanie1:
Lcd S ; Chr(0) ; "C" ; Chr(217) ; "  "
Return

Wyswietlanie2:
Lcd S ; Chr(0) ; "C" ; Chr(218) ; "  "
Return

Warunek1:
I11 = I1
Return

Warunek2:
I22 = I2
Return
'************************************ Отображение рисунка дома ************************************
Dom:
Locate 1 , 1
Lcd Chr(3)
Locate 1 , 2
Lcd Chr(4)
Return
'******************** Подпрограмма вывода масимальной и минимальной температуры на ЖКИ ********************
Maxmin:
Cls

Do

Locate 2 , 2
   Lcd Chr(6)                                               'WyЬwietlanie Znaku dnia i nocy (chodzi o symbol dworu)

   If _hour >= 6 And _hour < 21 Then
       Locate 2 , 1
       Lcd Chr(5)
       Else
       Locate 2 , 1
       Lcd Chr(7)
   End If

Gosub Dom

S = Str(tmin2)
Gosub Formats
Locate 2 , 11
Lcd S ; Chr(0) ; " "

S = Str(tmax2)
Gosub Formats
Locate 2 , 4
Lcd S ; Chr(0) ; " "

S = Str(tmin1)
Gosub Formats
Locate 1 , 11
Lcd S ; Chr(0) ; " "

S = Str(tmax1)
Gosub Formats
Locate 1 , 4
Lcd S ; Chr(0) ; " "

Debounce Cn , 0 , 1

Loop

Formats:
S = Format(s , "0.0")
Return
'************************************ Подпрограмма обслуживания DS1307 ************************************
Getdatetime:
 I2cstart                                                   ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307

  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' Year
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 4                                                ' starting address in 1307
  I2cwbyte _day                                             ' Send Data to SECONDS
  I2cwbyte _month                                           ' MINUTES
  I2cwbyte _year                                            ' Hours
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte _sec                                             ' Send Data to SECONDS
  I2cwbyte _min                                             ' MINUTES
  I2cwbyte _hour                                            ' Hours
  I2cstop
Return
'************************************ Подпрограмма вывода меню на ЖКИ ************************************
Menu:
Cls
Locate 1 , 2
Lcd "©cїaЅoієa Аacoі"                                       'Установка часов
Locate 2 , 2
Lcd "Ёpoґpaјјa"                                             'Программа
Goto _menu_pos1
Menu1:
Cls
Locate 1 , 2
Lcd "Ёoёcє гaїАёєoі"                                        'Поиск датчиков
Locate 2 , 2
Lcd "Ёoгcіeїєa"                                             'Подсветка
Goto _menu_pos3

_menu_pos1:
Gosub _lcd_clear
Locate 1 , 1
Lcd Chr(1)
Do
Debounce Cv , 0 , 1
Debounce Vv , 0 , Enterdatetime
Debounce Cn , 0 , _menu_pos2
Loop

_menu_pos2:
Gosub _lcd_clear
Locate 2 , 1
Lcd Chr(1)
Do
Debounce Cv , 0 , _menu_pos1
Debounce Vv , 0 , _begin
Debounce Cn , 0 , Menu1
Loop

_menu_pos3:
Gosub _lcd_clear
Locate 1 , 1
Lcd Chr(1)
Do
Debounce Cv , 0 , Menu
'Debounce Vv , 0 , _findds18b20
Debounce Cn , 0 , _menu_pos4
Loop

_menu_pos4:
Gosub _lcd_clear
Locate 2 , 1
Lcd Chr(1)
Do
Debounce Cv , 0 , _menu_pos3
Debounce Vv , 0 , Podswet
Debounce Cn , 0 , 1
Loop

_begin:
Cls
Locate 1 , 2
Lcd "Ta№јep"                                                'Таймер
Locate 2 , 2
Lcd "Tepјocїaї"                                             'Термостат
Goto _menu_pos5

_menu_pos5:
Gosub _lcd_clear
Locate 1 , 1
Lcd Chr(1)
Do
Debounce Cv , 0 , Menu
'Debounce Vv , 0 , Taim
Debounce Cn , 0 , _menu_pos6
Loop

_menu_pos6:
Gosub _lcd_clear
Locate 2 , 1
Lcd Chr(1)
Do
Debounce Cv , 0 , _menu_pos5
'Debounce Vv , 0 , Termo
Debounce Cn , 0 , Menu
Loop

'очистка знакоместа
_lcd_clear:
Locate 1 , 1
Lcd Chr(20)
Locate 2 , 1
Lcd Chr(20)
Return
'************************************ Подпрограмма вывода меню установки часов на ЖКИ ************************************
Enterdatetime:
Cls
Waitms 30
Aa = 0
Do
Call Disp
If Cv = 0 Then Incr _year
If _year > 50 Then _year = 9
If Cn = 0 Then Decr _year
If _year < 9 Then _year = 50
Getkey
Loop Until Aa = 1
Cls
Waitms 30
Aa = 0
Do
Call Disp
If Cv = 0 Then Incr _month
If _month > 12 Then _month = 1
If Cn = 0 Then Decr _month
If _month < 1 Then _month = 12
Getkey
Loop Until Aa = 1
Cls
Waitms 30
Aa = 0
Do
Call Disp
If Cv = 0 Then Incr _day
If _day > 31 Then _day = 1
If Cn = 0 Then Decr _day
If _day < 1 Then _day = 31
Getkey
Loop Until Aa = 1
Gosub Setdate
Cls
Waitms 30
Aa = 0
Do
Call Disp
If Cv = 0 Then Incr H
If H > 23 Then H = 0
If Cn = 0 Then Decr H
If H < 0 Then H = 23
Getkey
_hour = H
Loop Until Aa = 1
Cls
Waitms 30
Aa = 0
Do
Call Disp
If Cv = 0 Then Incr M
If M > 59 Then M = 0
If Cn = 0 Then Decr M
If M < 0 Then M = 59
Getkey
_min = M
Loop Until Aa = 1
_sec = 0
Gosub Settime
Cls

Sub Getkey()
Waitms 200
If Vv = 0 Then
Aa = 1
Else
Aa = 0
End If
End Sub

Sub Disp
M = _min
H = _hour
Bweekday = Dayofweek()
Strweekday = Lookupstr(bweekday , Weekdays)
Locate 1 , 10
Lcd Strweekday
Locate 1 , 1
If H < 10 Then
Lcd "0" ; H ; ":"
Else
Lcd H ; ":"
End If
If M < 10 Then
Lcd "0" ; M ; ":"
Else
Lcd M ; ":"
End If
Lcd "00"
Locate 2 , 1
Lcd _day ; " " ; Month
If _year < 10 Then
Lcd " 200" ; _year ; "    "
Else
Lcd " 20" ; _year ; "    "
End If
Select Case _month
Case 1 : Month = "ЗЅіapЗ"                                   'января
Case 2 : Month = "дeіpa»З"                                  'февраля
Case 3 : Month = "јapїa"                                    'марта
Case 4 : Month = "aѕpe»З"                                   'апреля
Case 5 : Month = "јaЗ"                                      'мая
Case 6 : Month = "ёЖЅЗ"                                     'июня
Case 7 : Month = "ёЖ»З"                                     'июля
Case 8 : Month = "aіґycїa"                                  'августа
Case 9 : Month = "ceЅїЗІpЗ"                                 'сентабря
Case 10 : Month = "oєїЗІpЗ"                                 'октября
Case 11 : Month = "ЅoЗІpЗ"                                  'ноября
Case 12 : Month = "гeєaІpЗ"                                 'декабря
End Select
End Sub

Taim:

_findds18b20:
'************************************ Подпрограмма регулировки подсветки ЖКИ ************************************
Podswet:
Readeeprom Pp , 1
Goto Ustaw_podsw
'______________________________________________________________________________
Ustaw_podsw:
Do
Pp = Pwm1a
                                                              'Przelicza wartoЬц PWM na procenty
P = Pwm1a / 2

Locate 1 , 1
Lcd " Ёoгcіeїєa ЈKҐ  "                                      'Подсветка ЖКИ

If Pwm1a >= 200 Then                                        'Ograniczenie programowe maksymalnego PWM do 200 (normalnie jest 255)
Pwm1a = 200
End If

Locate 2 , 13
 If P < 10 Then
   Lcd "  " ; P
   Else                                                     'podЬwietlanie w procentach
      If P < 100 Then
      Lcd " " ; P
      Else
      Lcd P
      End If
End If

Select Case P
Case 0 : Lsd = "BГє»ЖАeЅa  "                                'Выключена
Case 1 To 49 : Lsd = "           "
Case 50 : Lsd = "CpeгЅЗЗ    "                               'Средняя
Case 51 To 99 : Lsd = "           "
Case 100 : Lsd = "Maєcёјa»ДЅa"                              'Максимальна
End Select

Locate 2 , 1
Lcd Lsd

Locate 2 , 16
Lcd "%"

If Cn = 0 Then
Goto Podswetminus
End If

If Cv = 0 Then
Goto Podswetplus
End If

Debounce Vv , 0 , Zapis_podsw

Loop

Podswetplus:
Waitms 75
Incr Pwm1a : If Pwm1a > 200 Then Pwm1a = 200                'Wzwiъksza wartoЬц PodЬwietlania od 0% do 100%
Goto Podswet

Podswetminus:
Waitms 75
Pwm1a = Pwm1a + 1
Decr Pwm1a : If Pwm1a < 1 Then Pwm1a = 1                    'Zmniejsza wartoЬц PodЬwietlania w przedziale od 100% do 0%
Pwm1a = Pwm1a - 1
Goto Podswet

Zapis_podsw:
Writeeeprom Pp , 1                                          'Zapis wartoЬci podЬwietlania do EEPROM-a
Goto Menu1
'************************************ Подпрограмма включения и выключения посветки ЖКИ ************************************
Display_off:
Do
Cls
Locate 1 , 6
Lcd "LCD OFF"
Wait 1
Cls
Locate 1 , 5
Lcd ">LCD OFF<"
Waitms 200
Cls
Locate 1 , 6
Lcd ">CD OF<"
Waitms 200
Cls
Locate 1 , 7
Lcd ">D O<"
Waitms 200
Cls
Locate 1 , 8
Lcd "> <"
Waitms 200
Cls
Readeeprom Pp , 1
For C = Pp To 0 Step -1
Pwm1a = C
Waitms 4                                                    'Zciemnianie wyЬwietlacza od wartoЬci podЬwietlania (pp) do 0
Next C
Cls
Display Off                                                 'Wy¦¦cza wyЬwietlanie czegokolwiek na wyЬwietlaczu
Goto Czekajna
Loop

Czekajna:
Do
Getrc5(address , Command)
If Address = 0 Then
Command = Command And &B01111111
End If
If Command = 12 Then Gosub Display_on
Debounce Mn1 , 0 , Display_on                               'JeЬli naciЬniemy przycisk Menu to przechodzimy do procedury od w¦¦czania podЬwietlania.
Loop

Display_on:
Do
Display On
Gosub Rozjig                                                'Idzie do procedury rozjaЬniania wyЬwietlacza
Locate 1 , 8
Lcd "< >"
Waitms 200
Cls
Locate 1 , 7
Lcd "<D O>"
Waitms 200
Cls
Locate 1 , 6
Lcd "<CD ON>"
Waitms 200
Cls
Locate 1 , 5
Lcd "<LCD ON >"
Waitms 200
Cls
Locate 1 , 6
Lcd "LCD ON"
Wait 1
Goto 1
Loop
'************************************ Подпрограмма увеличения посветки ЖКИ ************************************
Rozjig:
Readeeprom Pp , 1
For C = 0 To Pp
Pwm1a = C
Waitms 4                                                    'Procedura rozjaЬniania wyЬwietlacza od 0 do wartoЬci PP
Next C

0

6

возник такой вопрос можно ли так делать

Код:
tmin1 = Znakd2 ; Hhd2 ; "." ; Mmd2

tmin переменная типа string или integer, Znakd2 здесь знак (+) или ( - ) , Hhd2 и Mmd2 числа, "." точка разделительная ?

0

7

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

Код:
Ini:

W = 1wirecount()                                            ' ищем датчики
Dath1 = 1wsearchfirst()                                     ' считываем код первого датчика
Dath2 = 1wsearchnext()                                      ' считываем код 2 датчика

 1wreset
   1wwrite &HCC
   1wwrite &H44
   Waitms 901

 1wreset
   1wwrite &H55
   1wverify Dath1                                           'указываем адрес 1 датчика
   1wwrite &HBE

Byte0d1 = 1wread()                                          ' Читаем нулевой байт
Byte1d1 = 1wread()                                          ' Читаем первый байт
End If
If Byte1 >= 248 Then                                        ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0d1 = &HFF - Byte0
Byte1d1 = &HFF - Byte1

Znakd1 = "-"
Else
Znakd1 = "+"
End If

T1d1 = Byte0d1 / 16                                         ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2d1 = Byte1d1 * 16                                         ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1d1 = T1d1 + T2d1
Hhd1 = Fix(t1d1)                                            'отсекаем от температуры все после запятой
Ttempd1 = T1 * 10                                           '
Mmd1 = Ttempd1 Mod 10                                       'берем десятичную часть температуры

и не могу двинуться дальше так как хочу ввести такое

Код:
1wreset

If Err = 1 Then                                             'если при опросе появился флаг ошибки делаем что то

но как мне сделать так чтоб было понятно какой датчик при опросе не отозвался чтоб установить флаг ошибки для того датчика?

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » часы, термометр