mixa |
Дата: Вс, 24.07.2011, 21:44 | Сообщение # 1 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
9
Замечания:
±
На сайте с 05.04.2011
Статус:
Offline
|
Device = 16F877A Xtal = 4 Declare SHOW_SYSTEM_VARIABLES = OFF ;В Proteus показать внутренние переменные Declare FSR_CONTEXT_SAVE = OFF ;Не заботится о сохранении содержимого регистра FSR Declare Reminders = OFF ;Выключает напоминания компилятора Declare Warnings = OFF ;Выключает предупреждения компилятора Declare SDA_Pin PORTC.4 Declare SCL_Pin PORTC.3 Declare Slow_Bus OFF ;Выключить замедление при OSC > 4 Мгц Declare BUS_SCL OFF ;Включить режим работы шины SCL без подтягивающего резистора Declare PortB_Pullups = OFF ; Включить подтягивающие резисторы на PORTB Declare All_Digital = off ;Каждый порт выполняет свою функцию по умолчанию Declare LCD_Type ALPHA Declare LCD_DTPin PORTA.0 Declare LCD_ENPin PORTC.0 Declare LCD_RSPin PORTC.1 Declare LCD_Interface 4 Declare LCD_CommandUs 2000 Declare LCD_DataUs 50 Declare LCD_Lines 4
SCL VAR PORTC.3 ' ножка clock SDA VAR PORTC.4 ' ножкка data 'Dim Ctrl As Byte 'Ctrl = %00010000 ' управляюший регистр (на выходе SOUT 1Hz)
rtc_read CON %11010000 ' Адрес часов для чтения rtc_write con %11010001 ' Адрес часов для записи Dim sec As Byte ' секунды Dim sec1 As Byte ' секунды в десятичном формате Dim sec2 As Byte Dim mins As Byte ' минуты в формате DS1307 Dim mins1 As Byte ' минуты в десятичном формате Dim hr As Byte ' часы в формате DS1307 Dim hr1 As Byte ' часы в десятичном формате Dim day As Byte ' день недели Dim date As Byte ' дата в формате DS1307 Dim date1 As Byte ' дата в десятичном формате Dim mon As Byte ' месяц в формате DS1307 Dim mon1 As Byte ' месяц в десятичном формате Dim yr As Byte ' год в формате DS1307 Dim yr1 As Byte Dim tmp As Byte Dim tmp1 As Byte Dim X As Byte TRISB = %11111111 ' Сделать каналы PORTВ входами '--Инициализация-- Init: Clear 'I2COUT SDA, SCL, RTC_write, 7, [Ctrl] Main: If PORTB.4 = 0 Then Cls: DelayMS 500: GoTo UstVREMY GoSub read_time GoSub PRNT3_4 GoTo Main End Return UstVREMY: DelayMS 300 BranchL X, [Ust_godov, Ust_mesacev, Ust_dney, Ust_chasov, Ust_minut, Ust_secund] Print At 3 ,1,$A9,$63,$BF,$61,$BD,$6F,$B3,$BA,$61,$20,$B3,$70,$65,$BC,$65,$BD,$B8,$20,$20,$20 '"Ustanovka vremeni" If PORTB.7 = 0 Then Cls: DelayMS 300: GoTo Main GoTo UstVREMY Ust_godov: Print At 1, 1, $50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$B4,$6F,$E3,$6F,$B3,$20,$20,$20,$20,$20 '"Редакция годов" If PORTB.5 = 0 Then DelayMS 500: yr1 = yr1 + 1: If yr1 >= 99 Then yr1 = 99 If PORTB.6 = 0 Then DelayMS 500: yr1 = yr1 - 1: If yr1 <= 0 Then yr1 = 0 GoSub PRNT3_4 If PORTB.7 = 0 Then Cls: DelayMS 300: X = 1: GoTo UstVREMY GoTo Ust_godov
Ust_mesacev: Print At 1, 1, $50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$BC,$65,$63,$C7,$E5,$65,$B3,$20,$20,$20 '"Ред месяцев " If PORTB.5 = 0 Then DelayMS 500: mon1 = mon1 + 1: If mon1 >= 12 Then mon1 = 12 If PORTB.6 = 0 Then DelayMS 500: mon1 = mon1 - 1: If mon1 <= 0 Then mon1 = 0 GoSub PRNT3_4 If PORTB.7 = 0 Then Cls: DelayMS 300: X = 2: GoTo UstVREMY GoTo Ust_mesacev Ust_dney: Print At 1, 1, $$50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$E3,$BD,$65,$B9,$20,$20,$20,$20,$20,$20 '"Ред дней" If PORTB.5 = 0 Then DelayMS 500: date1 = date1 + 1: If date1 >= 30 Then date1 = 30 If PORTB.6 = 0 Then DelayMS 500: date1 = date1 - 1: If date1 <= 0 Then date1 = 0 GoSub PRNT3_4 If PORTB.7 = 0 Then Cls: DelayMS 300: X = 3: GoTo UstVREMY GoTo Ust_dney Ust_chasov: Print At 1, 1, $50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$C0,$61,$63,$6F,$B3,$20,$20,$20,$20,$20 If PORTB.5 = 0 Then DelayMS 500: hr1 = hr1 + 1: If hr1 >= 23 Then hr1 = 23 If PORTB.6 = 0 Then DelayMS 500: hr1 = hr1 - 1: If hr1 <= 0 Then hr1 = 0 GoSub PRNT3_4 If PORTB.7 = 0 Then Cls: DelayMS 300: X = 4: GoTo UstVREMY GoTo Ust_chasov Ust_minut: Print At 1, 1, $50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$BC,$B8,$BD,$79,$BF,$20,$20,$20,$20,$20 '"Redakciya minut" If PORTB.5 = 0 Then DelayMS 500: mins1 = mins1 + 1: If mins1 >= 59 Then mins1 = 59 If PORTB.6 = 0 Then DelayMS 500: mins1 = mins1 - 1: If mins1 <= 0 Then mins1 = 0 GoSub PRNT3_4 If PORTB.7 = 0 Then Cls: DelayMS 300: X = 5: GoTo UstVREMY GoTo Ust_minut Ust_secund: Print At 1, 1, $50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$63,$65,$BA,$79,$BD,$E3,$20,$20,$20,$20 '"Redakciya secund" If PORTB.5 = 0 Then DelayMS 500: sec1 = sec1 + 1: If sec1 >= 59 Then sec1 = 59 If PORTB.6 = 0 Then DelayMS 500: sec1 = sec1 - 1: If sec1 <= 0 Then sec1 = 0 GoSub PRNT3_4 If PORTB.7 = 0 Then Cls: DelayMS 300: X = 0: GoSub write_time: GoTo Main GoTo Ust_secund Return PRNT3_4: Print At 3, 1,$E0,$61,$BF,$61,$20,$3A,$20, Dec2 date1,"-",Dec2 mon1,"-",Dec2 yr1 Print At 4, 1,$42,$70,$65,$BC,$C7,$3A,$20, Dec2 hr1,"-",Dec2 mins1,"-",Dec2 sec1 Return '--Чтение времени из DS1307-- read_time: I2CIN SDA, SCL, RTC_read, 0, [sec,mins,hr,day,date,mon,yr] tmp = sec GoSub fix_bcd_in sec1 = tmp tmp = mins GoSub fix_bcd_in mins1 = tmp tmp = hr GoSub fix_bcd_in hr1 = tmp tmp = date GoSub fix_bcd_in date1 = tmp tmp = mon GoSub fix_bcd_in mon1 = tmp tmp = yr GoSub fix_bcd_in yr1 = tmp Return
'--Запись времени в DS1307--- write_time: tmp = sec1 GoSub fix_bcd_out sec = tmp tmp = mins1 GoSub fix_bcd_out mins = tmp tmp = hr1 GoSub fix_bcd_out hr = tmp tmp = date1 GoSub fix_bcd_out date = tmp tmp = mon1 GoSub fix_bcd_out mon = tmp tmp = yr1 GoSub fix_bcd_out yr = tmp sec = 0 I2COUT SDA, SCL, RTC_write, 0, [sec,mins,hr,day,date,mon,yr] Return fix_bcd_in: tmp1 = tmp & 15 tmp = tmp >> 4 tmp = tmp1 + 10 * tmp Return fix_bcd_out: tmp1 = tmp / $A tmp = tmp - (tmp1 * $A) tmp = tmp + (tmp1 << 4) Return Часы у меня получились, взял код из http://terrarus.ucoz.ru/contr_na_pic16/index.html Контроллер ошибок на PIC16F887A. Ну вот не пойму как реализовать таймер. С TMR0 понятно, но мне нужно на ds1307.Добавлено (24.07.2011, 21.44.10) --------------------------------------------- А если сделать на сравнение, то есть если минуты и часы отчитываемые ds1307 совпадут с установленным c кнопками таймера устанавливающие минуты и часы, то должен произойти установление флага и прерывание по определенному по порту.Правильно я понял...............
|
|
|
|