Alarm Clock Assembly Code
Alarm Clock Assembly Code
;
;
;
;
;
;
;
;
;
;
;
;
To Do:
Write alarm sound
;----------------------------------------------------------------------------;----------------------------------------------------------------------------; EQUATES
;----------------------------------------------------------------------------$include (c8051f000.inc)
D0
D1
D2
D3
D4
D5
D6
D7
MOM3
MOM2
MOM1
MOM0
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
EQU
EQU
EQU
EQU
P1.7
P1.6
P1.5
P1.4
LAT3
LAT2
LAT1
LAT0
EQU
EQU
EQU
EQU
P1.3
P1.2
P1.1
P1.0
RS
RW
EN
EQU
EQU
EQU
P3.0
P3.1
P3.2
;-----------------------------------------------------------------------------
; VARIABLES
;-----------------------------------------------------------------------------
org 000Bh
ljmp Timer0_Int
org 001Bh
ljmp Timer1_Int
org 002Bh
ljmp Timer2_Int
org 0073h
ljmp Timer3_Int
;----------------------------------------------------------------------------; CODE SEGMENT
;----------------------------------------------------------------------------Code_Seg segment CODE
rseg Code_Seg
; Switch to this code segment.
using 0
; Specify register bank for the following
; program code.
Main:
;-----------------------------------------------------------------------------------------;Cyrstal initialization
;-----------------------------------------------------------------------------------------;XOSCMD 110
;XFCN 101
mov OSCXCN, #65h
;11100101
mov OSCICN, #18h
;00011000
;MOV TH0,#0FFh
;MOV TL0,#0F1h
;SETB TR0
;SETB TR1
;High byte of
;Low byte of
;starts timer0
;starts timer1
;-----------------------------------------------------------------------------------------;
Headphone Initialization
;-----------------------------------------------------------------------------------------mov REF0CN, #03h
mov DAC0CN, #084h
mov DAC0H, #016h
mov DAC1CN, #084h
mov DAC1H,#016h
;-----------------------------------------------------------------------------------------;
Start of Prgram
;-----------------------------------------------------------------------------------------LCALL init_lcd
Clock:
jb
jb
jb
jb
LAT3,
LAT1,
LAT2,
MOM0,
SetAlarm
SetClock
SetTimerL
TimerModeL
LCALL RefreshClock
jmp Clock
TimerModeL:
ljmp TimerMode
SetTimerL:
ljmp SetTimer
SetAlarm:
;mov TMR3CN, #004h
mov 12h, #03h
;starts timer 3
;sets display set byte
jb MOM3, AddHourA
jb MOM2, AddMinA
mov 0Ah, R3
mov 0Bh, R4
LCALL Refresh_Set
AddMinA:
jb MOM2, AddMinA
mov Acc, #1h
add A, R3
mov R3,
Acc
mov Acc, #3Ch
subb A, R3
jz WrapMinA
jmp SetAlarm
WrapMinA:
mov R3, #00h
jmp SetAlarm
AddHourA:
jb MOM3, AddHourA
mov Acc, #1h
add A, R4
mov R4,
Acc
mov Acc, #17h
subb A, R4
jz WrapHourA
jmp SetAlarm
WrapHourA:
mov R4, #00h
jmp SetAlarm
GoClockL:
ljmp GoClock
;end set alarm
SetClock:
;mov TMR3CN, #004h
mov 12h, #01h
;starts timer 3
;sets display set byte
jb MOM2, AddMinC
jb MOM3, AddHourC
mov 0Ah, R1
mov 0Bh, R2
LCALL Refresh_Set
WrapMinC:
mov R1, #00h
jmp SetClock
AddHourC:
jb MOM3, AddHourC
mov Acc, #1h
add A, R2
mov R2,
Acc
WrapHourC:
mov R2, #00h
jmp SetClock
;end set Clock
SetTimer:
;mov TMR3CN, #004h
mov 12h, #02h
;starts timer 3
;sets display set byte
jb MOM2, AddMinT
jb MOM3, AddHourT
mov 0Ah,
mov 0Bh,
R5
R6
LCALL Refresh_Set
mov 21h,
mov 22h,
R5
R6
WrapHourT:
mov R6, #00h
jmp SetTimer
;end set timer
GoClock:
;mov TMR3CN, #000h
mov 10h, #0FFh
mov 11h, #0FFh
ljmp Clock
TimerMode:
jb MOM0, TimerMode
LCALL Refresh_Display
;stops timer 3
;writes FFh to old display bits so display will refresh
;as soon as you go into set mode
TimerModeLoop:
;so the wrong jb MOM0 won't get selected
jb MOM1, StartStopL
jb MOM2, ResetTimerL
jb MOM0, ChronoModeLR
jb LAT1, ClockLL
jb LAT2, ClockLL
jb LAT3, ClockLL
;move timer memory 20h->22h to display*******
;comapre old instant values (23h->25h) with new to see if you
update display
mov
A, 23h
;compares the seconds
cjne A, 20h, UpdateTimer
mov
A, 24h
cjne A, 21h, UpdateTimer ;compares the minutes
mov
A, 25h
cjne A, 22h, UpdateTimer ;copmares the hours
jmp
TimerModeLoop
StartStopL:
ljmp StartSTop
ClockLL:
jb MOM0, $
mov 23h, #0FFh
ljmp Clock
ResetTimerL:
ljmp ResetTimer
ChronoModeLR:
jb MOM0, $
mov 23h, #0FFh
jmp ChronoMode
UpdateTimer:
LCALL Clear_LCD
LCALL Cursor_Home
mov 23h, 20h
mov 24h, 21h
mov 25h, 22h
;hours
;colon
;minutes
;colon
;seconds
;moves to second half of display
ResetTimer:
jb MOM2, $
clr TR1
clr 40h
TimerModeLoopL:
ljmp TimerModeLoop
ChronoMode:
jb
jb
jb
jb
jb
jb
MOM1,
MOM2,
MOM0,
LAT1,
LAT2,
LAT3,
StartStopC
ResetChronoL
ClockL
ClockL
ClockL
ClockL
;13h -> 15h Current Chrono Values
mov
A, 13h
cjne A, 26h, RefreshChrono
jmp ChronoMode
ResetChronoL:
ljmp ResetChrono
ClockL:
jb MOM0, ClockL
mov 26h, #0FFh
ljmp Clock
RefreshChrono:
;LCALL Clear_LCD
LCALL Cursor_Home
mov A, #':'
LCALL Write_Text
;colon
mov A, #':'
LCALL Write_Text
;colon
SETB EN
CLR RS
MOV P0,#0C0h
LCALL WAIT_LCD
CLR EN
jmp ChronoMode
StopC:
clr 43h
mov TMR3CN, #00h
;stops timer 3
jmp ChronoMode
ResetChrono:
jb MOM2, $
;stops timer 3
;changes the startstop bit
jmp ChronoMode
jmp ChronoMode
RefreshClock:
mov
A, R7
cjne A, 0Fh, Refresh
jmp ExitRC
Refresh:
mov 0Fh, R7
LCALL Clear_LCD
LCALL Cursor_Home
;hours
mov 0h, R2
LCALL Refresh_Display
mov A, #':'
LCALL Write_Text
;colon
;minutes
mov 0h, R1
LCALL Refresh_Display
mov A, #':'
;colon
LCALL Write_Text
;seconds
mov 0h, R7
LCALL Refresh_Display
ExitRC:
RET
Refresh_Set:
mov
A, 10h
cjne A, 0Ah, ContinueUpdate
mov
A, 11h
cjne A, 0Bh, ContinueUpdate
jmp
ExitRS
ContinueUpdate:
mov
10h, 0Ah
mov
11h, 0Bh
LCALL Clear_LCD
LCALL Cursor_Home
mov 0h, 0Bh
LCALL Refresh_Display
mov A, #':'
LCALL Write_Text
;hours
;colon
;write the acc to display
;minutes
mov A, #'t'
LCALL Write_Text
mov A, 12h
dec A
jz Display_Clock
;subb A, #01h
dec A
jz Display_Timer
;subb A, #01h
dec A
jz Display_Alarm
Display_Alarm:
mov A, #' '
LCALL Write_Text
mov A, #'A'
LCALL Write_Text
mov A, #'l'
LCALL Write_Text
mov A, #'a'
LCALL Write_Text
mov A, #'r'
LCALL Write_Text
mov A, #'m'
LCALL Write_Text
jmp ExitRS
Display_Timer:
mov A, #' '
LCALL Write_Text
mov A, #'T'
LCALL Write_Text
mov A, #'i'
LCALL Write_Text
mov A, #'m'
LCALL Write_Text
mov A, #'e'
LCALL Write_Text
mov A, #'r'
LCALL Write_Text
jmp ExitRS
Display_Clock:
mov A, #' '
LCALL Write_Text
mov A, #'C'
LCALL Write_Text
mov A, #'l'
LCALL Write_Text
mov A, #'o'
LCALL Write_Text
mov A, #'c'
LCALL Write_Text
mov A, #'k'
LCALL Write_Text
jmp ExitRS
ExitRS:
RET
;-----------------------------------------------------;
Interupts Code
;-----------------------------------------------------Timer0_Int:
push Acc
push B
push PSW
push 00h
;Alarm Timer
MOV TH0,#0E7h
MOV TL0,#000h
jnb
LAT0, AlarmOff
Alarming:
djnz 2Bh, Flash
cpl
45h
Flash:
jb 45h, Exit0
jb 46h, TurnOn
;ocilates the sound
;Turn Off
cpl 46h
;cpl P0.0
mov DAC0L, #00h ; DAC0 Low Byte Register
mov DAC0H, #00h ; DAC0 High Byte Register
mov DAC1L, #00h ; DAC0 Low Byte Register
mov DAC1H, #00h ; DAC0 High Byte Register
jmp Exit0
TurnOn:
cpl 46h
mov DAC0L, #00h ; DAC0 Low Byte Register
mov DAC0H, #016h; DAC0 High Byte Register
mov DAC1L, #00h ; DAC0 Low Byte Register
mov DAC1H, #016h; DAC0 High Byte Register
jmp Exit0
AlarmOff:
clr TR0
clr 42h
clr 44h
jmp Exit0
Exit0:
pop
pop
pop
pop
RETI
00h
PSW
B
Acc
Timer1_Int:
push Acc
push B
push PSW
push 00h
djnz 0Ch, Exit1
mov
0Ch, #20
mov
Acc, 22h
jnz
Skip
mov
Acc, 21h
jnz
Skip
mov
Acc, 20h
jz
TimerAlarm
Skip:
mov
Acc, 20h
it is
jz
ZeroSeconds
djnz 20h, Exit1
ZeroSeconds:
mov
Acc, 21h
jz
CheckHour
dec
21h
mov
20h, #59
jmp
Exit1
CheckHour:
mov
Acc, 22h
jz
Exit1
dec
22h
mov
21h, #59
mov
20h, #59
jmp
Exit1
TimerAlarm:
CLR
TR1
setb TR0
mov
0Eh, #80h
setb 42h
jmp
Exit1
;stops timer
;starts alarm timer
;sets alarm time (time unknown)****************
;sets timer alarm bit
Exit1:
MOV TH1,#076
MOV TL1,#01
pop
00h
pop
PSW
pop
B
pop
Acc
RETI
Timer2_Int:
mov T2CON, #004h
push Acc
push B
push PSW
push 00h
djnz 08h,
Exit2
mov
08h,
#20
mov
Acc, #01h
add
A, R7
mov
R7,
Acc
mov
Acc, #60
subb A, R7
jz
IncMin
jmp CheckAlarm
IncMin:
mov R7,
#0h
mov Acc, #1h
add A, R1
mov R1,
Acc
mov Acc, #60
subb A, R1
jz IncHour
jmp CheckAlarm
IncHour:
mov R1,
#00h
mov Acc, #1h
add A, R2
mov R2,
Acc
mov Acc, #24
subb A, R2
jz ClearHour
;Clock Timer
;resets overflow bit
jmp CheckAlarm
ClearHour:
mov R2, #00h
jmp CheckAlarm
CheckAlarm:
jnb
LAT0,
Exit2
jb
42h,
Exit2
mov
A, R1
cjne A, 03h, Exit2
mov
A, R2
cjne A, 04h, Exit2
setb TR0
mov
0Eh, #80h
setb 44h
jmp
Exit2
Exit2:
pop
pop
pop
pop
RETI
00h
PSW
B
Acc
Timer3_Int:
anl
push
push
push
push
TMR3CN, #04h
Acc
B
PSW
00h
;chrono timer
;resets overflow bit
jmp Exit3
IncMinC:
mov 13h,
#0h
mov Acc,
#1h
add A,
14h
mov 14h,
Acc
mov Acc,
#60
subb A, 14h
jz IncHourC
jmp Exit3
IncHourC:
mov 14h,
#00h
mov Acc,
#1h
add A,
15h
mov 15h,
Acc
mov Acc,
#99
subb A, 15h
jz ClearHourC
jmp Exit3
ClearHourC:
mov 15h, #00h
jmp Exit3
Exit3:
pop
00h
pop
PSW
pop
B
pop
Acc
RETI
;-----------------------------------------------------;
LCD CODE
;-----------------------------------------------------Refresh_Display:
;mov 0h, 0Bh
push 0h
;saves 0h for the ones position
mov A, R0
mov B, #10
div AB
;acc will now store the "tens" position of the number
add A, #16h
;maps "0" to mem address 16h and "9" to mem address 1Fh
mov R0, Acc
;saves value in R0
mov A, @R0
LCALL Write_Text
;mov
pop
mov
mov
div
mov
add
mov
0h, 0Bh
0h
A, R0
B, #10
AB
A, B
A, #16h
R0, Acc
mov A, @R0
LCALL Write_Text
;indirect adresses the ones value (for the display) to the acc
RET
WRITE_TEXT:
SETB EN
SETB RS
clr RW
MOV P0,
A
LCALL WAIT_LCD
CLR EN
RET
init_lcd:
SETB EN
CLR RS
clr RW
MOV P0,
#38h
LCALL WAIT_LCD
CLR
EN
LCALL WAIT_LCD
SETB EN
CLR RS
MOV P0,
#0Eh
LCALL WAIT_LCD
CLR EN
LCALL WAIT_LCD
SETB EN
CLR RS
MOV P0,
#06h
LCALL WAIT_LCD
CLR EN
LCALL WAIT_LCD
LCALL CLEAR_LCD
RET
CLEAR_LCD:
SETB EN
CLR RS
clr RW
MOV P0,#01h
CLR EN
LCALL WAIT_LCD
RET
CURSOR_HOME:
SETB EN
CLR RS
clr RW
MOV P0,#02h
CLR EN
LCALL WAIT_LCD
RET
WAIT_LCD:
;SETB EN
;CLR RS
;SETB RW
;MOV P0,
;MOV A,
;CLR EN
#07Fh
P0
;NL ACC,#40H
;JZ WAIT_LCD
;CLR RW
mov
djnz
mov
djnz
mov
djnz
mov
djnz
mov
djnz
mov
djnz
mov
djnz
mov
djnz
RET
END
R0, #00h
R0, $
R0, #00h
R0, $
R0, #00h
R0, $
R0, #00h
R0, $
R0, #00h
R0, $
R0, #00h
R0, $
R0, #00h
R0, $
R0, #00h
R0, $