;Program for Programmable Control Relay (ASM51 compiler)
;Designed and developed by Lim.laboratory
;Contact at lim.laboratory@yahoo.com,Thailand
$mod51
$list
        dseg at 30h
valuer0:  ds 1
valuet0:  ds 1
valuer1:  ds 1
valuet1:  ds 1
valuer2:  ds 1
valuet2:  ds 1
valuer3:  ds 1
valuet3:  ds 1
valuer4:  ds 1
valuet4:  ds 1
valuer5:  ds 1
valuet5:  ds 1
        cseg at 0000h
        jmp main1
        org 0100h
;main program.....................................................................
main1:  call init_serial
main:   call spaceline
	call showpcrdisplay
	mov r4,#3
	call timebase1
	call clrpcrdisplay
	call clrpcrdisplay
        call clrpcrdisplay
	call showmain
checkim:call cin
	cjne a,#'i',checkxm
	jmp internal
checkxm:cjne a,#'x',checkhm
	jmp external
checkhm:cjne a,#'h',checkim
	jmp help
;internal relay program...........................................................
rwt:      call spaceline  
	  call showinternal
	  call storerwt
checkrwt: call cin
	  cjne a,#'r',checkbrwt
          call showrunning
	  call showcomrwt2
          jmp runrwt
checkbrwt:cjne a,#'b',checkhrwt
	  jmp rs
checkhrwt:cjne a,#'h',checkrwt	
	  jmp help
storerwt:call shownewrwt
	 call showrelay0
	 call gvaluer0
	 call showtimer
	 call gvaluet0
	 call showrelay1
	 call gvaluer1
	 call showtimer
	 call gvaluet1
	 call showrelay2
	 call gvaluer2
	 call showtimer
	 call gvaluet2
	 call showrelay3
	 call gvaluer3
	 call showtimer
	 call gvaluet3
	 call showrelay4
	 call gvaluer4
	 call showtimer
	 call gvaluet4
	 call showrelay5
	 call gvaluer5
	 call showtimer
	 call gvaluet5
	 call showcomrwt1
	 ret
rs:      call spaceline 
	 call showinternal
	 call storers
checkrs: call cin
	 cjne a,#'r',checkars
         call showrunning
         jmp runrs
checkars:cjne a,#'a',checkhrs
	 call clrrelayi
	 jmp rwt
checkhrs:cjne a,#'h',checkrs
	 jmp help
storers:call shownewrs
	call showrelay0
	call gvaluer0
	call showrelay1
	call gvaluer1
	call showrelay2
	call gvaluer2
	call showrelay3
	call gvaluer3
	call showrelay4
	call gvaluer4
	call showrelay5
	call gvaluer5
	call showcomrs1
	ret
help:   call spaceline
	call showhelp
checkh: call cin
	cjne a,#'m',checkhi
	jmp main
checkhi:cjne a,#'i',checkhx
	jmp internal
checkhx:cjne a,#'x',checkh
	jmp external
runrwt:  mov r4,valuet0
	 cjne r4,#00,nextrun1
	 jmp chnext1
nextrun1:call checko0
	 call timebasei
chnext1: mov r4,valuet1
	 cjne r4,#00,nextrun2
	 jmp chnext2
nextrun2:call checko1
	 call timebasei
chnext2: mov r4,valuet2
	 cjne r4,#00,nextrun3
	 jmp chnext3
nextrun3:call checko2
	 call timebasei
chnext3: mov r4,valuet3
	 cjne r4,#00,nextrun4
	 jmp chnext4
nextrun4:call checko3
	 call timebasei
chnext4: mov r4,valuet4
	 cjne r4,#00,nextrun5
	 jmp chnext5
nextrun5:call checko4
	 call timebasei
chnext5: mov r4,valuet5
	 cjne r4,#00,nextrun6
	 jmp runrwt
nextrun6:call checko5
	 call timebasei
	 jmp runrwt
runrs:      call runningrs
checksrunrs:call cin
	    cjne a,#'s',checkhrunrs
	    jmp rs
checkhrunrs:cjne a,#'h',checksrunrs
	    jmp help
