16F628A Saat Takvim Devresi Buton Kontrolü

Bir önceki yazımda (16F628A Takvim Saat) bahsettiğim devreye buton eklemeye karar verdim. 2 buton ve 1 LED ekleyerek butonlardan birine basınca 1602A LCD ekranda SET yazısını gösterirken aynı zamanda LED yanacak, ikinci butona basınca ekrandaki SET yazısı silinecek ve LED de sönecek.

Gerekli bütün açıklamalar program dosyası içinde yapılmıştır.

DEVRE ŞEMASI:



PROTON IDE KODLARI:
(test_v2.bas dosyası)


' PROTON IDE ile programlanmıştır
' test_v2.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     

Symbol BUTON1 = PORTA.3    'Buton1 pin2
Symbol BUTON2 = PORTA.4    'BUTON2 pin3
Symbol LED1 = PORTB.3          'LED1   pin9
   

'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: 
   If BUTON1 = 1 Then GoSub ElleAyarla           ' BUTON1'e basılırsa ...
   If BUTON2 = 1 Then GoSub ElleAyarlaBitti      ' BUTIN2'ye basılırsa ...
    DelayMS 50      ' basmayı yakalamakiçinbiraz bekletelim...
GoSub GetTime 'GetTime program bloğunu çağırdı.    

'1.satırı yazdırıyoruz
Print At 1,1, Hex2 rtcdate, "."
'Print At 1,4, Hex2 rtcmonth, "/"
If rtcmonth = 1 Then Print At 1,4, "Oca"
If rtcmonth = 2 Then Print At 1,4, "Sub"
If rtcmonth = 3 Then Print At 1,4, "Mar"
If rtcmonth = 4 Then Print At 1,4, "Nis"
If rtcmonth = 5 Then Print At 1,4, "May"
If rtcmonth = 6 Then Print At 1,4, "Haz"
If rtcmonth = 7 Then Print At 1,4, "Tem"
If rtcmonth = 8 Then Print At 1,4, "Agu"
If rtcmonth = 9 Then Print At 1,4, "Eyl"
If rtcmonth = 10 Then Print At 1,4, "Eki"
If rtcmonth = 11 Then Print At 1,4, "Kas"
If rtcmonth = 12 Then Print At 1,4, "Ara"
Print At 1,7,"."
Print At 1,8, Hex2 rtcyear   
'haftanın günü (rtcday)değişkenini kontrol edip gün ismi yazdırıyoruz
If rtcday = 1 Then Print At 1 , 11 , "Pts"
If rtcday = 2 Then Print At 1 , 11 , "Sal"
If rtcday = 3 Then Print At 1 , 11 , "Car"
If rtcday = 4 Then Print At 1 , 11 , "Per"
If rtcday = 5 Then Print At 1 , 11 , "Cum"
If rtcday = 6 Then Print At 1 , 11 , "Cts"
If rtcday = 7 Then Print At 1 , 11 , "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

ElleAyarla:      ' BUTON 1'e basılınca yapılacak işlemler
Print At 2,11,"SET" 
High LED1

   If BUTON2 = 1 Then    GoSub ElleAyarlaBitti
    DelayMS 250


Return

ElleAyarlaBitti:    ' BUTON 2'ye basılınca yapılacak işlemler
Print At 2,11,"   "
Low LED1
 DelayMS 250
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:

NOT:
test_v2.bas dosyasında günlerin yazıldığı if then yapılı aşağıdaki bölümü case yapısı ile değiştirmek isterseniz:

If rtcday = 1 Then Print At 1 , 11 , "Pts"
If rtcday = 2 Then Print At 1 , 11 , "Sal"
If rtcday = 3 Then Print At 1 , 11 , "Car"
If rtcday = 4 Then Print At 1 , 11 , "Per"
If rtcday = 5 Then Print At 1 , 11 , "Cum"
If rtcday = 6 Then Print At 1 , 11 , "Cts"
If rtcday = 7 Then Print At 1 , 11 , "Paz" 

yukarıdaki if then yapılı bölümü case yapısı ile değiştirmek isterseniz aşağıdaki kodlarla değiştirin:

Select Case rtcday 
Case 1 
Print At 1,11,"Pzt"
Case 2 
Print At 1,11,"Sal"
Case 3 
Print At 1,11,"Car"
Case 4 
Print At 1,11,"Per"
Case 5 
Print At 1,11,"Cum"
Case 6 
Print At 1,11,"Cts"
Case 7 
Print At 1,11,"Paz"
End Select 



KULLANILAN PROGRAMLAR: Proton Ide 2.0.1.2 , Microbrn

KULLANILAN PROGRAMLAYICI: K150 PIC Programmer (Klon)




Yorumlar