با سلام
یک برنامه نوشتم که جدا از اینکه یک ساعت را در اولین اجرای خودش نمایش میده این قابلیت را داره که با کلیک کردن دکمه اینتر بشه ساعت رو تنظیم نمود.
قابلیت دیگرش به کمک 2 کلید تایمر جهت تنظیم زمان روشن و خاموش کردن برای دو خروجی مرتبط با رله ها هست.
1) مشکل اینجاست که پس از تنظیم زمان تایمر، در ابتدا چشمک زده بعد روشن میشه.
2) زمان تنظیم شده برای خاموشی اصلا اجرایی روی پایه خروجی نداره.
در هردوی تایمرها همین مشکل هست.
برنامه را با شبیه سازی میگذارم ممنون میشم اشکال برنامه را بررسی بفرمایید.
	
لینک فایل شبیه ساز : http://www.4shared.com/zip/cOHd6u56/Clock__Two_Timer.html
					یک برنامه نوشتم که جدا از اینکه یک ساعت را در اولین اجرای خودش نمایش میده این قابلیت را داره که با کلیک کردن دکمه اینتر بشه ساعت رو تنظیم نمود.
قابلیت دیگرش به کمک 2 کلید تایمر جهت تنظیم زمان روشن و خاموش کردن برای دو خروجی مرتبط با رله ها هست.
1) مشکل اینجاست که پس از تنظیم زمان تایمر، در ابتدا چشمک زده بعد روشن میشه.
2) زمان تنظیم شده برای خاموشی اصلا اجرایی روی پایه خروجی نداره.
در هردوی تایمرها همین مشکل هست.
برنامه را با شبیه سازی میگذارم ممنون میشم اشکال برنامه را بررسی بفرمایید.
کد:
	
	
$regfile = "m8def.dat"
$crystal = 8000000
Config Timer2 = Timer , Async = On , Prescale = 128
On Ovf2 Clock
Enable Interrupts
Enable Timer2
Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.2 , Db4 = Portd.3 , Db5 = Portd.4 , Db6 = Portd.5 , Db7 = Portd.6
Config Lcd = 16 * 2
Cursor Off
Config Portb = Input
Config Portc = Output
Dim W As Byte
W = Timer2
Timer2 = W
Dim Hour As Byte
Dim Minute As Byte
Dim Second As Byte
Dim Status As Byte
Dim Tim As Byte
Dim Comp As Bit
Comp = 0
Dim Hour_ont1 As Byte
Dim Minute_ont1 As Byte
Dim Second_ont1 As Byte
Dim Hour_ont2 As Byte
Dim Minute_ont2 As Byte
Dim Second_ont2 As Byte
Dim Hour_offt1 As Byte
Dim Minute_offt1 As Byte
Dim Second_offt1 As Byte
Dim Hour_offt2 As Byte
Dim Minute_offt2 As Byte
Dim Second_offt2 As Byte
Dim Set_h As Byte
Dim Set_m As Byte
Dim Set_s As Byte
Set_h = 0
Set_m = 0
Set_s = 0
Dim Shw_lcd As Bit
Dim Dly As Byte
Dim Clean As String * 16
Dly = 50
Clean = "        "
Down Alias Pinb.0
Enter Alias Pinb.1
Up Alias Pinb.2
Time_1 Alias Pinb.3
Time_2 Alias Pinb.4
Relay_1 Alias Pinc.1
Relay_2 Alias Pinc.0
Main:
  Do
   If Comp = 1 Then
     '''''''''''''''''''''''''''' Timer 1 Check ''''''''''''''''''''''''
   If Hour_ont1 = Hour And Minute_ont1 = Minute And Second_ont1 = Second Then
     Waitms 25
     Set Relay_1
   End If
   If Hour = Hour_offt1 And Minute = Minute_offt1 And Second = Second_offt1 Then
    Waitms 25
     Reset Relay_1
   End If
     '''''''''''''''''''''''''''' Timer 2 Check ''''''''''''''''''''''''
   If Hour_ont2 = Hour And Minute_ont2 = Minute And Second_ont2 = Second Then
     Waitms 25
     Set Relay_2
   End If
   If Hour = Hour_offt2 And Minute = Minute_offt2 And Second = Second_offt2 Then
     Waitms 25
     Reset Relay_2
   End If
   End If
   If Enter = 0 Then
     Waitms Dly
     Shw_lcd = 0
     Cls
     Locate 1 , 2
     Lcd "Clock Setting"
     Set_h = Hour
     Set_m = Minute
     Set_s = Second
     Gosub Set_time
     Hour = Set_h
     Minute = Set_m
     Second = Set_s
   End If
   If Time_1 = 0 Then
     Waitms Dly
     Shw_lcd = 0
     Tim = 1
     Gosub Set_timer
   End If
   If Time_2 = 0 Then
     Waitms Dly
     Shw_lcd = 0
     Tim = 2
     Gosub Set_timer
   End If
   Shw_lcd = 1
   Set_h = 0
   Set_m = 0
   Set_s = 0
  Loop
Set_timer:
  Cls
  Locate 1 , 2
  Lcd "Setting Timer" ; Tim
  Locate 2 , 2
  Lcd "Select UP/DOWN"
  Status = 3
  Set_h = 0
  Set_m = 0
  Set_s = 0
  Do
   If Down = 0 Then
     Waitms Dly
     Locate 2 , 1
     Lcd Clean
     Waitms 2
     Locate 2 , 1
     Lcd "ST" ; Tim ; " On"
     If Tim = 1 Then
      Locate 2 , 9
      Lcd Hour_ont1 ; ":" ; Minute_ont1 ; ":" ; Second_ont1
     Else
      Locate 2 , 9
      Lcd Hour_ont2 ; ":" ; Minute_ont2 ; ":" ; Second_ont2
     End If
     Status = 1
   End If
   If Up = 0 Then
     Waitms Dly
     Locate 2 , 1
     Lcd Clean
     Waitms 2
     Locate 2 , 1
     Lcd "ST" ; Tim ; " OFF"
     If Tim = 1 Then
      Locate 2 , 9
      Lcd Hour_offt1 ; ":" ; Minute_offt1 ; ":" ; Second_offt1
     Else
      Locate 2 , 9
      Lcd Hour_offt2 ; ":" ; Minute_offt2 ; ":" ; Second_offt2
     End If
     Status = 0
   End If
   If Enter = 0 And Status = 0 And Tim = 1 Then
     Waitms Dly
     Cls
     Locate 1 , 2
     Lcd "Set Timer1 OFF"
     Set_h = Hour_offt1
     Set_m = Minute_offt1
     Set_s = Second_offt1
     Gosub Set_time
     Hour_offt1 = Set_h
     Minute_offt1 = Set_m
     Second_offt1 = Set_s
     Status = 1
     Comp = 1
     Goto Set_timer
   End If
   If Enter = 0 And Status = 1 And Tim = 1 Then
     Waitms Dly
     Cls
     Locate 1 , 2
     Lcd "Set Timer1 ON"
     Set_h = Hour_ont1
     Set_m = Minute_ont1
     Set_s = Second_ont1
     Gosub Set_time
     Hour_ont1 = Set_h
     Minute_ont1 = Set_m
     Second_ont1 = Set_s
     Status = 0
     Comp = 1
     Goto Set_timer
   End If
   If Enter = 0 And Status = 0 And Tim = 2 Then
     Waitms Dly
     Cls
     Locate 1 , 2
     Lcd "Set Timer2 OFF"
     Set_h = Hour_offt2
     Set_m = Minute_offt2
     Set_s = Second_offt2
     Gosub Set_time
     Hour_offt2 = Set_h
     Minute_offt2 = Set_m
     Second_offt2 = Set_s
     Status = 1
     Comp = 1
     Goto Set_timer
   End If
   If Enter = 0 And Status = 1 And Tim = 2 Then
     Waitms Dly
     Cls
     Locate 1 , 2
     Lcd "Set Timer2 ON"
     Set_h = Hour_ont2
     Set_m = Minute_ont2
     Set_s = Second_ont2
     Gosub Set_time
     Hour_ont2 = Set_h
     Minute_ont2 = Set_m
     Second_ont2 = Set_s
     Status = 0
     Comp = 1
     Goto Set_timer
   End If
   If Time_1 = 0 Or Time_2 = 0 Then
     Waitms Dly
     Return
   End If
  Loop
''''''''''''''''''''''''''''''''''' Setting Time ''''''''''''''''''''''''''''
Set_time:
  Do
   If Up = 0 Then
     Waitms Dly
     Incr Set_h
     If Set_h = 24 Then Set_h = 0
   End If
   If Enter = 0 Then
     Waitms Dly
     Exit Do
   End If
   If Down = 0 Then
     Waitms Dly
     Decr Set_h
     If Set_h = 255 Then Set_h = 23
   End If
   Gosub Show_lcd
  Loop
  Do
   If Up = 0 Then
     Waitms Dly
     Incr Set_m
     If Set_m = 60 Then Set_m = 0
   End If
   If Enter = 0 Then
     Waitms Dly
     Exit Do
   End If
   If Down = 0 Then
     Waitms Dly
     Decr Set_m
     If Set_m = 255 Then Set_m = 59
   End If
   Gosub Show_lcd
  Loop
  Do
   If Up = 0 Then
     Waitms Dly
     Incr Set_s
     If Set_s = 60 Then Set_s = 0
   End If
   If Enter = 0 Then
     Waitms Dly
     Cls
     Return
   End If
   If Down = 0 Then
     Waitms Dly
     Decr Set_s
     If Set_s = 255 Then Set_s = 59
   End If
   Gosub Show_lcd
  Loop
  ''''''''''''''''''''''''''''''''' Show On LCD '''''''''''''''''''''''''''''
Show_lcd:
  Locate 2 , 1
  Lcd Clean
  Locate 2 , 5
  Lcd Set_h ; ":" ; Set_m ; ":" ; Set_s
  Return
'################################# Clock ######################################'
Clock:
'get here every second with a 32768 Hz xtal
    If Second = 59 Then
        Second = 0
        If Minute = 59 Then
            Minute = 0
            If Hour = 23 Then
                Hour = 0
            Else
                Incr Hour
            End If
        Else
            Incr Minute
        End If
    Else
        Incr Second
    End If
  If Shw_lcd = 1 Then
   Cls
   Locate 1 , 6
   Lcd Hour ; ":" ; Minute ; ":" ; Second
  End If
Return
End                             'end program
لینک فایل شبیه ساز : http://www.4shared.com/zip/cOHd6u56/Clock__Two_Timer.html



 oo:
oo:





دیدگاه