runningrs:call checko0
	  call checko1
	  call checko2
	  call checko3
	  call checko4
	  call checko5
	  call showcomrs2
	  ret
;check for run on-off internal relay............................................
checko0:mov a,valuer0
	cjne a,#0ah,checkf0
	clr p1.2
	ret
checkf0:cjne a,#0fh,checko0
	setb p1.2
	ret
checko1:mov a,valuer1
	cjne a,#0ah,checkf1
	clr p1.3
	ret
checkf1:cjne a,#0fh,checko1
	setb p1.3
	ret
checko2:mov a,valuer2
	cjne a,#0ah,checkf2
	clr p1.4
	ret
checkf2:cjne a,#0fh,checko2
	setb p1.4
	ret
checko3:mov a,valuer3
	cjne a,#0ah,checkf3
	clr p1.5
	ret
checkf3:cjne a,#0fh,checko3
	setb p1.5
	ret
checko4:mov a,valuer4
	cjne a,#0ah,checkf4
	clr p1.6
	ret
checkf4:cjne a,#0fh,checko4
	setb p1.6
	ret
checko5:mov a,valuer5
	cjne a,#0ah,checkf5
	clr p1.7
	ret
checkf5:cjne a,#0fh,checko5
	setb p1.7
	ret
;external relay program.........................................................
xrwt:      call spaceline  
	   call showexternal
	   call storerwt
checkxrwt: call cin
	   cjne a,#'r',checkbxrwt
           call showrunning
	   call showcomrwt2
           jmp runxrwt
checkbxrwt:cjne a,#'b',checkhxrwt
	   jmp xrs
checkhxrwt:cjne a,#'h',checkxrwt	
	   jmp help
xrs:      call spaceline 
	  call showexternal
	  call storers
checkxrs: call cin
          cjne a,#'r',checkaxrs
          call showrunning
          jmp runxrs
checkaxrs:cjne a,#'a',checkhxrs
	  call clrrelayx
	  jmp xrwt
checkhxrs:cjne a,#'h',checkxrs
	  jmp help
runxrwt:  mov r4,valuet0
	  cjne r4,#00,nextrunx1
	  jmp chnextx1
nextrunx1:call checkox0
	  call timebasex
chnextx1: mov r4,valuet1
	  cjne r4,#00,nextrunx2
	  jmp chnextx2
nextrunx2:call checkox1
	  call timebasex
chnextx2: mov r4,valuet2
	  cjne r4,#00,nextrunx3
	  jmp chnextx3
nextrunx3:call checkox2
	  call timebasex
chnextx3: mov r4,valuet3
	  cjne r4,#00,nextrunx4
	  jmp chnextx4
nextrunx4:call checkox3
	  call timebasex
chnextx4: mov r4,valuet4
	  cjne r4,#00,nextrunx5
	  jmp chnextx5
nextrunx5:call checkox4
	  call timebasex
chnextx5: mov r4,valuet5
	  cjne r4,#00,nextrunx6
	  jmp runxrwt
nextrunx6:call checkox5
	  call timebasex
	  jmp runxrwt
runxrs:      call runningxrs
checksrunxrs:call cin
	     cjne a,#'s',checkhrunxrs
	     jmp xrs
checkhrunxrs:cjne a,#'h',checksrunxrs
	     jmp help
runningxrs:call checkox0
	   call checkox1
	   call checkox2
	   call checkox3
	   call checkox4
	   call checkox5
	   call showcomrs2
	   ret
;check for run on-off external relay............................................
checkox0:mov a,valuer0
	 cjne a,#0ah,checkfx0
	 clr p1.0
	 ret
checkfx0:cjne a,#0fh,checkox0
	 setb p1.0
	 ret
checkox1:mov a,valuer1
	 cjne a,#0ah,checkfx1
	 clr p1.1
	 ret
checkfx1:cjne a,#0fh,checkox1
	 setb p1.1
	 ret
checkox2:mov a,valuer2
	 cjne a,#0ah,checkfx2
	 clr p3.2
	 ret
checkfx2:cjne a,#0fh,checkox2
	 setb p3.2
	 ret
checkox3:mov a,valuer3
	 cjne a,#0ah,checkfx3
	 clr p3.3
	 ret
