16F628A Takvim Saat
16F628A, DS1302 zaman modülü, I2C Seri Bağlantı Modülü, 1602A LCD kullanarak gerçek zamanlı bir saat-takvim yapalım.
Gerekli bütün açıklamalar program dosyası içinde yapılmıştır. Eğer devrede buton kontrolü kullanmak isterseniz 16F628A Saat Takvim Devresi Buton Kontrolü yazımızı okuyabilirsiniz. Butonların nasıl kullanılacağı hakkında size fikir verecektir.
DEVRE ŞEMASI
DEVRE ŞEMASI
PROTON IDE KODLARI:
(test.bas dosyası)
' PROTON IDE ile programlanmıştır
' test.bas
' KODLA GİTSİN KODLA GİTSİN KODLA GİTSİN KODLA GİTSİN KODLA GİTSİN KODLA GİTSİN
'
'
Include "I2CPrintSoftCommand.inc" '16F628A’da donanım I2C bulunmadığından I2C yazılımını ekliyoruz
Device 16F628A 'işlemci tanımlanıyor
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, BODEN_OFF, BOREN_OFF, DATA_CP_OFF 'Fuses tanımlamaları
Xtal 4 'kristal frekansı
All_Digital TRUE 'tüm pinleri dijital giriş çıkış yapıyoruz
Clear 'tüm değişkenleri temizliyoruz.
'LCD için ayarlamalar yapıyoruz
Declare SCL_Pin = PORTB.4 'pin 10 ==> LCD I2C modülü SCL çıkışı buraya bağlanıyor
Declare SDA_Pin = PORTB.5 'pin 11 ==> LCD I2C modülü SDA çıkışı buraya bağlanıyor.
Declare Slow_Bus On
'DS1032 için ayarlamalar yapıyruz
RST var PORTA.0 'RA0 ==> pin 17'ye RST adı atandı ds1302 modülünün RST çıkışı buraya bağlanıyor
IO var PORTA.2 'RA1 ==> pin 18'e IO adını atandı. ds1302 modülünün DAT çıkışı buraya bağlanıyor
SCLK var PORTA.1 'RA2 ==> pin 01'e SCLK adını atandı. ds1302 modülünün CLK çıkışı buraya bağlanıyor
'değişkenlerimiz
rtcyear var Byte 'yıl
rtcday var Byte 'haftanın günü
rtcmonth var Byte 'ay
rtcdate var Byte 'gün
rtchr var Byte 'saat
rtcmin var Byte 'dakika
rtcsec var Byte 'saniye
rtccontrol var Byte
DelayMS 500 'Kısa gecikme. İşlmeciyi dengelemek için
Print $FE, 3 'LCD arka ışığı aç
Main:
Low RST 'RST bacağını sıfırladı.
Low SCLK 'SCLK bacağını sıfırladı.
rtcyear=$19 'yıl
rtcday=$05 'haftanın günü
rtcmonth=$07 'ay
rtcdate=$19 'gün
rtchr=$01 'saat
rtcmin=$58 'dakika
rtcsec=$08 'saniye
'GoSub SetTime 'SetTime program bloğunu çağırdı. ---ZAMANI DEĞİŞTİRMEK İÇİN BU SATIRI AKTİVE EDİN---
GoTo Main_Loop 'Main_Loop program bloguna gitti.
Main_Loop:
GoSub GetTime 'GetTime program bloğunu çağırdı.
'1.satırı yazdırıyoruz
Print At 1,1, Hex2 rtcdate, "/", Hex2 rtcmonth, "/", Hex2 rtcyear 'ay/gün/yıl şeklinde tarihi yazdırıyoruz
'haftanın günü (rtcday)değişkenini kontrol edip gün ismi yazdırıyoruz
If rtcday = 1 Then Print At 1 , 10 , "Pts"
If rtcday = 2 Then Print At 1 , 10 , "Sal"
If rtcday = 3 Then Print At 1 , 10 , "Car"
If rtcday = 4 Then Print At 1 , 10 , "Per"
If rtcday = 5 Then Print At 1 , 10 , "Cum"
If rtcday = 6 Then Print At 1 , 10 , "Cts"
If rtcday = 7 Then Print At 1 , 10 , "Paz"
'2.satırı yazdırıyoruz
Print At 2,1, Hex2 rtchr, ":", Hex2 rtcmin, ":", Hex2 rtcsec 'saat:dakika:saniye şeklinde zamanı yazdırıyoruz
' yanıp sönen * işareti ekliyoruz
Print At 2,16,"*"
DelayMS 500
Print At 2,16," "
DelayMS 500
GoTo Main_Loop
SetTime: 'zamanı ayarlama fonksyonumuz
RST=1 'Reseti kaldırarak haberleşme hattını açtı.
SHIFTOUT IO, SCLK, LsbFirst, [$8e, 0] 'DS1302'yi ayarlayama kodunu yolladı.
RST=0 'Resetleme
RST=1 'Reseti kaldırarak haberleşme hattını açtı.
SHIFTOUT IO, SCLK, LsbFirst, [$be,rtcsec,rtcmin,rtchr,rtcdate,rtcmonth,rtcday,rtcyear, 0] 'DS1302'ye ayarlama yapılacağı bildirilmişti, şimdi de yeni zaman bilgileri yollandı.
RST=0 'Resetleme
Return
GetTime: 'Zamanı okuma fonksiyonumuz
RST=1 'Reseti kaldırarak haberleşme hattını açtı.
SHIFTOUT IO, SCLK, LsbFirst, [$bf ] 'DS1302'den zaman bilgisi alma kodunu yolladı.
SHIFTIN IO,SCLK,LsbPre, [rtcsec, rtcmin, rtchr, rtcdate, rtcmonth, rtcday, rtcyear,rtccontrol] 'DS1302'den zaman bilgisi alınacağı bildirilmişti, şimdi de zaman bilgileri alındı.
RST=0 'Resetleme
Return
I2CPrintSoftCommand.inc DOSYASI:
'*****************************************************************************************************************
'* Name : I2CPrintHardCommand.inc *
'* Purpose : allow Proton Print commands to access the standard 1602 LCD via I2C backpack board *
'* Author : George Towler *
'* Notice : I claim no copyright but maybe Barak does *
'* Date : 18/01/2015 *
'* Compiler: 3.5.7.1 *
'* Version : 0.9.0 *
'* Notes : see http://www.protonbasic.co.uk/showthread.php/62478-%93Print%94-command-for-SPI-Alfa-numeric-LCD *
'* : post #6 Barak shows how to replace Proton commands and how to deal with control (FE$) bytes *
'*****************************************************************************************************************
'#################################################################################################################
'# Modified for software I2C by Harm van de Ven (https://www.hvandeven.com) & (https://github.com/hvandeven) #
'# So far only tested on a PIC16F628A with a 16x2 display and a 20x4 display #
'#################################################################################################################
#Disable Print ;Disable the Proton Print command
;***************************************************************************************************************
; Configure items to suit your LCD and I2C hardware, I2CPrint_DataOnHighBits remmed if data is on low bits *
; *
;Symbol I2CPrint_address = %01110000 ' PCF8574A Slave Address 0,1,1,1,A2,A1,A0,RW where W=0 *
;Yukarıdaki Symbol I2CPrint_address = %01110000 satırı çalışmadı,alttaki gibi değiştirdim, çalıştı *
Symbol I2CPrint_address = %01001110 ' PCF8574 Slave Address 0,1,1,1,A2,A1,A0,RW where W=0 *
Symbol I2CPrint_InitForLCDLines = $28 ' $28 for two lines *
Symbol I2CPrint_RS = 000001 ' *
Symbol I2CPrint_RW = 000010 ' *
Symbol I2CPrint_E = 000100 ' *
Symbol I2CPrint_BackLight = 001000 ' *
$define I2CPrint_DataOnHighBits ' *
;***************************************************************************************************************
Symbol I2CPrint_RS_E = I2CPrint_RS | I2CPrint_E
$ifdef I2CPrint_DataOnHighBits
Symbol I2CPrint_Init1 = 110000
Symbol I2CPrint_Init1_E = 110000 | I2CPrint_E
Symbol I2CPrint_Init2 = 110000
Symbol I2CPrint_Init2_E = 110000 | I2CPrint_E
Symbol I2CPrint_Init3 = 100000
Symbol I2CPrint_Init3_E = 100000 | I2CPrint_E
$else
Symbol I2CPrint_Init1 = 000011
Symbol I2CPrint_Init1_E = 000011 | I2CPrint_E
Symbol I2CPrint_Init2 = 000011
Symbol I2CPrint_Init2_E = 000011 | I2CPrint_E
Symbol I2CPrint_Init3 = 000010
Symbol I2CPrint_Init3_E = 000010 | I2CPrint_E
$endif
Dim BPF As Byte System
Symbol I2CPrint_tComOrData = BPF.0
Symbol I2CPrint_tInitialised = BPF.1
Dim I2CPrint_PrintStore As Byte
Dim I2CPrint_PrintData As Byte
Dim I2CPrint_HighData As Byte
Dim I2CPrint_LowData As Byte
Dim I2CPrint_dummy As Byte
Dim I2CPrint_RSFlag As Byte
Dim Backlight_State As Byte
GoTo I2CPrintCommand_End
@Print ; assembler Print redirect
Wreg_Byte I2CPrint_PrintStore ; save the W Register
If I2CPrint_tInitialised = 0 Then ; Has LCD been inititalised?
DelayMS 100 ; Power-on delay for slow display types
BStart
BusOut I2CPrint_address, [I2CPrint_Init1_E] ; E hi and send command nibble 0011 (3)
BusOut I2CPrint_address, [I2CPrint_Init1] ; E lo
DelayMS 2
BusOut I2CPrint_address, [I2CPrint_Init2_E] ; E hi and send command nibble 0011 (3)
BusOut I2CPrint_address, [I2CPrint_Init2] ; E lo
DelayMS 2
BusOut I2CPrint_address, [I2CPrint_Init3_E] ; E hi and send command nibble 0010 (2)
BusOut I2CPrint_address, [I2CPrint_Init3] ; E lo
DelayMS 2
I2CPrint_PrintData = I2CPrint_InitForLCDLines ; 4 bit mode and n lines
GoSub I2CPrint_SendControl
I2CPrint_PrintData = $0C ; enable display, cursor and blink off
GoSub I2CPrint_SendControl
I2CPrint_PrintData = $06 ; move cursor after each write
GoSub I2CPrint_SendControl
I2CPrint_PrintData = $80 ; goto column 1 line 1
GoSub I2CPrint_SendControl
Set I2CPrint_tInitialised ; Indicate that the LCD is initialised
BStop
EndIf
I2CPrint_PrintData = I2CPrint_PrintStore
If I2CPrint_PrintData = 0xFE Then ; it is a command header
I2CPrint_RSFlag = 0 ; clear a flag so we know the next byte will be a command
Else
If I2CPrint_RSFlag = 0 Then ; this is a command byte
If I2CPrint_PrintData = 03 Then
Backlight_State = I2CPrint_BackLight
ElseIf I2CPrint_PrintData = 04 Then
Backlight_State = 0
Else
GoSub I2CPrint_SendControl
EndIf
Else
GoSub I2CPrint_SendData
EndIf
I2CPrint_RSFlag = 1 ; set the flag so the next byte will be send as Data
EndIf
Byte_Wreg I2CPrint_PrintStore ; restore the W register
Return
' ****************************************************************************
' ** S U B R O U T I N E S **
' ****************************************************************************
I2CPrint_SendData:
$ifdef I2CPrint_DataOnHighBits
I2CPrint_HighData = I2CPrint_PrintData & %11110000 ; mask LSBs
I2CPrint_LowData = I2CPrint_PrintData << 4 ; shift left
$else
I2CPrint_LowData = I2CPrint_PrintData & 001111 ; mask MSBs
I2CPrint_HighData = I2CPrint_PrintData >> 4 ; shift Right
$endif
I2CPrint_dummy = I2CPrint_RS_E | I2CPrint_HighData ; data and e hi
I2CPrint_dummy = I2CPrint_dummy | Backlight_State ; data and e hi and bls
BusOut I2CPrint_address, [I2CPrint_dummy]
I2CPrint_dummy = I2CPrint_RS | I2CPrint_HighData ; data and e lo
I2CPrint_dummy = I2CPrint_dummy | Backlight_State ; data and e lo and bls
BusOut I2CPrint_address, [I2CPrint_dummy]
I2CPrint_dummy = I2CPrint_RS | Backlight_State ; data and e hi
BusOut I2CPrint_address, [I2CPrint_dummy] ; Delay, RS on throughout
I2CPrint_dummy = I2CPrint_RS_E | I2CPrint_LowData ; data and e hi
I2CPrint_dummy = I2CPrint_dummy | Backlight_State ; data and e hi and bls
BusOut I2CPrint_address, [I2CPrint_dummy]
I2CPrint_dummy = I2CPrint_RS | I2CPrint_LowData ; data and e lo
I2CPrint_dummy = I2CPrint_dummy | Backlight_State ; data and e lo and bls
BusOut I2CPrint_address, [I2CPrint_dummy]
Return
I2CPrint_SendControl:
$ifdef I2CPrint_DataOnHighBits
I2CPrint_HighData = I2CPrint_PrintData & %11110000 ; mask LSBs
I2CPrint_LowData = I2CPrint_PrintData << 4 ; shift left
$else
I2CPrint_LowData = I2CPrint_PrintData & 001111 ; mask MSBs
I2CPrint_HighData = I2CPrint_PrintData >> 4 ; shift Right
$endif
I2CPrint_dummy = I2CPrint_E | I2CPrint_HighData ; data and e hi
I2CPrint_dummy = I2CPrint_dummy | Backlight_State ; data and e hi and bls
BusOut I2CPrint_address, [I2CPrint_dummy]
I2CPrint_dummy = I2CPrint_HighData | Backlight_State ; data and e lo and bls
BusOut I2CPrint_address, [I2CPrint_dummy]
I2CPrint_dummy = Backlight_State ;
BusOut I2CPrint_address, [I2CPrint_dummy] ; Delay
I2CPrint_dummy = I2CPrint_E | I2CPrint_LowData ; data and e hi
I2CPrint_dummy = I2CPrint_dummy | Backlight_State ; data and e hi and bls
BusOut I2CPrint_address, [I2CPrint_dummy]
I2CPrint_dummy = I2CPrint_LowData | Backlight_State ; data and e lo and bls
BusOut I2CPrint_address, [I2CPrint_dummy]
Return
I2CPrintCommand_End:
KULLANILAN PROGRAMLAR: Proton Ide 2.0.1.2 , Microbrn
KULLANILAN PROGRAMLAYICI: K150 PIC Programmer (Klon)
Yorumlar
Yorum Gönder