Car Peripheral Simulation
Objective:
Write an assembly program
to simulate a Car Peripheral with V6
Engine.(Engine and Transmission).
Peripheral Simulations:
1. Stepper-Motor: Output of
transmission. Clockwise for forward,
Counter-Clockwise for reverse.
2.
DC-Motor:
Engine.
3.
Keypad: Select
different options and provide functionality for:
a)
Set the time:
The user should be able to set the time (hh:mm:ss Day).
b)
Enter the
password for starting
c)
Be able to
change password
d)
Select to
repair engine through the menu options
4.
Potentiometer:
Controls engine rpm(rotation per minute).
5.
LCD:
a) Menu
b)
Display: Fuel
Level, RPMs
c)
View time and
mileage
6.
Push Button:
Start engine.
7.
Switches: Shift
gears 1, 2, 3, N and reverse. Turn power on to engine. Add Fuel.
8.
Speaker (Port
T): music (3 different songs >5seconds each)
9.
LEDs: 4 LEDs
will simulate the sparkplug of a 6 cylinder engine, 1 LED will show power to
engine.
10. IRQ: Throws an engine rod and a
knocking sound must be sent to speaker.
If engine does not shut off within 6 seconds then the engine breaks and
automatically shuts off.
11. RTI control timing.
Requirements:
1 The engine (DC motor) used to simulate
engine rpms.
· In order to start the car the
transmission must be in neutral.
· The DC motor will increase in
Revolutions Per Minute when the potentiometer resistance increases.
· If the IRQ is pressed then the engine
throws a rod and a knocking sound must be sent to speaker. If engine does not shut off within 5 seconds
then the engine breaks and automatically shuts off.
· If this happens threw the menu, using
the hex keypad, select to perform a repair before the engine can restart.
2.
The
transmission (Stepper motor) will turn clockwise for forward or
counterclockwise for reverse. In order
for the car to move it must start in first gear or reverse. If in forward direction as the gears increase
the stepper motor rotation speed will increase.
Also, you cannot skip a gear must start at 1 then 2 then 3. If a gear is skipped both the DC motor and
the Stepper motor stop. At this time the
engine must restart. To switch
directions the car must return to neutral and the stepper motor must not be
rotating.
3.
No delay loops
are allowed, you must utilize the Real Time Interrupt. DELAY LOOPS ARE ONLY ALLOWED OR HEX KEYPAD
DE-BOUNCE.
FINAL
REPORT:
The Goal of this project is to write
an assembly program for this HCS12 microcontroller to simulate a car with V6
engine (Engine and Transmission), by doing this project we can learn many
things and improve our assembly language skills, for instance we learned to use
Real Time Interupt, switch debouncing, LEDs, LCD, hex keypad, switches, DC
motor, stepper motor, amplifier, speaker, and many more thing not listed here.
This final project pretty much use all of the knowledge we learned from lab 1
to lab 7.
We try to
follow the peripheral simulations in the final project guide but we have to
modify some of it because the wording is a little bit confusing and some of the
stuffs don’t really make sense. So this is out peripheral simulations after we
modify the one given to us.
1.
Stepper-Motor:
Output of
transmission. Clockwise for forward,
Counter-Clockwise for reverse.
2.
DC-Motor:
Engine; it showed the speed of the car.
3.
Keypad:
a) Set the time: The user should be able
to set the time (hh:mm:ss Day).
b) Enter the password for starting
c) change password
d) Select song
4.
Potentiometer:
Controls engine rpm(rotation per minute).
5.
LCD:
a) Menu
b) Display: Fuel Level, RPMs, time,
mileage
6.
Push Button:
Start engine.
7.
Switches: Shift
gears D,R,N . Turn power on to engine. Add Fuel.
8.
Speaker (Port
T):
music (3
different songs >5seconds each)
9.
LEDs: 4 LEDs
will simulate the sparkplug of a 6 cylinder engine, 1 LED will show power to
engine.
10. IRQ: Throws an engine rod and a
knocking sound must be sent to speaker.
If engine does not shut off within 6 seconds then the engine breaks and
automatically shuts off.
11. RTI control timing.
Below is the
detail explaining what each switch does, and what each LEDs simulate.
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
|
|
|
|
|
|
|
Extra LED: this one do nothing
|
These four LEDs will simulate the sparkplug of a 6
cylinder engine. So when the car start it will go on then go off a few moment
later.
|
This is the left turn signal.
|
This LED will show power to engine. So as long as the
car is running this LED will be on.
|
This is the right turn signal.
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
|
|
|
|
|
|
|
Turn on left turn signal
|
Turn on hazard signal
|
Turn speaker on
|
Turn stepper motor
clock wise
|
Turn engine on
|
Turn stepper motor
Counter clock wise
|
Add fuel
|
Turn on right turn signal
|
1. Most of the time the switch 5 and 3
will be one, because most of the time car engine should be running and music
should be on.
2. Switches 4 and 2 can’t be on at the
same time. There are only one gear at a time: D, R, N.
3. Switched 7 and 0 can’t be on at the
same time because left turn and right turn switches can’t be on at the same
time.
4. When shifting gear you must turn the
current gear off first – therefore go to neutral first, then you turn the new
gear on.
5. Also, you must be in neutral when
adding fuel or else you can’t add fuel. So the switched 4 and 2 must be off if switch
1 is on.
The main.asm file is the main file
it control the program, and this is where most of the variable, constant is
declare and initialize.
Basically, this is what the main.asm
file does, it first initialize all the variable, and then it initialize all the
ports that we will be using, then it initialize the interrupts that we will be
using then it go start by asking user for password then tell user to set time,
set password, select song. Then it enable the RTI and go into a loop displaying
the stuff to the LCD, therefore it refresh the LCD every time in loop. So it
just keep on looping. In that same loop
there is also subroutine to check switches, increment time , check potential meter
every time it go through the loop. So that is all the main.asm does. Other
files are mostly just place to put the subroutine that the main.asm will be
calling.
The next important file is the
RTI.asm that is where the real time interrupt is. The real time interrupt
control the music, the stepper motor, the DC motor, and it increment the
seconds. Below is the flow of the RTI.
1.
Check if fuel
is zero or not if it is then just increment seconds and exit the RTI.
2.
If fuel not
zero, then the next step is check what is the gear variable, then set the
sequence to send to the stepper motor according to the gear.
3.
Check the speed
variable for the speed. And send the high or low voltage to the DC motor
accordingly, also the speed is used to control how fast the distance traveled
increased.
4.
Increment
second
5.
Exit RTI
So that is what
happened during each RTI interrupt. The rest of the files are C code that was
given to us to control the LCD stuff and to output the potential meter, we also
have the C code controlling the sound for the speaker. And there is other
parameter file that we edit too.
The extra
features we added to this project are below:
1.
Welcome
displayed on the LCD screen
2.
The Right,
Left, Hazard signal
1.
First when you
open everything, you will see a welcome screen saying something like this
“WELCOME TO MY CAR”
2.
After that just
put in the password, the password should be 1234
3.
Setup a new
password by pressing four number on the hex keypad
4.
Choose song:
press 1 or 2 or 3
5.
Then you should
arrive at a normal display screen on that screen you will see these acronym:
D = distance
traveled
RPM = rotation
per minute
GAS = Gasoline
level
DD:HH:MM:SS =
it displayed the time and date
IRQ button:
Pressing the IRQ
button will break your engine, so you must press “5” to repair your engine.
NO GAS:
If you run out
of GAS then turn on the bit1 of dip switch to refill after finish refiling then
turn it off.
***NOTE: no
gear can be on when refiling the gas, therefore, the switch 4 and 2 must be
off.
Other
information about LEDS, and switches are already given in the pages before
this.
These are all
of the important codes in the important files.
Not all files
are included here, for instance code from these file are not included here:
Derivative.h,
derivative.inc, main_asm.h, burner.bbl
Those are just
some of the examples of the files that did not have in this final project
reports. There are many other unimportant files that were also not included
here.
Below you will
find all of the important codes that we wrote.
******Note that
with these code alone the program will not run properly.
INCLUDE 'derivative.inc'
XDEF Entry, _Startup, variable , array,array2 ,port_p ,port_t,DC_dirc
XDEF second, min ,hour,display_string,disp ,potvalue
,RTIFLAG,step_point, tonevalue
Xdef
port_u,newpassword,password,row,table,keyInput,fuel,count,position1
xDEF VAR,fuel_latch,LED_Blink,depth,
Count1, Count2,position,IRD_LED,pointer
xdef speed,IRQcounter,target_depth,array,noPress,LEDFlag,Port_S,change
XDEF
sound1,sound2,menucount,count1,noPress,padScan ,port_TDDR ,day,divedecide
xdef gear,speedvar, currentspeed,
distancetraveled, distancetraveledvar
XDEF Wipers, WiperCount, WiperDelay,
WiperOnDelay, second2
XDEF WiperOffDelay, Engine, HornPB,
HornCount, HornFreq
XDEF LEDS, LeftTurnSwitch, RightTurnSwitch,
HIBeamSwitch, LowBeamSwitch, OnOffSignal
XREF __SEG_END_SSTACK, init_LCD,
read_pot, display_string, pot_value ,NOMOVE ,displaytime
XREF LCD_normal,loadspeed
,call_speaker,decide_speed,stepMotor,callmenu
XREF speed_reverse,
speed_forward ,LCD_start,fuel_latch ,change_password,
enter_password,setmenu
XREF xv,xv2,settime, SendsChr,keypadcheck2,lastone,
LCDwelcome,debounceswitch,string1
XREF ControlWiper, checkPAD2,
checkPAD
my_variable:
SECTION
gear: ds.b 1
distancetraveled:
ds.b 1
distancetraveledvar: ds.b 1
disp: ds.b 33
LEDFlag: ds.b 1 ; flag for RTI controlled LEDs
;time
hour ds.b 1
min ds.b
1
second ds.b 1
day ds.b 1
second2
ds.b 1
variable: ds.b
1
potvalue ds.b 1
;password
newpassword
ds.w 4;use to replace password
password ds.w 4 ;4 digit password
position ds.b
1
position1 ds.w
1
;*********keypad
keyInput ds.w 1
;*************fuel
fuel ds.b
1 ;fuel level
;***********speed
Count1 ds.b 1
Count2 ds.b 1
;*****************notsure
count ds.b 1
count1
ds.b 1
Counter ds.b
1
VAR ds.b
1
menucount
ds.b 1
IRQcounter ds.b
1
IRD_LED ds.b 1
;***********LED
LED_Blink ds.b
1
depth ds.b 1
speed ds.b 1
;*******stepmotor
target_depth
ds.w 1
change ds.w 1
pointer ds.w 1
divedecide ds.b
1
step_point ds.b
1
DC_dirc ds.b 1
currentspeed:
ds.b 1 ;speed value that the dc motor
is running right now
speedvar: ds.b 1
;this variable is used to control the speed
tonevalue: ds.b 1
WiperOnDelay: ds.b
1
WiperOffDelay: ds.b
1
WiperDelay: ds.b 1
WiperCount: ds.b 1
HornCount: ds.w 1
HornFreq: ds.w 1
OnOffSignal: ds.b
1
Engine: ds.b 1
LeftTurnSwitch: ds.b 1
RightTurnSwitch: ds.b 1
HIBeamSwitch: ds.b 1
LowBeamSwitch: ds.b 1
HornPB: ds.b 1
AmPmFlag: ds.b 1
Wipers: ds.b 1
songnumber ds.b 1
my_constant:
section
array: dc.b
$0A,$12,$14,$0C,$FF
array2: dc.b
$0C,$14,$12,$0A,$FF
port_t: equ
$240 ;motor: ON(set bit3) OFF(clear bit3)
port_TDDR equ $242
Port_S: equ $248 ;LEDs
to display SECOND
port_sddr equ $24A
port_p: equ
$258
port_pddr equ
$25A ;motorddr
port_u equ $268 ;port U
port_uDDR equ $26A ;port direction register
port_uPSR equ $26D ;portport U polarity select register
port_uCNR equ $26C ;port control register
RTIFLAG: equ $0037;RTI
flag
RTIENA: equ $0038 ;RTI enable
RTI_CTL: equ $003B ;RTI time control
table: dc.b
$EB, $77, $7B, $7D, $B7, $BB, $BD, $D7
dc.b $DB, $DD, $E7, $ED, $7E, $BE, $DE,
$EE, $00
row: dc.b $70,
$B0, $D0, $E0, $CC
sound1: dc.b
$11,$22,$33,$44,$55
sound2: dc.b
$AA,$BB,$CC,$DD,$EE
padScan dc.b $70,$b0,$d0,$e0
noPress dc.b
$7f,$bf,$df,$ef
LEDS: equ $248
song1: dc.b 1,2,3,4,5,1,2,3,4,5,1,2,3,4,5
song2:
dc.b 5,4,3,2,1,5,4,3,2,1,5,4,3,2,1
song3:
dc.b 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1
; code section
MyCode: SECTION
Entry:
_Startup:
lds
#__SEG_END_SSTACK
jsr init_LCD
;INITIALIZATION
movb #0, speedvar
movb #0, currentspeed
movb #0, distancetraveled
movb #77, gear
movb #0,second2
movb #1, songnumber
ldx
#0
stx
xv
ldaa
#4
staa
xv2
movb
$0,LED_Blink ;LED light all off
;Time variable
LDAA #$0
STAA count
STAA second
STAA min
STAA hour
;keypad
ldaa #$F0
staa port_uDDR
staa port_uPSR
;Enable pull
up resister of port_u
ldaa #$0F
staa $26B
staa port_uCNR
;DCmotor
movb #$7f,$24a
bset
port_pddr,#%11110
;;;;;;;;;;Stepmotor;;;;;;;;;;;;;;;
ldaa
#%11110 ;set 1
bit(11) to port_p enable step motor
staa
port_pddr
;;;;;;;;;;PWM;;;;;;;;;;;
bset port_TDDR,#101000
;;;;;;;;;;RTI;;;;;;;;
bset RTIENA,#%10000000 ;enable RTI
bset RTIFLAG,#%10000000 ;RTI Flag
;;;;;;;;in value
movb #$0,count
movb #$0,Counter
movb #10,fuel
movb #$0,menucount
movb #0,Count1
movb #0,Count2
movb #0,speed
movb #0,IRQcounter
movb #0,LEDFlag
movb #0,day
jsr LCDwelcome
ldd #disp
jsr display_string
jsr debounceswitch
movb #0,IRD_LED
movw #0,pointer
movw #0, change
jsr debounceswitch
movw #1,password
movw #2,password+2
jsr debounceswitch
jsr debounceswitch
movw #3,password+4
movw #4,password+6
jsr debounceswitch
jsr debounceswitch
movw #0,target_depth
movw #0,newpassword
movw #0,newpassword+2
movw #0,newpassword+4
movw #0,newpassword+6
jsr debounceswitch
jsr debounceswitch
movb
#0,position
movw #0,depth
movw #0,change
jsr debounceswitch
jsr debounceswitch
movb #0,divedecide
movw #0,target_depth
movb #0,step_point
movb #0,DC_dirc
jsr debounceswitch
jsr debounceswitch
movb #0,keyInput
movw #55, HornFreq
movb #0, HornPB
movb #0, OnOffSignal
ldx
#0
movb #0, Engine
movb #0, LEDS
;INITIALIZATION END
ldaa
#1
staa
tonevalue
jsr LCD_start
ldd #disp
jsr display_string
;check the
password before showing the meanu
jsr
enter_password;check the passcode
bset LEDS, %01111000
jsr
change_password
bset LEDS, 000000
jsr settime
jsr string1
ldd #disp
jsr display_string
jsr checkPAD
ldaa keyInput+1
cmpa #1
beq choosesong1
cmpa #2
beq choosesong2
cmpa #3
beq choosesong3
choosesong1:
movb #1, songnumber
bra goafterchoosesong
choosesong2:
movb #2, songnumber
bra goafterchoosesong
choosesong3:
movb #3, songnumber
bra goafterchoosesong
goafterchoosesong:
jsr
LCD_normal
ldd #disp
movb
#$29, RTI_CTL
movb #$80, RTIENA
cli
ldy
#0
display:
ldaa tonevalue
psha
ldd #5
jsr SendsChr
pula
jsr timeinc
; !these are
ldaa
port_t ; !the
anda
#001000 ; !code
bne
nogear ; !to
; !read
; !value
; !from
ldaa
port_t ;
!port
anda
#000100 ; !and
bne
gear1 ; !check
; !which
ldaa
port_t ; !switch
anda
#000010 ; !is
bne
fuelup ; !on
; !
ldaa
port_t ; !
anda
#010000 ; !
bne
gear3 ; !
; !
; !
nogear: ; !then
movb
#77,gear ; !we
bra gothere ; !will
gear1: ; !set
movb
#1,gear ; !variable "gear"
bra gothere ; !according
fuelup: ; !to
movb
#50,fuel ; !the
jsr
LCD_normal
ldd #disp
bra gothere ; !switch
gear3: ; !
movb
#3,gear ; !
bra gothere ; !
gothere:
ldaa
port_t ; !the
anda
#000001 ; !code
bne
rightsignal ; !to
; !read
; !value
; !from
ldaa
port_t ; !port
anda
#%10000000 ; !and
bne
leftsignal ; !check
ldaa
port_t ; !
anda
#%01000000 ; !
bne
hazardsig
bra exitsignalcheck
rightsignal:
bset LEDS, 000001
bra
exitsignalcheck
leftsignal:
bset LEDS, 000100
bra
exitsignalcheck
hazardsig
bset LEDS, 000101
bra
exitsignalcheck
exitsignalcheck:
jsr read_pot
ldd #disp
jsr display_string
jsr decide_speed
movb LED_Blink, Port_S
jsr loadspeed
jsr displaytime
ldab
second2
cmpb
#1
beq
changenote
bra
skipchangenote
changenote:
ldab
songnumber
cmpb
#1
beq
playsong1
ldab
songnumber
cmpb
#2
beq
playsong2
ldab
songnumber
cmpb
#3
beq
playsong3
playsong1:
ldaa
song1,y
bra goafterplaysong
playsong2:
ldaa
song2,y
bra goafterplaysong
playsong3:
ldaa
song3,y
bra goafterplaysong
goafterplaysong:
staa
tonevalue
iny
cpy #10
bne skipytozero
ldy #0
skipytozero:
movb
#0,second2
skipchangenote:
jmp display
timeinc:
ldab
second
cmpb
#60
beq
incminute
bra
skipincminute
incminute:
inc
min
movb
#0,second
skipincminute:
ldab
min
cmpb
#60
beq
incrementhour
bra
skipinchour
incrementhour:
inc
hour
movb
#0,min
skipinchour:
ldab
hour
cmpb
#24
beq
incrementday
bra
skipincday
incrementday:
inc
day
movb
#0,hour
skipincday:
rts
XDEF WALL_CLOCK,xv,xv2
XREF
second, min ,hour, RTIFLAG ,Count1,Count2,day
,speed,change,updateTime,play,divedecide,step_point,target_depth,decide_speed
xref potvalue ,depth,LED_Blink,port_TDDR
,count,fuel,nofuel,timer_count ,IRD_LED ,port_p ,array,array2,pointer,port_t,loadspeed
xref pot_value, gear,speedvar, currentspeed,
distancetraveled , distancetraveledvar, PlayTone, SendsChr, tonevalue,
LCD_nofuel
xref disp, LEDS, second2
My_constant
section
cwise: dc.b
$0A,$12,$14,$0C
ccwise:
dc.b $0C,$14,$12,$0A
My_variable
section
xv: ds.w 1
xv2: ds.b 1
My_code: section
WALL_CLOCK:
bset LEDS, 000010
jsr
PlayTone
ldaa
fuel
cmpa
#0
beq exit1
;nofuel skip to end
bra skipexit1
exit1:
bclr LEDS, 000010
jsr LCD_nofuel
ldd #disp
ldaa
#000000
staa
$240
inc count ; CODE
ldaa count ; TO
cmpa
#100 ; !
;
!
bne here4 ; inc clock
inc second ;
ldaa #0 ;
staa count ;
here4:
movb #$80, RTIFLAG
rti
skipexit1:
ldx xv
ldab
gear ; check if no gear
cmpb
#77 ; !
beq nogear ;
!
ldab
gear ;
cmpb
#2 ; !
beq next ;
!
ldab
gear ;check if gear is
forward
cmpb
#1 ;if it is forward
then steppermotor go clockwise
beq
clockwise ;
ldab
gear ;check if
gear is backward
cmpb
#3 ;if it is
then stppermotor go counter clockwise
beq counterclock ;
counterclock:
ldaa ccwise,
x
bra next
clockwise:
ldaa cwise,
x
bra next
next:
staa
$258
inx
stx xv
dec xv2
bne exit2
movw #0, xv
ldaa #4
staa xv2
nogear:
ldaa speed ;this is the value read from the
pot meter
cmpa
#222
beq speediszero
cmpa currentspeed ;check if the value from pot is same as
speed value that the dc motor is running right now
beq keepcurrentspeed ;if it the same make no change to current
speed
staa currentspeed ; if it different then store new value
from pot to the current dc motor speed
bra here3
speediszero:
ldaa
#000000
staa
$240
bra here2
here3:
keepcurrentspeed: ; FROM
; HERE
ldaa
speedvar ; !
cmpa
#0 ; !
bne
notdoneyet ; !
ldaa
#001000 ; !
staa
$240 ; !
ldab
currentspeed ; !
stab
speedvar
inc
distancetraveledvar; !
ldaa distancetraveledvar
cmpa
#50
beq incdistraveled
bra skiptothere
incdistraveled:
inc distancetraveled
dec fuel
skiptothere:
bra
skipnotdoneyet ; TO
notdoneyet: ; HERE
ldaa
#000000 ; !
staa
$240 ; !
ldaa
speedvar ; !
deca ; IS
CODE TO CONTROL DC SPEED
staa
speedvar ; !
skipnotdoneyet: ; !
inc count ;
ldaa count
cmpa
#226
bne here2
inc second
inc second2
ldaa #0
staa count
here2:
exit2:
movb #$80, RTIFLAG
rti
XDEF Emergency_stop
XREF LEDS, display_string,checkPAD
XREF keyInput, string2, disp, LCD_normal
Emergency_stop:
ldaa
#000000
staa
$240
jsr string2
ldd #disp
jsr display_string
bclr LEDS, 000010
wrongbuttonpress:
jsr checkPAD
ldaa keyInput+1
cmpa #5
beq repaircar
bra wrongbuttonpress
repaircar:
ldaa
#001000
staa
$240
bset LEDS, 000010
jsr
LCD_normal
ldd #disp
jsr display_string
rti
xref
speed,potvalue
xdef decide_speed
decide_speed:
ldaa potvalue
cmpa #0
beq load_speed0
cmpa #2
blo load_speed1
cmpa #4
blo load_speed2
cmpa #7
blo
load_speed3
cmpa #10
blo
load_speed4
cmpa #13
blo
load_speed5
cmpa #17
blo
load_speed6
cmpa #20
beq
load_speed7
cmpa #24
blo
load_speed8
cmpa #28
blo
load_speed9
cmpa #33
blo
load_speed10
cmpa #45
blo
load_speed11
cmpa #60
blo
load_speed12
cmpa #65
blo
load_speed13
cmpa #70
blo
load_speed14
cmpa #75
blo
load_speed15
cmpa #80
blo
load_speed16
cmpa #85
blo
load_speed17
cmpa #90
blo
load_speed18
cmpa #95
blo
load_speed19
cmpa #101
blo
load_speed20
load_speed0:
movb #222,speed
rts
load_speed1:
movb #100,speed
rts
load_speed2:
movb #90,speed
rts
load_speed3:
movb #75,speed
rts
load_speed4:
movb #50,speed
rts
load_speed5:
movb #35,speed
rts
load_speed6:
movb #24,speed
rts
load_speed7:
movb #15,speed
rts
load_speed8:
movb #8,speed
rts
load_speed9:
movb #1,speed
rts
load_speed10:
movb #11,speed
rts
load_speed11:
movb #10,speed
rts
load_speed12:
movb #9,speed
rts
load_speed13:
movb #8,speed
rts
load_speed14:
movb #7,speed
rts
load_speed15:
movb #5,speed
rts
load_speed16:
movb #4,speed
rts
load_speed17:
movb #3,speed
rts
load_speed18:
movb #2,speed
rts
load_speed19:
movb #1,speed
rts
load_speed20:
movb #1,speed
rts
XDEF ControlWiper
XREF LEDS, LeftTurnSwitch,
RightTurnSwitch, HIBeamSwitch, LowBeamSwitch, OnOffSignal,port_t
myCode: Section
ControlWiper:
ldaa port_t ;
!the
anda #000001 ;
!code
bne rightsignal ;
!to
; !read
; !value
; !from
ldaa port_t ;
!port
anda #%10000000 ;
!and
bne leftsignal ;
!check for which signal should be
on
ldaa port_t ;
!
anda #%01000000 ;
!
bne hazardsig
bra exitsub
rightsignal:
bset LEDS, 000001
bra exitsub
leftsignal:
bset LEDS, %10000000
bra exitsub
hazardsig
bset LEDS, %10000001
bra exitsub
exitsub:
rts
XDEF checkPAD,checkPAD2
,delayG, debounceswitch
XREF port_u,
table,padScan ,keyInput,noPress
checkPAD:
pshx
check_restart:
ldx #0
checkNEXT:
cpx #4
beq check_restart ;keep checking until user press
ldaa padScan,x ;fed pad
staa port_u
jsr delayG
ldaa port_u ;get result
cmpa noPress,x ;if pad is press
bne keyPRESS ;is pressed
inx
bra checkNEXT;otherwise
go next row or row back
keyPRESS:
pulx
jsr keyValue
rts
checkPAD2:
pshx
checkNEXT2:
ldaa padScan,x ;fed pad
staa port_u
jsr delayG
ldaa port_u ;get result
cmpa noPress,x ;if pad is press
bne keyPRESS2 ;is pressed
inx
bra checkNEXT2;otherwise
go next row or row back
keyPRESS2:
pulx
jsr keyValue
rts
keyValue:
pshx
ldx
#0
nxt:
cpx
#16
beq
notFound
cmpa table,x
beq
valueFound
inx
bra
nxt
valueFound:
pshx
check_press_reset:
ldx #-1
check_press:
inx
cpx #4
beq
check_press_reset
ldaa port_u
;get result
cmpa noPress,x ;if
pad is press
bne check_press ;is pressed
pulx
stx
keyInput
pulx
rts
notFound:
pulx
rts
delayG:
pshx
ldx #400
delay:
dex
bne delay
pulx
rts
debounceswitch:
ldy
#$FFFF
here1253:
dey
bne
here1253
rts
xdef setmenu,callmenu
xref count1,menucount,disp ,settime, change_password
,display_string,port_t,enter_password
xref
string1,string2,string3,string4,readkeypad,enter_menu,stepMotor,read_value,LCD_start
,checkPAD,keyInput
callmenu:
brclr port_t,#000100,endmenu
jsr
LCD_start
ldd
#disp
jsr display_string
jsr
enter_password
jsr setmenu
endmenu:
rts
setmenu:
jsr enter_menu
ldd #disp
jsr display_string
reentermenu:
jsr checkPAD
ldaa keyInput+1
cmpa #1
beq menunumber
setenter:
cmpa #2
beq menuenter
cmpa #3
beq menureturn
bra reentermenu
menuenter:
ldab menucount
cmpb #1
bne menuenter2
jsr settime
movb #0,menucount
bra setmenu
menuenter2:
cmpb #2
bne menuenter3
jsr change_password
menuenter3:
cmpb #3
bne menuenter4
jsr read_value
menuenter4:
bra setmenu
menureturn:
rts
meuntime:
psha
jsr string1
ldd
#disp
jsr display_string
pula
bra reentermenu
menupass:
psha
jsr string2
ldd
#disp
jsr display_string
pula
bra reentermenu
menudepth:
psha
jsr string3
ldd
#disp
jsr display_string
pula
bra reentermenu
menuhorn:
psha
jsr string4
ldd
#disp
jsr display_string
movb #0,menucount
pula
bra
reentermenu
menunumber:
inc menucount
ldab menucount
cmpb #1
beq
meuntime
cmpb #2
beq
menupass
cmpb #3
beq
menudepth
cmpb #4
beq
menuhorn