checkfx3:cjne a,#0fh,checkox3
	 setb p3.3
	 ret
checkox4:mov a,valuer4
	 cjne a,#0ah,checkfx4
	 clr p3.4
	 ret
checkfx4:cjne a,#0fh,checkox4
	 setb p3.4
	 ret
checkox5:mov a,valuer5
	 cjne a,#0ah,checkfx5
	 clr p3.5
	 ret
checkfx5:cjne a,#0fh,checkox5
	 setb p3.5
	 ret
;get status of Relay........................................................... 
gvaluer0:  call cin
	   cjne a,#'o',checkoffr0
	   mov valuer0,#0ah
	   call showon
	   ret
checkoffr0:cjne a,#'f',gvaluer0
	   mov valuer0,#0fh
           call showoff
	   ret
gvaluer1:  call cin
	   cjne a,#'o',checkoffr1
	   mov valuer1,#0ah
	   call showon
	   ret
checkoffr1:cjne a,#'f',gvaluer1
	   mov valuer1,#0fh
 	   call showoff
	   ret
gvaluer2:  call cin
	   cjne a,#'o',checkoffr2
	   mov valuer2,#0ah
	   call showon
	   ret
checkoffr2:cjne a,#'f',gvaluer2
	   mov valuer2,#0fh
	   call showoff
	   ret
gvaluer3:  call cin
	   cjne a,#'o',checkoffr3
	   mov valuer3,#0ah
	   call showon
	   ret
checkoffr3:cjne a,#'f',gvaluer3
	   mov valuer3,#0fh
	   call showoff
	   ret
gvaluer4:  call cin
	   cjne a,#'o',checkoffr4
	   mov valuer4,#0ah
	   call showon
	   ret
checkoffr4:cjne a,#'f',gvaluer4
	   mov valuer4,#0fh
	   call showoff
	   ret
gvaluer5:  call cin
	   cjne a,#'o',checkoffr5
	   mov valuer5,#0ah
	   call showon
	   ret
checkoffr5:cjne a,#'f',gvaluer5
	   mov valuer5,#0fh
	   call showoff
	   ret
;get value of Timer............................................................
gvaluet0:  call gvaluet
	   mov valuet0,r7
	   call newline
	   ret
gvaluet1:  call gvaluet
	   mov valuet1,r7
	   call newline
	   ret
gvaluet2:  call gvaluet
	   mov valuet2,r7
	   call newline
	   ret
gvaluet3:  call gvaluet
	   mov valuet3,r7
	   call newline
	   ret
gvaluet4:  call gvaluet
	   mov valuet4,r7
	   call newline
	   ret
gvaluet5:  call gvaluet
	   mov valuet5,r7
	   call newline
	   ret
;my  funtion....................................................................
gvaluet:   call gdecimal
	   mov a,r6
	   add a,r7
	   xch a,r7
	   ret
gdecimal:  call cin
	   cjne a,#30h,check1
	   call phex1
	   mov r7,#00d
	   jmp gdecimal2
check1:    cjne a,#31h,check2
	   call phex1
	   mov r7,#10d
	   jmp gdecimal2
check2:    cjne a,#32h,check3
	   call phex1
	   mov r7,#20d
	   jmp gdecimal2
check3:    cjne a,#33h,check4
	   call phex1
	   mov r7,#30d
	   jmp gdecimal2
check4:    cjne a,#34h,check5
	   call phex1
	   mov r7,#40d
           	jmp gdecimal2
check5:    cjne a,#35h,check6
	   call phex1
	   mov r7,#50d
           	jmp gdecimal2
check6:    cjne a,#36h,check7
	   call phex1
	   mov r7,#60d
           	jmp gdecimal2
check7:    cjne a,#37h,check8
	   call phex1
	   mov r7,#70d
           	jmp gdecimal2
check8:    cjne a,#38h,check9
	   call phex1
	   mov r7,#80d
           	jmp gdecimal2
check9:    cjne a,#39h,gdecimal
           	call phex1
	   mov r7,#90d
           	jmp gdecimal2
gdecimal2: call cin
	   cjne a,#30h,check01
           	call phex1
	   mov r6,#0d
	   ret
