hazna
Newbie
please my friends
I want to change this 8051 bass file into a hex file .. but when I try to always error, I use Bascom 8051
I want to change this 8051 bass file into a hex file .. but when I try to always error, I use Bascom 8051
Code:
' --------------------------------
' alarm1307.BAS 2-10-06
' Led display with ds1307 rtc chip and max7219-hh:mm:ss
' written by K.S. Sankar www.mostek.biz India
' for MCS ELECTRONICS - Holland
$large
$regfile = "89s8252.dat"
$crystal = 6000000
P0 = 0
P2 = 0
P1 = 0
P3 = &B11111111
P1.3 = 1
' ports
' p3.0-rx not used
' p3.1-tx not used
' p3.2-> sw alarm set/OFF
' p3.3-> sw mode 0=press
' p3.4-> sw set (+) 0=press
' p3.5-> sw alarm snooze 0=press
' p3.6-> i2c bus SCL
' p3.7-> i2c bus SDA
'--------------------
' p1.0-> clock
' p1.1-> din
' p1.2-> /chip select
' p1.3-> sw set (-) 0=press
' p1.4-> buzzer alarm
' p1.5-> led- PM indicator
' p1.6-> led- alarm active indicator
' p1.7 - not used
' P0- NOT USED
' P2- NOT USED
' press p3.3 + p3.4 together for INTI of RTC chip
On Int0 Int0_int
Set Tcon.0
' edge triggered
Enable Interrupts
Enable Int0
'enable the interrupt
Config Timer0 = Timer , Gate = Internal , Mode = 2
' 8 bit auto reload
On Timer0 Timer_0_overflow_int
Load Timer0 , 250
Priority Set Timer0
Enable Interrupts
Enable Timer0
Start Timer0
' define aliases
Sw_alarm_set Alias P3.2
Sw_alarm_snooze Alias P3.5
Sw_mode Alias P3.3
Sw_set Alias P3.4
Sw_set_minus Alias P1.3
Clock Alias P1.0
Din Alias P1.1
Cs Alias P1.2
Buzzer Alias P1.4
Led_pm Alias P1.5
Led_alarm_active Alias P1.6
'------------------------------------------
' config I2C bus
Config Scl = P3.6
' I2C Clock
Config Sda = P3.7
' I2C Data
'-------------------------------------------
Const Ds1307w = &HD0
' Write
Const Ds1307r = &HD1
' Read
Const Sec_addmap = &H00
Const Min_addmap = &H01
Const Hour_addmap = &H02
Const Control_addmap = &H07
Const Alarm_sec_addmap = &H08
Const Alarm_min_addmap = &H09
Const Alarm_hour_addmap = &H0A
Const Alarm_active_addmap = &H0B
Const Brightness_addmap = &H0C
' buzzer ON time in seconds
Const Buz_time = 30
Const Snooze_mins = 5
' declare variables
'-------------------------------------------------------
Dim Num_hour As Byte , Num_min As Byte , Num_sec As Byte
Dim Alarm_num_hour As Byte , Alarm_num_min As Byte
Dim Alarm_num_sec As Byte
Dim Flicker_h As Bit , Flicker_m As Bit , Flicker_s As Bit
Dim Set_mode_count As Byte
Dim Temps As String * 2
Dim Reg_sec As Byte
Dim Reg_min As Byte
Dim Reg_hour As Byte
Dim Alarm_reg_sec As Byte
Dim Alarm_reg_min As Byte
Dim Alarm_reg_hour As Byte
Dim Alarm_toggle As Bit
Alarm_toggle = 0
Dim Snooze As Bit
Snooze = 0
Dim Pm_bit As Bit , Decrease As Bit
Dim Alarm_pm_bit As Bit
Dim Alarm_active As Bit , Alarm_active_byte As Byte
Dim Alarm_set As Bit , Buzzer_count As Byte , Diff As Byte
Dim Brightness As Byte , Bright_word As Word
Brightness = 7
Bright_word = 2560 + 7
Buzzer_count = 0
Alarm_set = 0
Alarm_active = 0
Alarm_active_byte = 0
Pm_bit = 0
Decrease = 0
' default alarm time
Alarm_pm_bit = 0
' am
Alarm_num_hour = 0
Alarm_num_min = 0
Alarm_num_sec = 0
Alarm_reg_hour = 0
Alarm_reg_min = 0
Alarm_reg_sec = 0
' Control
Dim Reg_mode As Byte
Dim Tempb As Byte
Dim Address As Byte
Dim Sec_count As Byte
Dim Clock_word As Word
Dim Sec_flag As Bit
Sec_count = 0
Sec_flag = 0
Clock_word = 0
'-----------------------------------------------------
Declare Sub Fni2cwrite(_slaveadd As Byte , _add As Byte , _num As Byte)
Dim _slaveadd As Byte
Dim _add As Byte
Dim _num As Byte
'Declare Sub Fni2cwriteb(_slaveaddb As Byte , _addb As Byte , _numb As Byte)
'Dim _slaveaddb As Byte
'Dim _addb As Byte
'Dim _numb As Byte
Declare Sub Fn7segh(_ih As Byte)
Dim _ih As Byte
Declare Sub Fn7segm(_im As Byte)
Dim _im As Byte
Declare Sub Fn7segs(_is As Byte)
Dim _is As Byte
Declare Sub Pulse_bit(bit1 As Bit)
Dim Bit1 As Bit
Declare Sub Pulse_word(w1 As Word)
Dim W1 As Word
Declare Sub Disp_digit(d1 As Byte , Num As Byte)
Dim D1 As Byte , Num As Byte
Declare Sub Disp_blank()
Dim I As Byte , Tens As Byte , Units As Byte
Dim J As Word
Dim K As Bit
Dim V As Integer
Dim V1 As Byte , V2 As Byte
Dim Del As Byte
Del = 1
Dim Maxdigits As Byte
Maxdigits = 8
V = &B1000111100001110
' format
' d15 d14 d13 d12 d11 d10 d09 d08 d7 d6 d5 d4 d3 d2 d1 d0
' x x x x address------ -------- data ---------
Dim Normal_mode As Word
' 0c00=shut down 0c01=normal
Normal_mode = &B0000110000000001
Dim Code_b As Word
' 09ff
Code_b = &B0000100111111111
' 0a0f led intesity
Dim Scan_limit As Word
' 0b07
Scan_limit = &B0000101100000111
' ALL 8 DIGITS
Dim Disp_test_off As Word
Disp_test_off = &B0000111100000000
Dim Disp_test_on As Word
Disp_test_on = &B0000111100000001
'Display-Test Register
'0f00 =normal 0f01 = test
Call Pulse_word(normal_mode)
Call Pulse_word(&H09ff)
Call Pulse_word(bright_word)
Call Pulse_word(scan_limit)
Call Pulse_word(disp_test_on)
Waitms 100
Call Pulse_word(disp_test_off)
Waitms 100
Gosub Read_ds1307
Gosub Read_alarm
Set_mode_count = 0
' write brightness in rtc chip
Brightness = 7
Bright_word = 2560 + 7
Call Pulse_word(bright_word)
Call Fni2cwrite(ds1307w , Brightness_addmap , Brightness)
'=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-
Main:
Gosub Read_ds1307
If Alarm_set = 0 Then
Call Fn7segh(reg_hour)
Call Fn7segm(reg_min)
Call Fn7segs(reg_sec)
If Pm_bit = 0 Then
Led_pm = 0
Else
Led_pm = 1
End If
End If
If Alarm_set = 1 Then
Gosub Read_alarm
Call Fn7segh(alarm_reg_hour)
Call Fn7segm(alarm_reg_min)
Call Fn7segs(alarm_reg_sec)
If Alarm_pm_bit = 0 Then
Led_pm = 0
Else
Led_pm = 1
End If
End If
' check for alarm condition
If Alarm_active = 1 Then
If Reg_hour = Alarm_reg_hour Then
If Reg_min = Alarm_reg_min Then
If Reg_sec = Alarm_reg_sec Then
If Pm_bit = Alarm_pm_bit Then
Buzzer = 1
Buzzer_count = 0
End If
End If
End If
End If
End If
If Alarm_active = 0 Then
Buzzer = 0
End If
If Buzzer_count >= Buz_time Then
Buzzer = 0
End If
' look for set key switches
If Sw_mode = 0 Then
' wait for keyrelease
While Sw_mode = 0
If Sw_set = 0 Then
' do a clock init if both keys pressed
Gosub Clock_init
Gosub Setzero
Set_mode_count = 4
End If
Wend
Waitms 30
Sec_count = 0
' start a second t0 timer
Gosub Swmode
End If
If Sw_set = 0 Then
Waitms 30
Decrease = 0
Gosub Swset
End If
If Sw_set_minus = 0 Then
Waitms 30
Decrease = 1
Gosub Swset
End If
If Set_mode_count > 0 Then
If Sec_count > 4 Then
' more than 4 secs in set operation in idle mode
' so quit
Set_mode_count = 0 : Alarm_set = 0
Flicker_h = 0 : Flicker_m = 0 : Flicker_s = 0
If Alarm_active = 1 Then
Call Fn7segh(alarm_reg_hour)
Call Fn7segm(alarm_reg_min)
Call Fn7segs(alarm_reg_sec)
Wait 1
End If
End If
End If
If Alarm_set = 1 Then
If Alarm_active = 1 Then
If Sec_count > 3 Then
Alarm_set = 0
Led_alarm_active = 1
End If
End If
End If
If Alarm_active = 1 Then
If Alarm_set = 0 Then
Led_alarm_active = 1
End If
End If
If Alarm_active = 0 Then
Led_alarm_active = 0
End If
If Buzzer = 1 Then
If Sw_alarm_snooze = 0 Then
Waitms 30
' snooze sw pressed
Snooze = 1
Buzzer = 0
' stop buzzer and
' make : colon flicker
' increase alarm time by 5 minutes
Gosub Snooze5
End If
End If
' check for alarm set switches
If Alarm_active = 0 Then
If Alarm_toggle = 1 Then
Waitms 30
' in alarm mode
Alarm_set = 1
Alarm_active = 1
Sec_count = 0
' write alarm act in ram
Alarm_active_byte = &B00000001
Snooze = 0
Call Fni2cwrite(ds1307w , Alarm_active_addmap , Alarm_active_byte)
End If
End If
' check for alarm OFF
If Alarm_active = 1 Then
If Alarm_toggle = 0 Then
Waitms 30
' alarm deactivated
Alarm_set = 0
Led_alarm_active = 0
Alarm_active = 0
Alarm_active_byte = &B00000000
Snooze = 0
Call Fni2cwrite(ds1307w , Alarm_active_addmap , Alarm_active_byte)
End If
End If
If Alarm_set = 1 Then
' flash led alarm to indicate SET mode
Led_alarm_active = Led_alarm_active Xor 1
Waitms 10
End If
If Buzzer = 0 Then
If Sw_alarm_snooze = 0 Then
Waitms 30
' snooze pressed without buzzer ON
' dim / bright 7-segment display
If Brightness = 1 Then
Brightness = 15
Else
Brightness = 1
End If
' write brightness in rtc chip and 7219
Bright_word = 2560 + Brightness
Call Pulse_word(bright_word)
Call Fni2cwrite(ds1307w , Brightness_addmap , Brightness)
End If
End If
Goto Main
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Swmode:
Sec_count = 0
' in set mode now
' look for set sw and shift from hours to min set
' let hours flicker for set++
Incr Set_mode_count
Flicker_h = 0 : Flicker_m = 0 : Flicker_s = 0
' 1= hours set 2= min set 3= sec set
If Set_mode_count = 1 Then
Flicker_h = 1
End If
If Set_mode_count = 2 Then
Flicker_m = 1
End If
If Set_mode_count = 3 Then
Flicker_s = 1
End If
If Set_mode_count > 3 Then
Set_mode_count = 0 : Alarm_set = 0
Flicker_h = 0 : Flicker_m = 0 : Flicker_s = 0
End If
Return
' =-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
Swset:
' incr hh/mm/ or sec
Sec_count = 0
' reset our idle timer
If Set_mode_count = 1 Then
Gosub Set_hours
End If
If Set_mode_count = 2 Then
Gosub Set_minutes
End If
If Set_mode_count = 3 Then
Gosub Set_seconds
End If
' adjust brightness
If Set_mode_count = 0 Then
If Decrease = 0 Then
Incr Brightness
If Brightness >= 15 Then
Brightness = 15
' show limit reached by flshing colon leds
Call Disp_digit(7 , 15)
Call Disp_digit(8 , 15)
Waitms 2
End If
Else
Decr Brightness
If Brightness = 0 Then
Brightness = 1
' show limit reached by flshing colon leds
Call Disp_digit(7 , 15)
Call Disp_digit(8 , 15)
Waitms 2
End If
End If
Bright_word = 2560 + Brightness
Call Pulse_word(bright_word)
Call Fni2cwrite(ds1307w , Brightness_addmap , Brightness)
End If
Return
'-=-=-=-=-=-=-=-=-=-=-=-=-=
Read_ds1307:
'-=-=-=-=-=-=-=-=-=-=-=-=-=
' Read Clock Data
Address = Sec_addmap
I2cstart
' Generate start
I2cwbyte Ds1307w
' Slave adsress
I2cwbyte Address
' Address of SECONDS REG
I2cstop
' Generate Stop
I2cstart
' Repeated start
I2cwbyte Ds1307r
' Slave address (read)
I2crbyte Reg_sec , Ack
I2crbyte Reg_min , Ack
I2crbyte Reg_hour , Nack
I2cstop
' Generate Stop
' check for am/pm
If Reg_hour.5 = 1 Then
Pm_bit = 1
Else
Pm_bit = 0
End If
'reg_hour.6=1(12 hrmode) =0(24 hourmode)
'=-=-=-=-=-=-=-=-=-=-=-
Reg_hour = Reg_hour And &B00011111
' remove 12/24 set and am/pm bits
' set numeric variables
Num_hour = Makedec(reg_hour)
Num_min = Makedec(reg_min)
Num_sec = Makedec(reg_sec)
' read brightness level
I2cstart
' Generate start
I2cwbyte Ds1307w
' Slave adsress
I2cwbyte Brightness_addmap
I2cstop
' Generate Stop
I2cstart
' Repeated start
I2cwbyte Ds1307r
' Slave address (read)
I2crbyte Brightness , Nack
I2cstop
Brightness = Makedec(brightness)
Bright_word = 2560 + Brightness
Return
'---------------------------------------------
Clock_init:
' double key stroke
Address = Sec_addmap
Tempb = Reg_sec And &B01111111
' start Oscillator Enable bit 7 of seconds put 0
I2cstart
I2cwbyte Ds1307w
I2cwbyte Address
I2cwbyte Tempb
I2cstop
' Generate Stop
Address = Hour_addmap
Reg_hour.6 = 1
' 12-Hour Mode
Reg_hour.5 = 0
' am mode
I2cstart
I2cwbyte Ds1307w
I2cwbyte Address
I2cwbyte Reg_hour
I2cstop
' Generate Stop
Address = Control_addmap
' control address map
Tempb = &B10010000
' 1 Hz SQW Output
I2cstart
I2cwbyte Ds1307w
I2cwbyte Address
I2cwbyte Tempb
I2cstop
Return
'-------------------------------------------------
Setzero:
'=-=-=-=
' set time to 11:59:50 am for testing
Pm_bit = 0
Num_hour = 11
Reg_hour = Makebcd(num_hour)
Reg_hour.5 = 0
' above force am mode 0=am 1=pm
Reg_hour.6 = 1
' force 12 hour
Num_min = 59
Num_sec = 50
Call Fni2cwriteb(ds1307w , Hour_addmap , Reg_hour)
Call Fni2cwrite(ds1307w , Min_addmap , Num_min)
Call Fni2cwrite(ds1307w , Sec_addmap , Num_sec)
' -----
Alarm_num_hour = 12
Alarm_num_min = 00
Alarm_num_sec = 01
Alarm_active_byte = &B00000000
Alarm_active = 0
Alarm_reg_hour = Makebcd(alarm_num_hour)
Alarm_reg_min = Makebcd(alarm_num_min)
Alarm_reg_sec = Makebcd(alarm_num_sec)
Alarm_reg_hour.6 = 1
' 12-Hour Mode
Alarm_reg_hour.5 = 1
' pm mode
' alarm= 12:00:01 pm
Call Fni2cwriteb(ds1307w , Alarm_hour_addmap , Alarm_reg_hour)
Call Fni2cwrite(ds1307w , Alarm_min_addmap , Alarm_num_min)
Call Fni2cwrite(ds1307w , Alarm_sec_addmap , Alarm_num_sec)
Call Fni2cwrite(ds1307w , Alarm_active_addmap , Alarm_active_byte)
' set min brightness
Brightness = 1
Bright_word = 2560 + Brightness
Call Pulse_word(bright_word)
Call Fni2cwrite(ds1307w , Brightness_addmap , Brightness)
Return
' =-=-=-=-=-=-=-
Set_seconds:
' set sec to 0
'=-=-=-=
If Alarm_set = 1 Then
Gosub Alarm_set_seconds
End If
If Decrease = 1 Then
Decrease = 0
Num_sec = 00
Else
Num_sec = 54
End If
Reg_sec = Makebcd(num_sec)
Call Fni2cwriteb(ds1307w , Sec_addmap , Reg_sec)
Gosub Read_ds1307
Waitms 5
Return
' =-=-=-=-=-=-=-==-=-=-=-=
Alarm_set_seconds:
' set sec to 0
'=-=-=-=
If Decrease = 1 Then
Decrease = 0
Alarm_num_sec = 00
Else
Alarm_num_sec = 54
End If
Alarm_reg_sec = Makebcd(alarm_num_sec)
Call Fni2cwriteb(ds1307w , Alarm_sec_addmap , Alarm_reg_sec)
Gosub Read_alarm
Waitms 5
Return
' =-=-=-=-=-=-=-
Set_minutes:
' set mins
'=-=-=-=
If Alarm_set = 1 Then
Gosub Alarm_set_minutes
Return
End If
Num_min = Makedec(reg_min)
If Decrease = 0 Then
Incr Num_min
If Num_min > 59 Then
Num_min = 0
Reg_min = 0
End If
Else
Decr Num_min
If Num_min = 255 Then
Num_min = 59
Reg_min = 59
End If
End If
Call Fni2cwrite(ds1307w , Min_addmap , Num_min)
Gosub Read_ds1307
Call Fn7segm(reg_min)
Waitms 5
Decrease = 0
Return
' =-=-=-=-=-=-=-
Alarm_set_minutes:
'=-=-=-=-=-=-=-=
Alarm_num_min = Makedec(alarm_reg_min)
If Decrease = 0 Then
Incr Alarm_num_min
If Alarm_num_min > 59 Then
Alarm_num_min = 0
Alarm_reg_min = 0
End If
Else
Decr Alarm_num_min
If Alarm_num_min = 255 Then
Alarm_num_min = 59
Alarm_reg_min = 59
End If
End If
Call Fni2cwrite(ds1307w , Alarm_min_addmap , Alarm_num_min)
Gosub Read_alarm
Call Fn7segm(alarm_reg_min)
Waitms 5
Decrease = 0
Return
' =-=-=-=-=-=-=-
Set_hours:
'=-=-=-=-=-=-=-=
If Alarm_set = 1 Then
Gosub Alarm_set_hours
Return
End If
If Decrease = 0 Then
Incr Num_hour
If Num_hour > 12 Then
Num_hour = 1
End If
Else
Decr Num_hour
If Num_hour = 0 Then
Num_hour = 12
End If
End If
If Decrease = 0 Then
If Num_hour = 12 Then
Pm_bit = Pm_bit Xor 1
End If
Else
If Num_hour = 11 Then
Pm_bit = Pm_bit Xor 1
End If
End If
Reg_hour = Makebcd(num_hour)
Reg_hour.6 = 1
' set 12 hr mode
If Pm_bit = 1 Then
Reg_hour.5 = 1
' pm
Else
Reg_hour.5 = 0
' am
End If
Call Fni2cwriteb(ds1307w , Hour_addmap , Reg_hour)
Gosub Read_ds1307
Call Fn7segh(reg_hour)
Waitms 5
Decrease = 0
Return
' =-=-=-=-=-=-=-
Alarm_set_hours:
' set alarm hours
'=-=-=-==-=-=-=-=
If Decrease = 0 Then
Incr Alarm_num_hour
If Alarm_num_hour > 12 Then
Alarm_num_hour = 1
End If
Else
Decr Alarm_num_hour
If Alarm_num_hour = 0 Then
Alarm_num_hour = 12
End If
End If
If Decrease = 0 Then
If Alarm_num_hour = 12 Then
Alarm_pm_bit = Alarm_pm_bit Xor 1
End If
Else
If Alarm_num_hour = 11 Then
Alarm_pm_bit = Alarm_pm_bit Xor 1
End If
End If
Alarm_reg_hour = Makebcd(alarm_num_hour)
Alarm_reg_hour.6 = 1
' set 12 hr mode
If Alarm_pm_bit = 1 Then
Alarm_reg_hour.5 = 1
' pm
Else
Alarm_reg_hour.5 = 0
' am
End If
Call Fni2cwriteb(ds1307w , Alarm_hour_addmap , Alarm_reg_hour)
Gosub Read_alarm
Call Fn7segh(alarm_reg_hour)
Decrease = 0
Return
' =-=-=-=-=-=-=-
' functions below
'=-=-=-=-=-= function below---- - -- -
Sub Fn7segh(_ih As Byte)
Tempb = Makedec(_ih)
Units = Tempb Mod 10
Tens = Tempb / 10
Call Disp_digit(5 , Units)
Call Disp_digit(6 , Tens)
Call Disp_digit(7 , 1)
Call Disp_digit(8 , 1)
If Flicker_h = 1 Then
' if in set mode make display flicker
Waitms 5
' turn it on again
Call Disp_digit(5 , 15)
Call Disp_digit(6 , 15)
Waitms 5
End If
If Snooze = 1 Then
' if in snooze mode make : flicker
Waitms 2
' turn it on again
Call Disp_digit(7 , 15)
Call Disp_digit(8 , 15)
Waitms 2
End If
End Sub
'-=-=-=-=-=-=-=-=
Sub Fn7segm(_im As Byte)
Tempb = Makedec(_im)
Units = Tempb Mod 10
Tens = Tempb / 10
Call Disp_digit(3 , Units)
Call Disp_digit(4 , Tens)
If Flicker_m = 1 Then
' if in set mode make display flicker
Waitms 5
' turn it on again
Call Disp_digit(3 , 15)
Call Disp_digit(4 , 15)
Waitms 5
End If
End Sub
'-=-=-=-=-=-=-=-=
Sub Fn7segs(_is As Byte)
Tempb = Makedec(_is)
Units = Tempb Mod 10
Tens = Tempb / 10
Call Disp_digit(1 , Units)
Call Disp_digit(2 , Tens)
If Flicker_s = 1 Then
' if in set mode make display flicker
Waitms 5
' turn it on again
Call Disp_digit(1 , 15)
Call Disp_digit(2 , 15)
Waitms 5
End If
End Sub
'-=-=-=-=-=-=-=-=
Sub Fni2cwrite(_slaveadd As Byte , _add As Byte , _num As Byte)
Dim _bcdnumber As Byte
_bcdnumber = Makebcd(_num )
I2cstart
I2cwbyte _slaveadd
I2cwbyte _add
I2cwbyte _bcdnumber
I2cstop
End Sub
'-=-=-=-=-=-=-=-=
Sub Fni2cwriteb(_slaveaddb As Byte , _addb As Byte , _numb As Byte)
I2cstart
I2cwbyte _slaveaddb
I2cwbyte _addb
I2cwbyte _numb
I2cstop
End Sub
'=-=-=-=-=-=-=-=-=-=-=-
Sub Pulse_bit(bit1 As Bit)
Din = Bit1
Clock = 1
Clock = 0
Din = 0
End Sub
'=-=-==-==-=-=-=-=-=-=-=-=
Sub Pulse_word(w1 As Word)
Cs = 0
Dim _i As Byte , _k As Bit
For _i = 1 To 16
J = W1 And &B1000000000000000
If J = &B1000000000000000 Then : _k = 1 : Else : _k = 0 : End If
Call Pulse_bit(_k)
Shift W1 , Left , 1
Next _i
Cs = 1
End Sub
'-=-=-=-=-==-=-=-=-=-=-=-=-=-==-=-=--=-=-=--==
Sub Disp_digit(d1 As Byte , Num As Byte)
W1 = D1 * 256
W1 = W1 + Num
Call Pulse_word(w1)
End Sub
'=-=-=-=-=-=-=-==-=-=-=-
Sub Disp_blank()
Dim _j As Byte
For _j = 1 To Maxdigits
Call Disp_digit(_j , 15)
Next _j
End Sub
' int subroutine -----------------
Timer_0_overflow_int:
Incr Clock_word
If Clock_word > 2000 Then
Clock_word = 0
Sec_flag = 1
Incr Sec_count
Incr Buzzer_count
End If
Return
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-==-
Read_alarm:
' Read alarm Data
Address = Alarm_sec_addmap
I2cstart
I2cwbyte Ds1307w
I2cwbyte Address
I2cstop
I2cstart
I2cwbyte Ds1307r
' Slave address (read)
I2crbyte Alarm_reg_sec , Ack
I2crbyte Alarm_reg_min , Ack
I2crbyte Alarm_reg_hour , Ack
I2crbyte Alarm_active_byte , Nack
I2cstop
' Generate Stop
' check for am/pm
'Alarm_active = 1
If Alarm_active_byte = 1 Then
Alarm_active = 1
Else
Alarm_active = 0
End If
If Alarm_reg_hour.5 = 1 Then
Alarm_pm_bit = 1
Else
Alarm_pm_bit = 0
End If
Alarm_reg_hour = Alarm_reg_hour And &B00011111
' remove 12/24 set and am/pm bits
' set numeric variables
Alarm_num_hour = Makedec(alarm_reg_hour)
Alarm_num_min = Makedec(alarm_reg_min)
Alarm_num_sec = Makedec(alarm_reg_sec)
Return
'-=-=-=-=-=-=-=-=-=-=-=-=-=--
Snooze5:
'increment alarm time by (snooze_mins) minutes
Gosub Read_alarm
Alarm_num_min = Makedec(alarm_reg_min)
Alarm_num_min = Alarm_num_min + Snooze_mins
If Alarm_num_min > 59 Then
Diff = Alarm_num_min - 60
Alarm_num_min = Diff
Alarm_reg_min = Makebcd(alarm_num_min)
' inc hrs
Incr Alarm_num_hour
If Alarm_num_hour > 12 Then
Alarm_num_hour = 1
End If
If Alarm_num_hour = 12 Then
Alarm_pm_bit = Alarm_pm_bit Xor 1
End If
End If
Alarm_reg_hour = Makebcd(alarm_num_hour)
Alarm_reg_hour.6 = 1
' Set 12 Hr Mode
If Alarm_pm_bit = 1 Then
Alarm_reg_hour.5 = 1
' pm
Else
Alarm_reg_hour.5 = 0
' am
End If
Call Fni2cwriteb(ds1307w , Alarm_hour_addmap , Alarm_reg_hour)
Call Fni2cwrite(ds1307w , Alarm_min_addmap , Alarm_num_min)
Gosub Read_alarm
Return
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Rem The Interrupt Handler For The Int0 Interrupt
Int0_int:
Alarm_toggle = Alarm_toggle Xor 1
' p3.2
Return
End
' end of program 3742 bytes long