check01:   cjne a,#31h,check02
	   call phex1
	   mov r6,#1d
	   ret
check02:   cjne a,#32h,check03
	   call phex1
	   mov r6,#2d
	   ret
check03:   cjne a,#33h,check04
	   call phex1
	   mov r6,#3d
	   ret
check04:   cjne a,#34h,check05
	   call phex1
	   mov r6,#4d
	   ret
check05:   cjne a,#35h,check06
	   call phex1
	   mov r6,#5d
	   ret
check06:   cjne a,#36h,check07
	   call phex1
	   mov r6,#6d
	   ret
check07:   cjne a,#37h,check08
	   call phex1
	   mov r6,#7d
	   ret
check08:   cjne a,#38h,check09
	   call phex1
	   mov r6,#8d
	   ret
check09:   cjne a,#39h,gdecimal2
           	call phex1
	   mov r6,#9d
	   ret
showmain:  call showname
	   call showcreate
	   call showdepartment
	   call showkmitl
	   call showcommain
	   ret
showhelp:  call showhel
	   call showrwtmode
	   call showrsmode
	   call showtimebase
	   call showkeyon
	   call showkeyoff
	   call showcomhelp
	   ret
timebasei: orl tmod,#01
	   mov th0,#4ch
	   mov tl0,#00h
	   setb tr0
loopt1i:   mov r5,#14h
loopt0i:   jnb tf0,$
	   clr tf0
	   mov th0,#4ch
	   mov tl0,00h
	   call checkkeych
           djnz r5,loopt0i
           djnz r4,loopt1i
	   call clrrelayi
           ret
timebasex: orl tmod,#01
	   mov th0,#4ch
	   mov tl0,#00h
	   setb tr0
loopt1x:   mov r5,#14h
loopt0x:   jnb tf0,$
	   clr tf0
	   mov th0,#4ch
	   mov tl0,00h
	   call checkkeyxch
           	djnz r5,loopt0x
           	djnz r4,loopt1x
	   call clrrelayx
          	 ret
timebase1: orl tmod,#01
	   mov th0,#4ch
	   mov tl0,#00h
	   setb tr0
loopt11:   mov r5,#14h
loopt01:   jnb tf0,$
	   clr tf0
	   mov th0,#4ch
	   mov tl0,00h
           	djnz r5,loopt01
           	djnz r4,loopt11
          	 ret
clrrelayi: setb p1.2
	   setb p1.3
	   setb p1.4
	   setb p1.5
	   setb p1.6
	   setb p1.7
	   ret
clrrelayx: setb p1.0
	   setb p1.1
	   setb p3.2
	   setb p3.3
	   setb p3.4
	   setb p3.5
	   ret
internal:  call newline
	   call showinternal
	   call newline 
	   call showcomabh
checkabhia:call cin
	   cjne a,#'a',checkabhib
	   call clrrelayi
           	jmp rwt 
checkabhib:cjne a,#'b',checkabhih
           	jmp rs
checkabhih:cjne a,#'h',checkabhia	   
           	jmp help
external:  call newline
	   call showexternal
	   call newline
	   call showcomabh
checkabhxa:call cin
	   cjne a,#'a',checkabhxb
	   call clrrelayx
           	jmp xrwt 
checkabhxb:cjne a,#'b',checkabhxh
           	jmp xrs
checkabhxh:cjne a,#'h',checkabhxa	   
           	jmp help
checkkeych:jnb ri,nokeych
           	clr ri
           	mov a,sbuf
	   cjne a,#'c',checkkeyh
	   call clrrelayi
	   jmp rwt
checkkeyh: cjne a,#'h',nokeych
	   call clrrelayi
	   jmp help
nokeych:   ret
checkkeyxch:jnb ri,nokeyxdh
            	clr ri
            	mov a,sbuf
	    cjne a,#'c',checkkeyxh
	    call clrrelayx
	    jmp xrwt
checkkeyxh: cjne a,#'h',nokeyxdh
	    call clrrelayx
	    jmp help
nokeyxdh:   ret
showpcrdisplay:call showl1
	       call showl2
	       call showl3
	       call showl4
	       call showl5
	       call showl6
	       call showl7
	       call showl8
	       call showl9
	       call showl10
	       call showl11
	       ret
clrpcrdisplay: call showi1
	       call showi2
	       call showi3
	       call showi4
	       call showi5
	       call showi6
	       call showi7
	       call showi8
	       call showi9
	       call showi10
	       call showi11
	       ret
spaceline:     mov r2,#50
loopclrpcr:    call newline
	       djnz r2,loopclrpcr
	       ret
;showword.......................................................................
showname:  mov dptr,#name
	   call pstr
	   ret
showcreate:mov dptr,#create
	   call pstr
	   ret
showdepartment:mov dptr,#department
	       call pstr
	       ret
showkmitl:   mov dptr,#kmitl
	     call pstr
	     ret
showcommain:mov dptr,#commain
	    call pstr
	    ret
showcomhelp:mov dptr,#comhelp
	    call pstr
	    ret
showcomrwt1: mov dptr,#comrwt1	
	     call pstr
	     ret
showcomrwt2: mov dptr,#comrwt2
	     call pstr
	     ret
showcomrs1:  mov dptr,#comrs1
	     call pstr
	     ret
showcomrs2:  mov dptr,#comrs2
	     call pstr
	     ret
showrunning: mov dptr,#running
	     call pstr
	     ret
shownewrwt:  mov dptr,#newrwt
	     call pstr
	     ret
shownewrs:   mov dptr,#newrs
	     call pstr
	     ret
showhel:     mov dptr,#hel
	     call pstr
	     ret
showrwtmode: mov dptr,#rwtmode
	     call pstr
	     ret
showrsmode:  mov dptr,#rsmode
	     call pstr
	     ret
showtimebase:mov dptr,#timeba
	     call pstr
	     ret
showkeyon:   mov dptr,#keyo
	     call pstr
	     ret
showkeyoff:  mov dptr,#keyf
	     call pstr
	     ret
showrelay0:  mov dptr,#relay0
	     call pstr
	     ret
showrelay1:  mov dptr,#relay1
	     call pstr
	     ret
showrelay2:  mov dptr,#relay2
	     call pstr
	     ret
showrelay3:  mov dptr,#relay3
	     call pstr
	     ret
showrelay4:  mov dptr,#relay4
	     call pstr
	     ret
showrelay5:  mov dptr,#relay5
	     call pstr
	     ret
showon:      mov dptr,#on
	     call pstr
	     ret
showoff:     mov dptr,#off
	     call pstr
	     ret
showtimer:   mov dptr,#timer
	     call pstr
	     ret
showinternal:mov dptr,#inter
	     call pstr
	     ret
showexternal:mov dptr,#exter
	     call pstr
	     ret
showcomabh:  mov dptr,#comabh
	     call pstr
	     ret
name:      db ' Programmable Control Relay',10,13,0
create:    db ' Created and Develop by Ch.Boonyarit',10,13,0
department:db ' Applied Physics Department',10,13,0
kmitl:     db ' King Mongkut s Institute of Technology Ladkrabang',10,13,0
commain:   db ' press i for Internal Relay,press x for External Relay,press h for help',10,13,0
comabh:    db ' press a for RWT mode,press b for RS mode,press h for help',10,13,0
comhelp:   db ' press m for main,press i for Internal Relay,press x for External Relay',10,13,0
comrwt1:   db ' press r for run,press b for RS mode,press h for help',10,13,0
comrwt2:   db ' press c for stop and new program,press h for help',10,13,0
comrs1:    db ' press r for run,press a for RWT mode,press h for help',10,13,0
comrs2:    db ' press s for new program,press h for help',10,13,0
running:   db ' running program',10,13,0
newrwt:    db 'New Program RWT mode',10,13,0
newrs:     db 'New program RS mode',10,13,0
hel:       db ' Help Programmable Control Relay',10,13,0
rwtmode:   db ' RWT = Relay with Timer Mode',10,13,0
rsmode:    db ' RS = Relay Switch Mode',10,13,0
timeba:    db ' Timebase = one second',10,13,0
keyo:      db ' key o = Relay ON',10,13,0
keyf:      db ' key f = Relay OFF',10,13,0
relay0:    db ' Relay 0 ',0
relay1:    db ' Relay 1 ',0
relay2:    db ' Relay 2 ',0
relay3:    db ' Relay 3 ',0
relay4:    db ' Relay 4 ',0
relay5:    db ' Relay 5 ',0
on:        db 'ON',10,13,0
off:       db 'OFF',10,13,0
timer:     db ' Timer (00-99) ',0
inter:     db ' Internal Relay ',0
exter:     db ' External Relay ',0
l1:        db '			       00000000       0000     00000000 ',10,13,0                                                                                         
l2:        db '			       00     00    00    00   00     00',10,13,0                                                               
l3:        db '			       00     00   00      00  00     00',10,13,0                                                                          
l4:        db '			       00     00  00           00     00',10,13,0                                                                      
l5:        db '			       00000000   00           00000000 ',10,13,0                                                                            
l6:        db '			       00         00           00 00    ',10,13,0                                                                       
l7:        db '			       00          00      00  00  00   ',10,13,0                                                                           
l8:        db '			       00           00    00   00   00  ',10,13,0                                                                              
l9:        db '			       00             0000     00    00 ',10,13,0
l10:       db '					                        ',10,13,0
l11:       db '				 Programmable  Control  Relay   ',10,13,0

i1:        db '			      					',10,13,0                                                                                         
i2:        db '			       					',10,13,0                                                               
i3:        db '			       					',10,13,0                                                                          
i4:        db '			       					',10,13,0                                                                      
i5:        db '			       					',10,13,0                                                                            
i6:        db '			       					',10,13,0                                                                       
i7:        db '			        				',10,13,0                                                                           
i8:        db '			     	  				',10,13,0                                                                              
i9:        db '			       					',10,13,0
i10:       db '					                        ',10,13,0
i11:       db '				 				',10,13,0

showl1:    mov dptr,#l1
	   call pstr
	   ret
showl2:    mov dptr,#l2
	   call pstr
	   ret   
showl3:    mov dptr,#l3
	   call pstr
	   ret   
showl4:    mov dptr,#l4
	   call pstr
	   ret   
showl5:    mov dptr,#l5
	   call pstr
	   ret   
showl6:    mov dptr,#l6
	   call pstr
	   ret   
showl7:    mov dptr,#l7
	   call pstr
	   ret   
showl8:    mov dptr,#l8
	   call pstr
	   ret   
showl9:    mov dptr,#l9
	   call pstr
	   ret   
showl10:   mov dptr,#l10
	   call pstr
	   ret   
showl11:   mov dptr,#l11
	   call pstr
	   ret   
showi1:    mov dptr,#i1
	   call pstr
	   ret
showi2:    mov dptr,#i2
	   call pstr
	   ret   
showi3:    mov dptr,#i3
	   call pstr
	   ret   
showi4:    mov dptr,#i4
	   call pstr
	   ret   
showi5:    mov dptr,#i5
	   call pstr
	   ret   
showi6:    mov dptr,#i6
	   call pstr
	   ret   
showi7:    mov dptr,#i7
	   call pstr
	   ret   
showi8:    mov dptr,#i8
	   call pstr
	   ret   
showi9:    mov dptr,#i9
	   call pstr
	   ret   
showi10:   mov dptr,#i10
	   call pstr
	   ret   
showi11:   mov dptr,#i11
	   call pstr
	   ret   
;special  funtion................................................................
newline: mov a,#10
	 call cout
	 mov a,#13
	 call cout
	 ret
cin:    jnb ri,$
        clr ri
        mov a,sbuf
        ret
cout:   jnb ti,$
	clr ti
	mov sbuf,a
	ret
pstr:   clr a
	movc a,@a+dptr
	cjne a,#0,pstr1
	ret
pstr1: 	call cout         
 	inc dptr
	jmp pstr
phex1:  push    acc
        anl     a,#15
        add     a,#246
        jnc     phex_c
        add     a,#7
phex_c: add     a,#58
        acall   cout
        pop     acc
	ret
init_serial: mov scon,#50h
             orl tmod,#20h
             mov th1,#0fdh
             setb tr1
             setb ti
             ret
end
